2014-03-18 45 views
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.exeRuntime_rkt.dll放在同一个目录中时,一切正常。我们遇到的问题是我们(显然)将运行时库移到其他地方。最终我们想要像IronPython那样在C:\Windows\Microsoft.NET\assembly\GAC_MSIL中安装它。 [使用GAC解决]

附加pts的新问题有什么办法可以将所有运行时方法静态编译到可执行文件中吗?

+1

我认为,如果[将其正确添加到GAC](http://msdn.microsoft.com/zh-cn/library/dkkx7f79)(不只是将其复制到目录中),它应该可以正常工作。 – svick

+2

祝你好运。但表达式通常会产生相当糟糕的代码:(如果我必须再次执行IronScheme,我会使用CCI而不是DLR。 – leppie

+0

@leppie这不是我想听到的:(。我们切换到CCI有点晚了如果我们决定重新做这个,那么谢谢你的信息。 –

回答

0
  1. 将运行时库放到GAC后,一切都应该起作用,不是吗?你为什么不现在就做?
  2. 尝试解释自己生成的可执行文件将如何找到运行时库同时
  3. 查找到ILMerge
  4. 查找到.NET程序集MS是今年推出的新的本地编译。它被广告不仅编译为本地代码,还包括所有库和CLR本身到exe文件中。
  5. 您可以随时订阅AppDomain.AssemblyResolve事件。显然,你必须将该订阅编译到你生成的exe文件中。
  6. 您可以配置CLR在配置文件中查找DLL的文件夹。