
Evgeniy
07.10.2017
09:48:46
Я думаю, FSharp.Data писали до StarterPack.

Friedrich
07.10.2017
09:49:25

Evgeniy
07.10.2017
09:50:43

Google

Friedrich
07.10.2017
09:51:07
Ваши доказательства?
https://github.com/fsharp/FSharp.Data/blob/9d1fb58aa1dfc51e8b4649c7eb4c0f612b9bc559/src/FSharp.Data.DesignTime.fsproj#L57
Ребят, а, может, там проблемы деплоймента? Типа больше 1 DLL нельзя в тайп-провайдер добавлять, и из-за этого приходится весь код тащить с собой?
Ну хотя бы не сейчас, а раньше были, например.

Evgeniy
07.10.2017
09:57:55
https://github.com/fsprojects/FSharp.TypeProviders.SDK/pull/132

?
07.10.2017
09:58:29
sc

Friedrich
07.10.2017
10:05:03
Но всё же дождёмся ответа от остальных. Может быть, наша проблема тоже существует.

Nikolay
07.10.2017
10:10:08
@fvnever а ты пытался адаптировать на конкретном провайдере?
Или просто свою сборку сгенерировать

Friedrich
07.10.2017
10:28:56
Полноценная адаптация — это большая работа.
В смысле, надо будет написать хороший код для перевода массива инструкций из Mono.Reflection в Mono.Cecil.

Google

Nikolay
07.10.2017
10:29:40
Взять готовый провайдер и попробовать dnlib
Не?

Friedrich
07.10.2017
10:29:48
Что пробовать-то?

Nikolay
07.10.2017
10:30:06
Загрузить модуль и сохранить

Friedrich
07.10.2017
10:30:10
Начнём с того, что провайдер у тебя просто не скомпилируется под Core.

Nikolay
07.10.2017
10:30:22

Friedrich
07.10.2017
10:30:39
Потому что нет AssemblyBuilderAccess.Save

Nikolay
07.10.2017
10:30:56

Friedrich
07.10.2017
10:31:05
Во-вторых, dnlib вообще не подошёл — не умеет работать с reflection-only сборками. Я пробовал и получил исключение.

Nikolay
07.10.2017
10:31:05
Загружать туда модуль, а потом сохранять
Если это единственная проблема

Friedrich
07.10.2017
10:31:17
Ты видел сколько там кода?

Nikolay
07.10.2017
10:31:34

Friedrich
07.10.2017
10:31:45

Nikolay
07.10.2017
10:32:11

Friedrich
07.10.2017
10:32:20

Nikolay
07.10.2017
10:32:50
Что такое HINSTANCE?
Просто посмотреть, мб получится его починить

Google

Friedrich
07.10.2017
10:33:01
В душе не знаю :)
Какой-то хендл.
Не получится.
Оно хочет найти у DLL'ки хендл, который, видимо, генерируется в обычном дотнете (по крайней мере, для Save должен — я так думаю).
В коре хендл не генерируется.

Nikolay
07.10.2017
10:35:27
https://github.com/0xd4d/dnlib/issues/19
Это видел?

Friedrich
07.10.2017
10:36:07
Нет, не видел.

Nikolay
07.10.2017
10:36:46
Не уверен, что это нам поможет

Friedrich
07.10.2017
10:37:04
Кажись, это примерно то же, что Mono.Reflection. Поможет, но частично.

Nikolay
07.10.2017
10:37:24
Надо посмотреть апи, может туда надо ридер передать
И оно заработает

Evgeniy
07.10.2017
11:51:03
Посмотрите, о чем твитнул(а) @AntyaDev: https://twitter.com/AntyaDev/status/916302839974125568?s=09

Vasily
07.10.2017
12:00:36
Что такое HINSTANCE?
Виндовс специфичный объект-указатель на ресурс. Там скорее всего проблема в том , чтобы отвязать работу с длл от винапи

Friedrich
07.10.2017
12:01:11

Nikolay
07.10.2017
12:01:35
Код такой:
IntPtr addr = Marshal.GetHINSTANCE(mod);
if (addr == new IntPtr(-1))
throw new InvalidOperationException(string.Format("Module {0} has no HINSTANCE", mod));
В .Net Core компилируется, в .Net Standard 2 - нет

Friedrich
07.10.2017
12:02:01
Это скорее хак. Авторы dnlib заложились на тот факт, что рантайм генерирует настоящую DLL в памяти для тех случаев, когда ты говоришь AssemblyBuilderAccess.Save.
И они эту DLL из памяти вытаскивают и анализируют.

Nikolay
07.10.2017
12:02:27
@fvnever а если выпилить эту проверку?

Friedrich
07.10.2017
12:02:40
Дальше идёт работа с addr.

Google

Nikolay
07.10.2017
12:02:53
аа, вижу

Friedrich
07.10.2017
12:03:13
Я в первую очередь слазил в код и примерно посмотрел, что там как :)
В общем, эта тема просто под кором не будет работать. И под обычным дотнетом в аналогичном сценарии (AssemblyBuilderAccess.Run) тоже не работала.

Nikolay
07.10.2017
12:03:54
Странно, GetHINSTANCE есть в .Net Core
Но нет в .Net Standard

Friedrich
07.10.2017
12:04:29
Ничего странного же. Решили не публиковать настолько платформозависимую функцию в кроссплатформенном стандарте, молодцы.
А в коре решили всё равно реализовать ?

Nikolay
07.10.2017
12:05:03

Friedrich
07.10.2017
12:05:12
Зато, например, в Xamarin или UWP этой функции может не быть, и они всё равно останутся compliant.

Nikolay
07.10.2017
12:05:24
И там не заработает?

Friedrich
07.10.2017
12:05:59
Не заработает, конечно. А оно нам надо? Вроде бы нет.

Nikolay
07.10.2017
12:06:14
Чтобы генерировать сборку надо :)

Friedrich
07.10.2017
12:06:22
Не надо же.
У нас компилятор не хостится ни в каком Xamarin'е или UWP.

Nikolay
07.10.2017
12:07:21
А, точно. Оно только компилятору надо

Igor
07.10.2017
12:07:49

Nikolay
07.10.2017
12:15:26
https://github.com/fsprojects/FSharp.TypeProviders.SDK/blob/master/src/ProvidedTypes.fs#L2778
Я так понимаю это типа валидация, что сборка корректная?

Friedrich
07.10.2017
12:16:47
Хотя не нравится мне этот код.

Nikolay
07.10.2017
12:17:37
Комментируйте код, господа

Google

Friedrich
07.10.2017
12:17:42
Он же загружает сборку в контекст, и её больше никто не выгрузит.
Комментируйте код, господа
Как минимум такое вот нестандартное использование методов обязательно нужно комментировать!
// validate assembly correctness
А я попробую спросить в Slack.

Nikolay
07.10.2017
12:19:00
В каком канале?
Нашёл :)

Friedrich
07.10.2017
12:19:20
В который ты зашёл :)

Nikolay
07.10.2017
12:22:04
Похоже да, для проверки
А нет, ошибочка

Evgeniy
07.10.2017
14:37:38
Привет!

qupear
07.10.2017
14:39:15

Evgeniy
07.10.2017
14:39:47

Igor
07.10.2017
16:11:58
Народ, где можно почитать про монад-трансформеры для чайников?

Aleksey
07.10.2017
16:36:02
Примеры там в целом доходчивые, так что всяко стоит взглянуть

Igor
07.10.2017
16:39:13
Спасибо

Evgeniy
07.10.2017
17:39:19
@fvnever
https://github.com/fsprojects/FSharp.TypeProviders.SDK/pull/133