将ILMerge与IronPython一起使用

时间:2012-01-21 17:59:21

标签: c# ironpython ilmerge

我无法将IronPython.dll,IronPython.Modules.dll,Microsoft.Dynamic.dll,Microsoft.Scripting.dll和Microsoft.Scripting.Metadata.dll合并到我的应用程序中。

我在尝试执行python脚本时遇到的第一个错误是:

  

MissingMemberException:“'NullImporter'对象没有属性'find_module'”

通过省略ILMerge的/ internalize参数解决了这个问题。似乎IronPython需要某些类型才能公开才能运行。

但它没有多大帮助,现在我得到了:

  

ImportException:“没有名为clr的模块”

我的脚本的第一行抛出了两种情况下的异常,当然这只是一个“import clr”。

1 个答案:

答案 0 :(得分:2)

可悲的是,在ILMerge之后工作时,像IronPython这样极其动态的运行时似乎是最不合情合理的。

你可能会考虑做一些像LINQPad那样的单一exe项目的程序集嵌入技巧。

  1. 将您依赖的所有第三方程序集嵌入到应用程序的资源中。
  2. AppDomain.CurrentDomain.AssemblyResolve活动中注册ResolveEventHandler
  3. 使用您在Resources中存储的程序集调用处理程序时,请加载程序集。
  4. 您按照以下方式执行第3部分:

    var resourceStream = Assembly.GetExecutingAssembly().GetManifestResourceStream(name);
    return Assembly.Load(new BinaryReader(resourceStream).ReadBytes(int.MaxValue));
    

    如果您需要更多帮助,可以在LINQPad.exe中查看并查看LinqPad.Program.AddLINQPadAssemblyResolver()LinqPad.Program.FindAssem()

    更新:刚刚找到a blog post by Jeffrey Richter,提供了有关此方法的更多详细信息。