将ILMerge与IronPython结合使用

本文关键字:结合 IronPython ILMerge | 更新日期: 2023-09-27 18:20:55

我在将IronPython.dll、IronPython.Modules.dll、Microsoft.Dynamic.dll、Microsoft.Scripting.dll和Microsoft.Scripting.Metadata.dll合并到我的应用程序中时遇到问题。

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

MissingMemberException:"'NullImporter'对象没有属性'find_module'"

这是通过省略ILMerge的/internate参数来解决的。IronPython似乎需要某些类型是公共的才能发挥作用。

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

ImportException:"没有名为clr的模块"

这两种情况下的异常都是为我的脚本的第一行抛出的,当然这只是一个"import-clr"。

将ILMerge与IronPython结合使用

遗憾的是,在ILMerge之后工作时,像IronPython这样的动态运行时似乎是最不合作的。

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

  1. 将您所依赖的所有第三方程序集嵌入到应用程序的资源中
  2. 使用AppDomain.CurrentDomain.AssemblyResolve事件注册ResolveEventHandler
  3. 当使用存储在参考资料中的程序集调用处理程序时,请加载该程序集

您按如下方式完成第3部分:

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

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

更新:刚刚发现Jeffrey Richter的一篇博客文章,详细介绍了这种方法。