在两个程序集中具有相同名称的类(故意)
Posted
技术标签:
【中文标题】在两个程序集中具有相同名称的类(故意)【英文标题】:Class with same name in two assemblies (intentionally) 【发布时间】:2011-03-02 09:32:25 【问题描述】:我正在迁移一个用 C++ 编写并具有 C# 包装器的库。 C# 包装器 (LibWrapper
) 有一组带有命名空间的类,例如:
namespace MyNamespace
class MyClass
class MyOtherClass
我的新库 LibraryCS
包含与 LibWrapper
相同的命名空间和类名(根据用户要求),所以我也有:
namespace MyNamespace
class MyClass
class MyOtherClass
现在迁移已经完成,我正在创建一个测试来比较使用这两个库的结果,以验证迁移。但是,当我尝试引用 MyNamespace.MyClass
时,我收到一个编译器错误(预期!),显示“MyNamespace.MyClass 在 LibWrapper 和 LibraryCS 中都定义了”。
有什么技巧可以解决这个问题,让我可以在同一个客户端代码中使用两个具有完全相同名称但来自不同程序集的类?
或者,还有其他方法可以测试吗?
将迁移的命名空间重命名为 MyNamespace2
之类的名称当然可以,但我们被要求不要这样做,以使客户端代码更易于迁移。
【问题讨论】:
是否可以为另一个命名空间中存在的类之一编写包装器? 如果我能够在相同的测试代码中同时运行两者,那可能是可以接受的。它将是一个仅用于测试目的的包装器。 "为了让客户端代码更容易迁移" 我感受到你被“管理”的痛苦。 (◔_◔) ;^D 【参考方案1】:您可以使用extern alias 来引用来自不同程序集的具有相同完全限定名称的类型。选择对LibraryCS的引用并在属性页中将Aliases从“global”更新为“LibraryCS”,并在源文件顶部添加extern alias LibraryCS;
,然后就可以使用LibraryCS::MyNamespace.MyClass
引用LibraryCS中的类了。您可以使用MyNamespace.MyClass
或global::MyNamespace.MyClass
来引用LibWrapper 中的类,或者您也可以为该引用使用别名。
【讨论】:
我同意 Quartermeister 的观点。更多参考请见下文:blogs.msdn.com/b/ansonh/archive/2006/09/27/774692.aspx @Kari 你的链接坏了。【参考方案2】:为了将这两个类加载到同一个可执行文件中,您可以将它们加载到单独的应用程序域中。这可以让您测试程序集,然后完全卸载它并加载第二个程序集并对其进行测试。
有关如何执行此操作的详细信息,请参阅 How to: Load Assemblies into an Application Domain 和 Unload an Application Domain。
【讨论】:
【参考方案3】:看到这个问题和答案,它帮助了我。但是对于那些需要详细解释的人来说,我找到了一个link,这真的很有用。
从链接中提取。
在一个应用程序中使用同一个 dll 的不同版本
第 1 步:使用 VS IDE。在您的客户端应用程序解决方案中添加对这两个 dll 的引用。然后在引用节点下的解决方案资源管理器中选择第一个(旧版本)类库。在属性窗口中,将 Aliases 字段从 global 更改为 oldVer。 lly,newVer 用于 N较新版本。
第 2 步:使用以下代码作为您计划引用它的第一个语句
extern alias oldVer;
extern alias newVer;
现在可以使用了,
Console.WriteLine(oldVer::MyLibrary.MyClass.method());
Console.WriteLine(newVer::MyLibrary.MyClass.method());
希望这会有所帮助。
【讨论】:
【参考方案4】:您可以在运行时加载第一个程序集,然后使用反射来实例化它并执行它的方法。然后卸载该程序集,加载第二个程序集并使用反射创建它并运行它的方法。
使用 2 个单独的进程然后比较结果输出可能会更容易...
【讨论】:
不能直接卸载程序集,只能卸载 AppDomain。为此,您需要一个带有该程序集的单独 appdomain。 好电话,必须关闭 AppDomain 才能卸载程序集,我将编辑响应。以上是关于在两个程序集中具有相同名称的类(故意)的主要内容,如果未能解决你的问题,请参考以下文章
EF4 Poco 问题映射类型相同的名称相同的程序集不同的命名空间
参考 Assemblies 文件夹和具有相同版本的不同程序集