两个程序集中具有相同名称的类(故意)

时间:2010-06-10 20:52:07

标签: c# namespaces class

我正在迁移一个用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当然可以正常工作,但我们被要求不要这样做,以便更容易迁移客户端代码。

4 个答案:

答案 0 :(得分:58)

您可以使用extern alias引用来自不同程序集的具有相同完全限定名称的类型。选择对LibraryCS的引用并将属性页面中的别名从“global”更新为“LibraryCS”,并将extern alias LibraryCS;添加到源文件的顶部,然后您可以使用LibraryCS::MyNamespace.MyClass来引用LibraryCS中的类。您可以使用MyNamespace.MyClassglobal::MyNamespace.MyClass来引用LibWrapper中的类,也可以使用该引用的别名。

答案 1 :(得分:4)

为了在同一个可执行文件中加载这两个类,您可以将它们加载到单独的Application Domain中。这将允许您测试组件,然后完全卸载它并加载第二个并测试它。

有关如何执行此操作的详细信息,请参阅How to: Load Assemblies into an Application DomainUnload an Application Domain

答案 2 :(得分:3)

看到这个问题和答案,它帮助了我。对于那些需要详细解释的人,我发现link非常有用。

从链接中提取。

在一个应用程序中使用相同dll的不同版本

第1步:使用 VS IDE 。在客户端应用程序解决方案中添加对这两个dll的引用。然后在引用节点下的Solution Explorer中选择第一个(旧版本)类库。在属性窗口中,将“别名”字段从全局更改为 oldVer 。对于N ewer版本 newVer

第2步:使用以下代码作为您计划引用它的第一个语句

extern alias oldVer;
extern alias newVer;

现在使用,

Console.WriteLine(oldVer::MyLibrary.MyClass.method());
Console.WriteLine(newVer::MyLibrary.MyClass.method());

希望这有帮助。

答案 3 :(得分:0)

您可以在运行时加载第一个程序集,然后使用反射来实例化它并执行它的方法。然后卸载该程序集,加载第二个程序集并使用反射创建它并运行其方法。

使用2个独立的流程然后比较结果输出可能更容易......