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

42

我正在迁移一个用 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这样的名称当然可以解决问题,但我们被要求不这样做,以便使客户端代码更容易迁移。

在另一个命名空间中编写一个类的包装器是否可以接受? - Goblin
如果我能在同一个测试代码中运行两个,那么它可能是可以接受的。这只会是一个用于测试目的的包装器。 - pgb
为了使客户端代码更易于迁移,我理解你被“管理”的痛苦。(◔_◔) ;^D - ruffin
4个回答

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

6
我同意Quartermeister的观点。下面提供更多参考资料: http://blogs.msdn.com/b/ansonh/archive/2006/09/27/774692.aspx - Kari
3
@Kari,您的链接已损坏。 - Ivan Kochurkin

4

4
我看到了这个问题和答案,它帮了我很多。然而,对于那些需要更详细解释的人,我发现一个非常有用的链接

从链接中摘录出以下内容:

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

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

步骤2:在计划引用它的第一个语句中使用以下代码

extern alias oldVer;
extern alias newVer;

现在使用:

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

希望这能帮到您。

0

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

使用两个单独的进程然后比较结果输出可能会更容易...


1
你不能直接卸载一个程序集,只能卸载一个AppDomain。为了做到这一点,你需要一个带有该程序集的单独的appdomain。 - Reed Copsey
好的,必须关闭AppDomain才能卸载程序集,我会编辑回复。 - Shea

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接