6
我正在研究一个项目,我们正在使用DLR将球拍语言移植到.NET。静态链接和编译运行时w/compiletoMethod()表达式树
我们建立一个表达式树,并调用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.exe
和Runtime_rkt.dll
放在同一个目录中时,一切正常。我们遇到的问题是我们(显然)将运行时库移到其他地方。最终我们想要像IronPython那样在C:\Windows\Microsoft.NET\assembly\GAC_MSIL
中安装它。 [使用GAC解决]
附加pts的新问题有什么办法可以将所有运行时方法静态编译到可执行文件中吗?
我认为,如果[将其正确添加到GAC](http://msdn.microsoft.com/zh-cn/library/dkkx7f79)(不只是将其复制到目录中),它应该可以正常工作。 – svick
祝你好运。但表达式通常会产生相当糟糕的代码:(如果我必须再次执行IronScheme,我会使用CCI而不是DLR。 – leppie
@leppie这不是我想听到的:(。我们切换到CCI有点晚了如果我们决定重新做这个,那么谢谢你的信息。 –