Статически связывать и компилировать Runtime с деревом выражений compiletoMethod()
Я работаю над проектом, в котором мы переносим Racket Language на.NET, используя DLR.
Мы строим дерево выражений и вызываем CompileToMethod()
Метод:
Соответствующий исполняемый код эмиссии: (взято из Как сохранить дерево выражений в качестве главной точки входа в новый исполняемый дисковый файл?)
//Wrap the program into a block expression
Expression code = Expression.Block(new ParameterExpression[] { env, voidSingleton}, program);
var asmName = new AssemblyName("Foo");
var asmBuilder = AssemblyBuilder.DefineDynamicAssembly(asmName, AssemblyBuilderAccess.RunAndSave);
var moduleBuilder = asmBuilder.DefineDynamicModule("Foo", "Foo.exe");
var typeBuilder = moduleBuilder.DefineType("Program", TypeAttributes.Public);
var methodBuilder = typeBuilder.DefineMethod("Main",
MethodAttributes.Static, typeof(void), new[] { typeof(string) });
Expression.Lambda<Action>(code).CompileToMethod(methodBuilder);
typeBuilder.CreateType();
asmBuilder.SetEntryPoint(methodBuilder);
asmBuilder.Save("Foo.exe");
у нас есть библиотека времени выполнения Runtime_rkt.dll
который содержит соответствующие преобразования типов во время выполнения, вспомогательные объекты и т. д.
Когда мы размещаем Foo.exe
а также Runtime_rkt.dll
в том же каталоге все работает нормально. Проблема, с которой мы сталкиваемся, заключается в том, что мы (очевидно) перемещаем библиотеку времени выполнения в другое место. В конечном итоге мы захотим установить его в C:\Windows\Microsoft.NET\assembly\GAC_MSIL
как делает IronPython. [Решено с помощью GAC]
[edit] Новый вопрос для Extra pts Есть ли какой-нибудь способ, которым мы можем статически скомпилировать все методы времени выполнения в исполняемый файл?
1 ответ
- После того, как вы поместили библиотеку времени выполнения в GAC, все должно работать, не так ли? Почему бы тебе не сделать это прямо сейчас?
- Попробуйте сами объяснить, как встроенный исполняемый файл будет находить библиотеку времени выполнения
- Заглянуть в ILMerge
- Посмотрите на новую собственную сборку сборок.net, которую MS выпускает в этом году. Он рекламируется не только для компиляции в нативный код, но и для включения в exe-файл всех библиотек и самого CLR.
- Вы всегда можете подписаться на событие AppDomain.AssemblyResolve. Очевидно, вам придется скомпилировать эту подписку в ваш сгенерированный исполняемый файл.
- Вы можете настроить папки, где CLR ищет DLL в файле конфигурации.