嵌入式和安装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,我的程序将失败,并显示以下错误:

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.
}
上一篇:使用IronPython控制C#Winforms GUI


下一篇:C#和IronPython集成