如何在一个目录中使用具有相同名称的不同dll' s(其他版本)? 例如,LibA(ExternalLib.dll)具有版本1,而LibB(ExternalLib.dll)具有版本2.
我将所有程序部署到同一目录(这是我们公司的标准,但我无法改变这一事实)。问题是如果使用LibB的ProgramB部署在ProgramA使用LibA的目录中,那么ProgrammA将不再有效。
对于我自己的Libs,如果有很大的变化,我会使用Major-Version-Number(.01,。02)。但是我使用的Lib是一个外部Lib,它的每个版本都需要不同的许可密钥(由程序本身处理)。
我尝试从" ExternalLib.dll"重命名外部库。 to" ExternalLib.v1.dll"和#34; ExternalLib.v2.dll",但是当我运行我的新编译的程序时,它会抛出一个异常,说明找不到"无法找到ExternalLib.dll"。我项目中的引用设置为" ExternalLib.v1.dll"和编译工作正常。
在同一目录中处理不同程序集版本的任何想法/建议?
答案 0 :(得分:4)
不幸的是,DLL文件的文件名与.Net加载这些类型的方式几乎没有关系。实际名称作为编译过程的一部分写入程序集的元数据中。因此,在运行时,无论您将文件重命名为什么,它都将探测ExternalLib.dll
。解决此问题的常用方法是安装到GAC并使用强命名来引用特定版本。
鉴于您可能无法做到这一点,您可以尝试以下4件事:
要求供应商为您生成特定于版本的DLL。他们可以编译使得版本名称是文件名的一部分并包含在程序集清单中。这对您来说是最简单的解决方案。
处理AssemblyResolve事件并手动尝试使用Assembly.Load指向您想要的文件,以便您可以具体指定要使用的dll。有关详细信息,请参阅http://support.microsoft.com/kb/837908,但实际上您将使用Assembly.LoadFrom(specific_path)
选择要加载代码的文件。
如果可能,您也可以使用ildasm.exe将dll反编译为中间语言(IL),然后使用ilasm.exe将其重新编译为新的dll名称。然后,您将在项目中引用此新DLL名称。
如果程序集未签名,那么您可以自己编辑清单;您可以使用兼容的二进制编辑器,也可以使用MT.exe。