我有嵌入了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,我的程序将失败,并显示以下错误:
Unhandled Exception: System.MissingMethodException: Method not found: ‘Boolean IronPython.Hosting.PythonConsoleOptions.get_BasicConsole()’.
解决方法:
问题是,IronPython 2.7.2和IronPython 2.7.4都具有相同的程序集版本号,正如您所报告的那样,该版本号是2.7.0.40.
因此,鉴于此,您的问题显然是,GAC中存在IronPython.dll程序集的一个版本,而本地版本具有相同的版本号.根据that answer,无法加载本地版本而不是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.
}