Статически связывать и компилировать 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 ответ

  1. После того, как вы поместили библиотеку времени выполнения в GAC, все должно работать, не так ли? Почему бы тебе не сделать это прямо сейчас?
  2. Попробуйте сами объяснить, как встроенный исполняемый файл будет находить библиотеку времени выполнения
  3. Заглянуть в ILMerge
  4. Посмотрите на новую собственную сборку сборок.net, которую MS выпускает в этом году. Он рекламируется не только для компиляции в нативный код, но и для включения в exe-файл всех библиотек и самого CLR.
  5. Вы всегда можете подписаться на событие AppDomain.AssemblyResolve. Очевидно, вам придется скомпилировать эту подписку в ваш сгенерированный исполняемый файл.
  6. Вы можете настроить папки, где CLR ищет DLL в файле конфигурации.
Другие вопросы по тегам