【问题标题】:Embedded and installed IronPython - dll versions confusion嵌入式和安装 IronPython - dll 版本混乱
【发布时间】:2013-12-30 03:34:36
【问题描述】:

我有一个嵌入 IronPython 并使用它来执行用户编写的脚本的应用程序。当只安装我的应用程序时,一切都按预期工作。我已经嵌入 IronPython 2.7.4 dll(我的 exe 和 IronPython dll 安装后在同一个文件夹中)。

但是,在某些客户端计算机上安装了 IronPython 2.7.2。它将其 dll 安装到 GAC 中,我的应用程序最终使用它们,而不是我随应用程序和应用程序一起提供的 dll。这会导致我的应用程序失败,因为我使用了 2.7.2 中不可用的属性。

问题是 .NET 出于某种原因将这些程序集视为具有相同版本 (2.7.0.40)。如下图所示/文件版本不同:

右一个是我的应用程序附带的一个,左一个是 IronPython 2.7.2 附带的一个。我没有向 GAC 注册任何内容,但这是在 GAC 中注册的内容(IronPython 安装添加了它):

C:\ $ gacutil /l | findstr IronPython
  IronPython, Version=2.7.0.40, Culture=neutral, PublicKeyToken=7f709c5b713576e1, processorArchitecture=MSIL
  IronPython.Modules, Version=2.7.0.40, Culture=neutral, PublicKeyToken=7f709c5b713576e1, processorArchitecture=MSIL

如您所见,它们已注册为 2.7.0.40 版本。

我的问题是 - 如何强制我的应用程序使用 IronPython 程序集的 2.7.4.1000 版本,而不是在 GAC 中注册的 2.7.2.1001?为什么 .NET 忽略版本号的第三部分,可以更改吗?

编辑

如果它很重要,安装 IronPython 2.7.2 后,我的程序将失败并出现以下错误:

未处理的异常:System.MissingMethodException:找不到方法:'Boolean IronPython.Hosting.PythonConsoleOptions.get_BasicConsole()'。

【问题讨论】:

  • IronPython (3.0) 的未来版本还将包括未签名的程序集,以包含在可避免此问题的应用程序中。
  • 感谢评论,我期待 IronPython 3.0。

标签: c# .net dll ironpython


【解决方案1】:

问题是,IronPython 2.7.2 和 IronPython 2.7.4 具有相同的程序集版本号,正如您所报告的那样,2.7.0.40

因此,鉴于此,您的问题显然是 GAC 中有一个版本的 IronPython.dll 程序集,以及一个具有相同版本号的本地版本。根据that answer,没有办法加载本地版本而不是GAC版本。

鉴于这种情况,我可以想到两种可能性:

  1. 使用新版本号重新编译(或后处理和重新签名)IronPython.dll 程序集,并使用程序集重定向,以便将对常规 IronPython.dll 程序集的请求重定向到您的本地程序集;
  2. 启动您的应用程序时,请检查 IronPython 版本,如果您检测到 IronPython 版本不合适,请让您的消费者将他们的安装更新到 IronPython 2.7.4。例如:

    string ironPythonFileVersion = ((AssemblyFileVersionAttribute)typeof(IronPython).Assembly.GetCustomAttributes(typeof(AssemblyFileVersionAttribute), false)[0]).Version;
    if (ironPythonFileVersion == "2.7.2.1001") {
        // IronPython 2.7.2 was loaded. Deal as appropriate.
    }
    

【讨论】:

  • 强制客户升级 IronPython 不是一种选择,但其他建议解决了我的问题。我使用 ILMerge 将 IronPython 的程序集版本更改为 2.9.9.9。我不相信它会在 v2 分支中达到那个版本号,所以我应该是安全的。当以该版本为目标时,安装旧版本的 IronPython 时没有问题。
  • 原来 2.9.9.9 不适合我,因为 PyCharm 正在检查程序集版本,它不知道如何处理 pyhton 2.9。将版本更改为 2.7.32768.32768 就可以了(以防万一其他人需要它)。
【解决方案2】:

我建议调查Redirecting Assembly Versions。你会在你的 app.config 中做这样的事情:

<dependentAssembly>
   <assemblyIdentity name="IronPython"
     publicKeyToken="TOKEN"
     culture="en-us" />
   <!-- Assembly versions can be redirected in app, 
     publisher policy, or machine configuration files. -->
   <bindingRedirect oldVersion="2.7.2.1001" newVersion="2.7.4.1000" />
   <publisherPolicy apply="no" />
</dependentAssembly>

这里的关键是添加publisherPolicy 元素。看来 IronPython 有一个 publisher policy 导致您的问题,所以您应该尝试 overriding 它。

【讨论】:

  • 此解决方案不起作用,因为2.7.2.10012.7.4.1000 版本号是使用AssemblyFileVersion 属性指定的版本号,而不是AssemblyVersion 属性。
  • @JeanHominal 你说得对,我在初次阅读时错过了那个细节。
猜你喜欢
  • 2012-06-02
  • 1970-01-01
  • 2020-05-21
  • 1970-01-01
  • 2012-09-14
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多