@Fsharp_chat

Страница 346 из 772
Friedrich
07.10.2017
07:49:26
У нас есть System.Reflection.Module.

Nikolay
07.10.2017
07:50:40
У нас есть System.Reflection.Module.
Типа загрузить, а потом сохранить?

Friedrich
07.10.2017
07:50:51
Ага.

Надо попробовать.

Google
Friedrich
07.10.2017
08:15:38
dnlib фейлится. Unhandled Exception: System.InvalidOperationException: Module RefEmit_InMemoryManifestModule has no HINSTANCE

Nikolay
07.10.2017
08:24:40
Friedrich
07.10.2017
08:26:00
- http://evain.net/blog/articles/2009/04/30/reflection-based-cil-reader/ → https://github.com/jbevain/mono.reflection/tree/master/Mono.Reflection Это также представляет интерес.

Я щас упёрся в то, что нет нормального способа получить IL-код в виде набора инструкций. Есть MethodInfo.GetMethodBody().GetILAsByteArray(), но непонятно, что с этим массивом дальше делать.

Roman
07.10.2017
08:37:58
А что вообще значит IL as byte array?

что именно там в байты сериализуют?

Friedrich
07.10.2017
08:38:57
Кто б его знал!

Ну, инструкции байткода — это понятно. А вот что оно делает со ссылками на таблицы метаданных — непонятно.

Щас тыкаю Mono.Reflection.

В общем, господа, на Mono.Reflection + Mono.Cecil у меня чото начало получаться.

Я пойду разговаривать с 7sharp9.

Наверное, напишу вопросы в ишуе. Там ещё matthid что-то бросался запиливать.

Google
Roman
07.10.2017
08:50:35
https://habrahabr.ru/post/154419/ @fvnever вот тут парень меняет в рантайме ИЛ код с помощью этого байт массива.

если это еще актуально

Friedrich
07.10.2017
09:11:20
https://github.com/Microsoft/visualfsharp/issues/2406#issuecomment-334921721

Friedrich
07.10.2017
09:20:59
Что начало получаться? :)
Я распечатал байткод сгенерированного метода.

Как минимум его можно теперь взять и засунуть в ilasm.exe.

Конвертировать его в Mono.Cecil мне лениво, но это как минимум возможно.

Nikolay
07.10.2017
09:22:26
Я распечатал байткод сгенерированного метода.
Ну, я не думаю, что это сильно нам поможет

Friedrich
07.10.2017
09:22:38
Ну, вообще-то это ядро решения.

Nikolay
07.10.2017
09:22:53
Но нам же не только методы нужны

Friedrich
07.10.2017
09:23:05
А всё остальное у нас и так есть.

Ну, типы, неймспейсы, модули — это всё получается из Assembly естественным путём.

Единственное, что получается неестественным путём — это тела методов. Но для них есть Mono.Reflection.

Nikolay
07.10.2017
09:24:28
Но нужно раскурить, как всё это дело собрать в сборку

Friedrich
07.10.2017
09:24:29
Дальше мы можем регенерировать сборку с помощью Mono.Cecil и делать с ней что хотим — сохранять на диск, в память, куда угодно.

Nikolay
07.10.2017
09:24:32
Сгенерировать метаданные

Friedrich
07.10.2017
09:24:47
Там всё есть.

Nikolay
07.10.2017
09:24:58
Ооокей

Google
Friedrich
07.10.2017
09:25:10
Я начал писать сниппет для регенерации, подготовил уже типы и заголовки методов, но встрял на этом GetILAsByteArray.

Дальше пока не полезу, решил обсудить с коллегами. Я опасаюсь, что мы решаем не основную проблему.

Friedrich
07.10.2017
09:26:09
Не можешь понять, как IL получить?
https://gist.github.com/ForNeVeR/3229afd6bb98fd4defd97e877a3f9bc2

Console.WriteLine(instruction); щас выводит IL в формате, в котором его хавает ilasm. То есть, в общем, с этим разобрался.

Nikolay
07.10.2017
09:27:11
А зачем var ilAsByteArray = ...?

Friedrich
07.10.2017
09:27:32
Это останки предыдущих экспериментов, не нужно :)

Nikolay
07.10.2017
09:29:52
Mono.Reflection нам правда нужен?

Friedrich
07.10.2017
09:30:38
Это самый простой способ получить байткод.

Другого я не знаю, если честно :)

Ну то есть именно байткод в виде набора инструкций

Nikolay
07.10.2017
09:31:01
И я бы один момент ещё хотел пересмотреть

Friedrich
07.10.2017
09:31:05
Со ссылками на типы, методы и пр.

Nikolay
07.10.2017
09:31:29
Копипаста ProvidedTypes.fs в каждый провайдер

Это не ок

Friedrich
07.10.2017
09:31:43
Это предмет для другого разговора.

Кстати, мы уверены, что это обязательная копипаста?

Я поискал такой файл в FSharp.Data и не нашёл.

Nikolay
07.10.2017
09:32:05
Нет

Поэтому нужно эту тему тоже пересмотреть

Google
Nikolay
07.10.2017
09:32:39
Возможно мы сможем избавиться от этого, и включить в отдельный пакет

Который можно будет обновлять

Friedrich
07.10.2017
09:32:53
Ну, я и правда считаю что это отдельный ишуй, и его надо в отдельном тикете обсуждать. Если копипаста обязательна, то мне это не нравится.

Evgeniy
07.10.2017
09:33:03
Это не ок
Почему?

Friedrich
07.10.2017
09:33:20
Почему?
Потому что сценарии обновления SDK непонятно как проработаны получаются.

Юзеры будут копипастить код и менять его. И хрен потом обновишь. Ад, сотона.

Nikolay
07.10.2017
09:33:39
Почему?
Изменение в этом файле потребует изменения в каждом провайдере. Это не ок

Friedrich
07.10.2017
09:34:16
Для этого пакетный менеджер есть.
Чёт не припомню, чтоб пакетный менеджер засовывал мне fs-файлы в проекты.

Paket так умеет?

И мы будем поддерживать только его? Пойди, скажи об этом Дону :)

Evgeniy
07.10.2017
09:34:43
Уже есть такой пакет.

Friedrich
07.10.2017
09:34:48
А как он работает?

Friedrich
07.10.2017
09:35:01
Там DLL или что?

Nikolay
07.10.2017
09:35:03
Думаю другие файлы тоже

Evgeniy
07.10.2017
09:35:35
https://www.nuget.org/packages/FSharp.TypeProviders.StarterPack

Там DLL или что?
Добавляет файлы в проект.

Nikolay
07.10.2017
09:36:14
А зачем тогда пишут в туториалах типа добавляйте файл сами?

Google
Friedrich
07.10.2017
09:36:16
https://www.nuget.org/packages/FSharp.TypeProviders.StarterPack
Это устарело! https://github.com/fsprojects/FSharp.TypeProviders.SDK/commit/40bfff9149c9237c0a61bda3e6ed597ece743264

Nikolay
07.10.2017
09:36:34
И вообще, @gsomix , зачем нам нужно файл добавлять?

Friedrich
07.10.2017
09:36:48
Предполагается, что тайппровайдер собирается в разных позах под всякие PCL-конфигурации, и это управляется дефайнами в коде провайдера.

Дон думает о том, как бы это всё выкинуть.

Nikolay
07.10.2017
09:39:03
Предполагается, что тайппровайдер собирается в разных позах под всякие PCL-конфигурации, и это управляется дефайнами в коде провайдера.
Но ведь FSharp.Data тоже собирается для разных конфигураций, и при этом его не нужно в проект включать

Friedrich
07.10.2017
09:40:27
Ага, ты намекаешь на то, что можно просто опубликовать в одном пакете кучку бинарников под все платформы.

Это звучит как приличный пропозал.

Изначально так не стали делать, может, потому, что тогдашний нугет в это не умел (или вообще нугета не было).

Nikolay
07.10.2017
09:44:09
Правда они вроде хотели его распилить?

Friedrich
07.10.2017
09:45:29
Распилить — это тоже другой вопрос. Одно другому не мешает.

Страница 346 из 772