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

时间:2014-03-18 22:55:32

标签: c# delegates runtime expression-trees dynamic-assemblies

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

我们建立一个表达式树并调用CompileToMethod()方法:

相关的可执行发射代码:(取自How to Save an Expression Tree as the Main Entry Point to a New Executable Disk File?

//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.exeRuntime_rkt.dll放在同一目录中时,一切正常。我们遇到的问题是当我们(显然)将运行时库移动到其他位置时。最终,我们希望像IronPython一样在C:\Windows\Microsoft.NET\assembly\GAC_MSIL安装它。 [使用GAC解决]

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

1 个答案:

答案 0 :(得分:0)

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