静态链接和编译Runtime w/compiletoMethod()表达式树

Sco*_*uer 6 c# delegates runtime expression-trees dynamic-assemblies

我正在开发一个项目,我们正在使用DLR将Racket语言移植到.NET.

我们构建一个表达式树并调用CompileToMethod()Method:

相关的可执行发射代码:(取自如何将表达式树保存为新的可执行磁盘文件的主要入口点?)

//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");
Run Code Online (Sandbox Code Playgroud)

我们有我们的运行时库Runtime_rkt.dll,它包含相关的运行时类型转换,后备对象等.

当我们将Foo.exeRuntime_rkt.dll在同一目录下,一切工作正常.我们遇到的问题是当我们(显然)将运行时库移动到其他地方时.最终我们想要C:\Windows\Microsoft.NET\assembly\GAC_MSIL像IronPython一样安装它.[使用GAC解决]

[编辑]额外的新问题有没有办法我们可以将所有运行时方法静态编译成可执行文件?

Ily*_*lin 0

  1. 将运行时库放入 GAC 后,一切都应该可以正常工作,不是吗?你为什么不现在就做呢?
  2. 尝试解释一下构建的可执行文件将如何同时找到运行时库
  3. 查看 ILMerge
  4. 了解 MS 今年推出的新的 .net 程序集本机编译。据称它不仅可以编译为本机代码,还可以将所有库和 CLR 本身包含到 exe 文件中。
  5. 您始终可以订阅 AppDomain.AssemblyResolve 事件。显然,您必须将该订阅编译到生成的 exe 文件中。
  6. 您可以配置 CLR 在配置文件中查找 DLL 的文件夹。