Deutsch
Germany.ruФорумы → Архив Досок→ Программирование

Загрузить "байткод"?​ (тяпничное)

1448  1 2 3 4 все
Murr патриот25.10.19 10:19
Murr
25.10.19 10:19 

Загрузить "байткод"? (тяпничное)


Очередная задачка на предмет пошевелить мозгами. Решение - не обязательно, но желательны наметки как можно сделать...


Начну с аналога - с Жабы,

В Жабе есть (была 15-20 лет назад) возможность:

- взять Жабий класс (код)

- компилировать его в байт-код

- переслать байт-код на другую систему

- инстанцировать объект из полученного кода

- работать с объектом


Хочется чего-то аналогичного:

- взять C# класс (код)

- компилировать, но не в ДЛЛку, а в какой-то фрагмент класс-кода

- записать фрагмент в базу (блоб)

- по необходимости - доставать из базы, инстaнцировать объект и работать с ним.


Понятное дело - грузить можно/нужно в отдельные области, но это не тот вопрос который интересует...


Есть какие мысли об возможности слепить такое?

#1 
NightWatch коренной житель25.10.19 11:23
NightWatch
Murr патриот25.10.19 14:19
Murr
NEW 25.10.19 14:19 
в ответ NightWatch 25.10.19 11:23

Это построитель исходного текста класса.

Пользуюсь, когда нельзя по-другому, но вижу кучу проблем в этой каке.


В прошлом году пытался отделить схему генерации класса по Т4 шаблону от анализа исходного текста шаблона...

Проблема была... хммм... если правильно помню... с < # @ output extension=".cs" # >

мне нужно было значение ехтентион в посткомпилированном классе...

Бляяя, какой же там бардак... это значение пихается в сессию Студии. И ни откуда, кроме как из сессии, его не получить...

Почти отделил анализ от генерации, а потом навалилась текучка... так и болтается неоконченным...


Но меня интересует не это, а как скомпилять C#-код в байт-код, но не оформлять его в ДЛЛку, а передать и использовать как есть...

#3 
AlexNek патриот25.10.19 14:37
AlexNek
NEW 25.10.19 14:37 
в ответ Murr 25.10.19 10:19
Murr патриот25.10.19 14:55
Murr
NEW 25.10.19 14:55 
в ответ Murr 25.10.19 14:19

Аааа.... вторую часть Я не смотрел...

Надо заменитель

provider.CompileAssemblyFrom()

на

provider.CompileBytecodeFrom()

хаха

#5 
Murr патриот25.10.19 15:09
Murr
NEW 25.10.19 15:09 
в ответ AlexNek 25.10.19 14:37

Нее, не то...


Какие извращения?

Ну не хочется писать дллку на клиенте.

Хочется взять byte[] и инстанцировать из него объект.

При этом знать что именно бuдет в араее - не хоТТся...


Ну не должен клиент видеть этот код... вообще... в процессе работы - подгрузился по сетке, отработал и дропнулся... никаких темповых сборок...


Мне, правда, нужен для другого - сложная и часто изменяемая выборка из большого числа подобных кусков.

Кусок - в базе, кучка кода обсчитывает какой из них нужен. Делать 100К мелких дллок? там антивирус помрет на их заменах...


#6 
schizo старожил25.10.19 15:11
schizo
NEW 25.10.19 15:11 
в ответ Murr 25.10.19 10:19

serialization это называется


https://docs.microsoft.com/en-us/dotnet/csharp/programming...

Храни Вас Г-дь!
#7 
AlexNek патриот25.10.19 15:19
AlexNek
NEW 25.10.19 15:19 
в ответ Murr 25.10.19 15:09
Какие извращения?

самые нормальные котовые извращения бебе


Может лучше питон подцепить или что еще?

#8 
NightWatch коренной житель25.10.19 15:35
NightWatch
NEW 25.10.19 15:35 
в ответ Murr 25.10.19 14:19
как скомпилять C#-код в байт-код, но не оформлять его в ДЛЛку

Это не реально. Метаданные, необходимые для CLR, находятся в сборке. В "байт-код" (который (MS)IL) можно скомпилировать только тело метода. И кому нужно тело метода без метаданных?..

#9 
AlexNek патриот25.10.19 15:50
AlexNek
NightWatch коренной житель25.10.19 16:31
NightWatch
NEW 25.10.19 16:31 
в ответ Murr 25.10.19 15:09, Последний раз изменено 25.10.19 16:32 (NightWatch)
Делать 100К мелких дллок? там антивирус помрет на их заменах...

Так не делай. Динамические сборки не нужно сохранять на диске перед загрузкой в CLR.

#11 
Murr патриот25.10.19 18:02
Murr
NEW 25.10.19 18:02 
в ответ schizo 25.10.19 15:11

А как выглядит десериализация на клиенте, при условии что обьект на клиенте не известен?

Вопрос как раз в том, как передать на клиента исполняемый код объекта и инстнацировать объект.

#12 
Murr патриот25.10.19 18:04
Murr
NEW 25.10.19 18:04 
в ответ NightWatch 25.10.19 16:31

Динамические сборки не нужно сохранять на диске перед загрузкой в CLR.

-----

Tогда все помрет на компиляции...

#13 
Murr патриот25.10.19 18:05
Murr
NEW 25.10.19 18:05 
в ответ AlexNek 25.10.19 15:50

Да, но это построение и загрузка дллки/модуля.

Меня же интересует - без их построения...

#14 
AlexNek патриот25.10.19 18:08
AlexNek
NEW 25.10.19 18:08 
в ответ Murr 25.10.19 18:05, Последний раз изменено 25.10.19 18:29 (AlexNek)
Меня же интересует - без их построения...

Ищите батенька, ищите спок

Не обязательно даже длл-ку на диск записывать

https://www.codeproject.com/Tips/715891/Compiling-Csharp-C...

https://josephwoodward.co.uk/2016/12/in-memory-c-sharp-com...

#15 
NightWatch коренной житель25.10.19 19:30
NightWatch
NEW 25.10.19 19:30 
в ответ Murr 25.10.19 18:04
Tогда все помрет на компиляции...

Наверное, в этой фразе есть некий, скрытый от меня, смысл...

#16 
daduda местный житель25.10.19 19:56
NEW 25.10.19 19:56 
в ответ Murr 25.10.19 10:19

у вас в постановке задачи ошибка


переслать байт-код на другую систему

- инстанцировать объект из полученного кода


Интанцировать обьект из кода невозможно.

#17 
dymanoid местный житель25.10.19 21:48
dymanoid
NEW 25.10.19 21:48 
в ответ Murr 25.10.19 10:19

IL код зависит от целевого фреймворка. Код, скомпиленный под .NET Core 3.0, не заведётся на .NET Framework 4.0, к примеру.

Есть гарантия идентичности среды исполнения на клиенте и на сервере? Это первое.


Второе, как тут уже заметили, IL код без метаданных можно выкинуть на помойку. Так что без создания сборки не обойтись.

Динамическую сборку можно передать как блоб и подгрузить в AppDomain в целевом процессе, но вот что с этим добром дальше делать, должен решать код в процессе, который грузит сборку. Если тот код ничего о сборке не знает вообще, то увы, потому что:


подгрузился по сетке, отработал и дропнулся... никаких темповых сборок...

- это просто троян. Именно поэтому в .NET нету "авторана" для сборок или блобов IL-кода, чтобы вот такие кулхацкеры деятели как ты не уронили полмира.

#18 
Murr патриот26.10.19 09:13
Murr
NEW 26.10.19 09:13 
в ответ AlexNek 25.10.19 18:08, Последний раз изменено 26.10.19 09:39 (Murr)

parameters.GenerateInMemory = true;

------

Об этом варианте не знал.

Но это не меняет ситуации - требуется пересылать исходник туда, где он будет компилироваться... в ДЛЛку/сборку.

Интересует - пересылка готового кода. Но не дллки. Про то, что можно переслать дллку как массив байт и сделать из нее ассемблю - Я знаю.


Задница - // True - exe file generation, false - dll file generation

Модуль они так и не научились компилять...

Надо посмотреть насколько он избыточен - может и сгодится...

#19 
Murr патриот26.10.19 09:14
Murr
NEW 26.10.19 09:14 
в ответ NightWatch 25.10.19 19:30

Ты просто не обратил внимания на количество требуемых компиляций.

#20 
1 2 3 4 все