我正在开发一个项目,我们使用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.exe
和Runtime_rkt.dll
放在同一目录中时,一切正常。我们遇到的问题是当我们(显然)将运行时库移动到其他位置时。最终,我们希望像IronPython一样在C:\Windows\Microsoft.NET\assembly\GAC_MSIL
安装它。 [使用GAC解决]
[edit]额外的新问题有没有什么办法可以将所有运行时方法静态编译成可执行文件?
答案 0 :(得分:0)