嵌入并安装了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版本。
鉴于这种情况,我可以想到两种可能性:
- 使用新版本号重新编译(或后处理并重新签名)
IronPython.dll
程序集,并使用程序集重定向,以便将对常规IronPython.dll
程序集的请求重定向到本地程序集; -
启动应用程序时,请检查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似乎有一个导致您出现问题的发布者策略 ,因此您应该尝试覆盖它。