Компилация на CLR за генериране по време на изпълнение

Имам C# приложение, което генерира .NET функции по време на изпълнение и ги изпълнява. За да направи това, той генерира C# в низове и извиква онлайн C# компилатора, за да го преобразува в CLR, за да бъде JIT компилиран и изпълнен.

От съображения за производителност бих искал да мога да генерирам директно CLR (в низове или чрез вътрешно представяне) и да го изпълня, без да използвам компилатор (но може би JIT компилатора).

Това възможно ли е ? Виждал съм някои статии за инжектиране на код, но това не отговаря точно на сметката.

Благодаря ти !


person Antoine Trouve    schedule 30.09.2010    source източник
comment
Имате предвид генериране на CIL (известен още като IL)? Няма смисъл да говорим за генериране на CLR.   -  person Jon Skeet    schedule 30.09.2010
comment
Хъм, прав си, имах предвид CIL разбира се.   -  person Antoine Trouve    schedule 14.10.2010


Отговори (3)


Подозирам, че System.Reflection.Emit е това, което преследвате. По-специално, ако искате да генерирате само един метод, смятам, че трябва да погледнете Динамичен метод. Можете да го помолите да създаде ILGenerator, да изгради IL и след това той ще бъде JIT компилиран, когато преобразувате метода в делегат.

Не вярвам, че можете просто да му дадете текстов IL, но... вие ще използвате API, изрично изграждайки различни инструкции. Може да има IL анализатор, който използва това, но...

person Jon Skeet    schedule 30.09.2010
comment
Благодаря ви за отговора. Разгледах това име пространство и по-специално ILGenerator, което изглежда е това, което търсех. Ще го разгледам по-подробно, особено по отношение на скоростта. - person Antoine Trouve; 30.09.2010

Ако просто искате да създавате .Net функции, Дървета на изрази са начинът да отида. Ако искате да направите цял клас, можете да използвате Reflection.Emit , но след това пишете код за сглобяване.

Ако изчакате .Net 5, може би те ще имат версия на компилатора, към който можете да подадете произволен C# код, но засега може би можете да използвате нещо, което използва DLR (като IronPython), за да прехвърлите действителния изходен код.

person Gabe    schedule 30.09.2010
comment
Не знаех за изразните дървета; те са по-добри от CODEDOM, който използвах преди време. Но аз търсех решение на по-ниско ниво. - person Antoine Trouve; 30.09.2010

Може да не разбирам въпроса, но не бихте ли могли, вместо да генерирате C# код от вашето приложение, всъщност да генерирате еквивалентен междинен език (IL) код, който C# компилаторът така или иначе би генерирал? След това можете просто да стартирате IL кода директно, без да се налага първо да го компилирате.

person Joel Marcey    schedule 30.09.2010
comment
Прав си, така че въпросът ми беше как да го направя. Съжалявам, че не бях достатъчно ясен. - person Antoine Trouve; 30.09.2010