嵌入并安装了IronPython - dll版本混乱

时间:2013-12-29 16:52:30

标签: c# .net dll ironpython

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

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

问题是.NET出于某种原因认为这些程序集具有相同的版本(2.7.0.40)。如下图所示,文件版本不同: enter image description here

正确的一个是我随应用程序发货的那个,左边一个是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版。

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

修改

如果重要的是,安装了IronPython 2.7.2,程序将失败,并显示以下错误:

  

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

2 个答案:

答案 0 :(得分:3)

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

所以,鉴于此,您的问题显然是GAC中有IronPython.dll程序集的版本,以及具有相同版本号的本地版本。根据{{​​3}},无法加载本地版本而非GAC版本。

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

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

    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.
    }
    

答案 1 :(得分:0)

我建议调查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