【发布时间】:2015-09-22 17:43:03
【问题描述】:
如果我有一个应用程序(App)引用了一个库(Lib1),而该库本身又引用了另一个库(Lib2),那么当应用程序引用 Lib1 时,它也会复制 Lib2 dll 并正常工作。
如果我还将对 App 的另一个引用添加到另一个不同的库,但名称与 Lib2 (Lib2bis) 相同,则 Lib1 将尝试使用 Lib2bis 中的类型而不是 Lib2(因为我相信 Lib2 文件会被覆盖由 Lib2bis 文件(命名相同)。
由于 App 对 Lib2 的引用是间接的,所以在执行之前我不会知道 Lib2bis 与 Lib2 冲突,这会导致运行时错误。
有什么方法可以防止/解决这个问题(除了重命名库...)(理想情况下,不使用别名,但如果有的话,我也有兴趣知道别名解决方案)。
【问题讨论】:
-
您必须重命名库 DLL。但是如果两个程序集使用相同的命名空间和类名,但代表不同的类,它根本就行不通。
-
@MatthewWatson - 两个独立的程序集可以声明具有相同完全限定名称的类型(对于某些“fine”值)。这就是
extern alias旨在帮助解决的问题。 -
@Damien_The_Unbeliever 是的,但如果程序集具有相同的 DLL 名称,则不是?所以他必须重命名它并使用
extern alias。 -
给你的 dll 起一个更好的名字来避免这种情况。
-
您并不总是可以选择;您可能正在为其中一个程序集使用名称,并且引用可能是来自外部公司的程序集,或者您可能有同一程序集的两个版本,因此重命名并不总是解决方案。