我有嵌入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,程序将失败,并显示以下错误:
未处理的异常:System.MissingMethodException:找不到方法:'Boolean IronPython.Hosting.PythonConsoleOptions.get_BasicConsole()'。
答案 0 :(得分:3)
问题是,IronPython 2.7.2和IronPython 2.7.4具有相同的程序集版本号,正如您所报告的那样2.7.0.40
。
所以,鉴于此,您的问题显然是GAC中有IronPython.dll
程序集的版本,以及具有相同版本号的本地版本。根据{{3}},无法加载本地版本而非GAC版本。
鉴于这种情况,我可以想到两种可能性:
IronPython.dll
程序集,并使用程序集重定向,以便将对常规IronPython.dll
程序集的请求重定向到本地程序集; < / LI>
启动应用程序时,请检查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。