
Friedrich
07.10.2017
07:49:26
У нас есть System.Reflection.Module.

Nikolay
07.10.2017
07:50:40

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 вот тут парень меняет в рантайме ИЛ код с помощью этого байт массива.
если это еще актуально

Evgeniy
07.10.2017
09:01:42

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

Evgeniy
07.10.2017
09:16:35

Nikolay
07.10.2017
09:20:44

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.
Дальше пока не полезу, решил обсудить с коллегами. Я опасаюсь, что мы решаем не основную проблему.

Nikolay
07.10.2017
09:25:41

Friedrich
07.10.2017
09:26:09
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 непонятно как проработаны получаются.
Юзеры будут копипастить код и менять его. И хрен потом обновишь. Ад, сотона.

Evgeniy
07.10.2017
09:33:37

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

Evgeniy
07.10.2017
09:33:53

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

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

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

Nikolay
07.10.2017
09:34:59

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

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

Google

Friedrich
07.10.2017
09:36:16

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

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

Nikolay
07.10.2017
09:39:03

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

Evgeniy
07.10.2017
09:43:32

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

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