静态链接和编译运行时使用/ compiletoMethod()表达式树



我正在做一个项目,我们正在使用DLR将球拍语言移植到。net。

我们构建一个表达式树并调用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.exeRuntime_rkt.dll放在同一个目录中时,一切都工作正常。我们遇到的问题是,当我们(显然)将运行时库移动到其他地方时。最终,我们希望像IronPython一样将其安装在C:WindowsMicrosoft.NETassemblyGAC_MSIL中。[使用GAC解决]

[edit]是否有办法将所有运行时方法静态编译为可执行文件?

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

相关内容

  • 没有找到相关文章

最新更新