【问题标题】:c# Use dll with different versions in one directoryc#在一个目录下使用不同版本的dll
【发布时间】:2014-12-07 19:26:04
【问题描述】:

如何在一个目录中使用同名的不同dll(其他版本)? 例如,LibA (ExternalLib.dll) 的版本为 1,而 LibB (ExternalLib.dll) 的版本为 2。

我将我所有的程序部署到同一个目录(这是我们公司的标准,我无法改变这个事实)。问题是如果使用 LibB 的 ProgramB 部署在 ProgramA 使用 LibA 的目录中,那么 ProgrammA 将不再工作。

对于我自己的库,如果有很大的变化,我会使用主版本号(.01、.02)。但是我使用的 Lib 是一个外部 Lib,它的每个版本都需要不同的许可密钥(由程序本身处理)。

我试图将外部库从“ExternalLib.dll”重命名为“ExternalLib.v1.dll”和“ExternalLib.v2.dll”,但是当我运行我新编译的程序时,它会抛出一个异常“ExternalLib.dll”。找不到dll”。我项目中的引用设置为“ExternalLib.v1.dll”,编译工作正常。

对于处理同一目录中的不同程序集版本有什么想法/建议吗?

【问题讨论】:

标签: c# .net visual-studio dll assemblies


【解决方案1】:

不幸的是,DLL 文件的文件名与 .Net 加载这些类型的方式几乎没有关系。作为编译过程的一部分,实际名称被写入程序集的元数据中。因此,在运行时,它将探测ExternalLib.dll,无论您将文件重命名为什么。解决此问题的常用方法是安装到 GAC 并使用强命名来引用特定版本。

鉴于您可能无法做到这一点,您可以尝试以下 4 件事:

  1. 请供应商为您生成特定于版本的 DLL。他们可以编译使得版本名称是文件名的一部分并包含在程序集清单中。这将是您最简单的解决方案。

  2. 处理AssemblyResolve 事件并手动尝试使用Assembly.Load 指向您想要的文件,以便您可以具体指定要使用的dll。有关更多信息,请参阅http://support.microsoft.com/kb/837908,但实际上您将使用Assembly.LoadFrom(specific_path) 来选择要从中加载代码的文件。

  3. 如果可能,您还可以使用 ildasm.exe 将 dll 反编译为中间语言 (IL),然后使用 ilasm.exe 将其重新编译为新的 dll 名称。然后,您将在项目中引用这个新的 DLL 名称。

  4. 如果程序集没有签名,那么您可以自己编辑清单;您可以使用兼容的二进制编辑器,也可以使用MT.exe

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-03-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多