【问题标题】:Using ILMerge with IronPython将 ILMerge 与 IronPython 一起使用
【发布时间】:2012-01-22 13:05:40
【问题描述】:

我无法将 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”。

【问题讨论】:

    标签: c# ironpython ilmerge


    【解决方案1】:

    遗憾的是,在 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()

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

    【讨论】:

    • 这似乎是这样做的方法。从您链接的博客文章的 cmets 中:“作为 ILMerge 的作者,我认为这太棒了!如果我知道这一点,我永远不会写 ILMerge。”
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2010-10-07
    • 1970-01-01
    • 2012-12-17
    • 2017-09-27
    • 1970-01-01
    • 1970-01-01
    • 2011-02-16
    相关资源
    最近更新 更多