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

我有一个嵌入了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版。

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

编辑

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

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

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

所以,鉴于此,您的问题显然是GAC中有一个版本的IronPython.dll程序集,以及一个版本号相同的本地版本。 根据该答案 ,无法加载本地版本而不是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. } 

我建议查看重定向程序集版本 。 你在app.config中做了类似的事情:

       

这里的关键是添加publisherPolicy元素。 IronPython似乎有一个导致您出现问题的发布者策略 ,因此您应该尝试覆盖它。