c# - 嵌入式和安装的 IronPython - dll 版本困惑

标签 c# .net dll ironpython

我的应用程序嵌入了 IronPython 并使用它来执行用户编写的脚本。当只安装我的应用程序时,一切都按预期工作。我嵌入了 IronPython 2.7.4 dll(安装后我的 exe 和 IronPython dll 位于同一文件夹中)。

但是,在某些客户端计算机上安装了 IronPython 2.7.2。它将其 dll 安装到 GAC 中,我的应用程序最终使用它们,而不是我随应用程序和应用程序一起提供的 dll。这导致我的应用程序失败,因为我使用的属性在 2.7.2 中不可用。

问题是 .NET 出于某种原因将这些程序集视为具有相同的版本 (2.7.0.40)。如下图所示/文件版本不同: enter image description here

右边的是我的应用程序附带的,左边的是 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 版本。

鉴于这种情况,我可以想到两种可能性:

  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.
    }
    

关于c# - 嵌入式和安装的 IronPython - dll 版本困惑,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20827632/

相关文章:

c# - 在 C# WPF 应用程序中使用外部 C++ DLL

c++ - 从 MATLAB 调用 C++ .dll 库

C# 相当于 VB6 中的 ccDebug

c# - LINQ合并多个列表

.net - 使用 SpeechSynthesizer 使用 SpeechAudioFormatInfo 流式传输 TTS

.net - WPF:如何使用嵌套(分层)控件实现拖放

c++ - 链接器未解析的外部符号 - 在 dll 中找不到函数

c# - ReSharper 可以使用关键字进行声明但使用类型名称进行成员访问吗?

c# - 在 C# 中构建 XML-RPC Web 服务

.net - 如何在 .NET Core 2 中打开 project.json