将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这样的动态运行时似乎是最不合作的。
您可能会考虑像LINQPad这样的单个exe项目所做的一些程序集嵌入技巧。
- 将您所依赖的所有第三方程序集嵌入到应用程序的资源中
- 使用
AppDomain.CurrentDomain.AssemblyResolve
事件注册ResolveEventHandler
- 当使用存储在参考资料中的程序集调用处理程序时,请加载该程序集
您按如下方式完成第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的一篇博客文章,详细介绍了这种方法。