我正在做一个项目,我们正在使用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.exe
和Runtime_rkt.dll
放在同一个目录中时,一切都工作正常。我们遇到的问题是,当我们(显然)将运行时库移动到其他地方时。最终,我们希望像IronPython一样将其安装在C:WindowsMicrosoft.NETassemblyGAC_MSIL
中。[使用GAC解决]
[edit]是否有办法将所有运行时方法静态编译为可执行文件?
- 在你把运行时库放到GAC之后,一切都应该工作了,不是吗?你为什么不现在就做呢?
- 试着解释你自己构建的可执行文件是如何定位运行时库的
- 查看ILMerge
- 查看MS今年推出的。net程序集的新本地编译。它不仅可以编译成本机代码,还可以将所有库和CLR本身包含到exe文件中。
- 你可以订阅AppDomain。AssemblyResolve事件。显然,你必须将订阅编译到生成的exe文件中。
- 您可以在配置文件中配置CLR查找dll的文件夹。