Загрузить "байткод"? (тяпничное)
Загрузить "байткод"? (тяпничное)
Очередная задачка на предмет пошевелить мозгами. Решение - не обязательно, но желательны наметки как можно сделать...
Начну с аналога - с Жабы,
В Жабе есть (была 15-20 лет назад) возможность:
- взять Жабий класс (код)
- компилировать его в байт-код
- переслать байт-код на другую систему
- инстанцировать объект из полученного кода
- работать с объектом
Хочется чего-то аналогичного:
- взять C# класс (код)
- компилировать, но не в ДЛЛку, а в какой-то фрагмент класс-кода
- записать фрагмент в базу (блоб)
- по необходимости - доставать из базы, инстaнцировать объект и работать с ним.
Понятное дело - грузить можно/нужно в отдельные области, но это не тот вопрос который интересует...
Есть какие мысли об возможности слепить такое?
Это построитель исходного текста класса.
Пользуюсь, когда нельзя по-другому, но вижу кучу проблем в этой каке.
В прошлом году пытался отделить схему генерации класса по Т4 шаблону от анализа исходного текста шаблона...
Проблема была... хммм... если правильно помню... с < # @ output extension=".cs" # >
мне нужно было значение ехтентион в посткомпилированном классе...
Бляяя, какой же там бардак... это значение пихается в сессию Студии. И ни откуда, кроме как из сессии, его не получить...
Почти отделил анализ от генерации, а потом навалилась текучка... так и болтается неоконченным...
Но меня интересует не это, а как скомпилять C#-код в байт-код, но не оформлять его в ДЛЛку, а передать и использовать как есть...
https://stackoverflow.com/questions/6574858/convert-c-shar...
https://josephwoodward.co.uk/2017/01/c-sharp-il-viewer-vs-...
правда зачем такие извращения непонятно.
Нее, не то...
Какие извращения?
Ну не хочется писать дллку на клиенте.
Хочется взять byte[] и инстанцировать из него объект.
При этом знать что именно бuдет в араее - не хоТТся...
Ну не должен клиент видеть этот код... вообще... в процессе работы - подгрузился по сетке, отработал и дропнулся... никаких темповых сборок...
Мне, правда, нужен для другого - сложная и часто изменяемая выборка из большого числа подобных кусков.
Кусок - в базе, кучка кода обсчитывает какой из них нужен. Делать 100К мелких дллок? там антивирус помрет на их заменах...
serialization это называется
https://docs.microsoft.com/en-us/dotnet/csharp/programming...
Меня же интересует - без их построения...
Ищите батенька, ищите
Не обязательно даже длл-ку на диск записывать
https://www.codeproject.com/Tips/715891/Compiling-Csharp-C...
https://josephwoodward.co.uk/2016/12/in-memory-c-sharp-com...
IL код зависит от целевого фреймворка. Код, скомпиленный под .NET Core 3.0, не заведётся на .NET Framework 4.0, к примеру.
Есть гарантия идентичности среды исполнения на клиенте и на сервере? Это первое.
Второе, как тут уже заметили, IL код без метаданных можно выкинуть на помойку. Так что без создания сборки не обойтись.
Динамическую сборку можно передать как блоб и подгрузить в AppDomain в целевом процессе, но вот что с этим добром дальше делать, должен решать код в процессе, который грузит сборку. Если тот код ничего о сборке не знает вообще, то увы, потому что:
подгрузился по сетке, отработал и дропнулся... никаких темповых сборок...
- это просто троян. Именно поэтому в .NET нету "авторана" для сборок или блобов IL-кода, чтобы вот такие кулхацкеры
деятели как ты не уронили полмира.
parameters.GenerateInMemory = true;
------
Об этом варианте не знал.
Но это не меняет ситуации - требуется пересылать исходник туда, где он будет компилироваться... в ДЛЛку/сборку.
Интересует - пересылка готового кода. Но не дллки. Про то, что можно переслать дллку как массив байт и сделать из нее ассемблю - Я знаю.
Задница - // True - exe file generation, false - dll file generation
Модуль они так и не научились компилять...
Надо посмотреть насколько он избыточен - может и сгодится...