C# 在两个程序集中使用相同名称初始化(有意) 我正在迁移一个C++编写的库,并有一个C包装器。C包装器LibWrapper有一组具有名称空间的类,如: namespace MyNamespace class MyClass class MyOtherClass

C# 在两个程序集中使用相同名称初始化(有意) 我正在迁移一个C++编写的库,并有一个C包装器。C包装器LibWrapper有一组具有名称空间的类,如: namespace MyNamespace class MyClass class MyOtherClass,c#,namespaces,class,C#,Namespaces,Class,根据用户要求,我的新库LibraryCS包含与LibWrapper相同的名称空间和类名,因此我还有: namespace MyNamespace class MyClass class MyOtherClass 现在迁移已经完成,我正在创建一个测试来比较使用这两个库的结果,以验证迁移。然而,当我尝试引用MyNamespace.MyClass时,我预期会出现一个编译器错误!也就是说,MyNamespace.MyClass是在LibWrapper和LibraryCS中定义的 在这个问题

根据用户要求,我的新库LibraryCS包含与LibWrapper相同的名称空间和类名,因此我还有:

namespace MyNamespace
   class MyClass
   class MyOtherClass
现在迁移已经完成,我正在创建一个测试来比较使用这两个库的结果,以验证迁移。然而,当我尝试引用MyNamespace.MyClass时,我预期会出现一个编译器错误!也就是说,MyNamespace.MyClass是在LibWrapper和LibraryCS中定义的

在这个问题上有没有什么技巧,可以让我在同一个客户机代码中使用两个名称完全相同但来自不同程序集的类

或者,是否有其他方法来测试这一点


将迁移的名称空间重命名为类似MyNamespace2的名称空间当然可以,但我们被要求不要这样做,以使客户端代码更易于迁移。

为了在同一个可执行文件中加载这两个类,您可以在单独的应用程序域中加载它们。这将允许您测试程序集,然后完全卸载它并加载第二个程序集并进行测试

有关如何执行此操作的详细信息,请参阅和。

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


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

您可以使用引用来自不同程序集的具有相同完全限定名的类型。在属性页中选择对LibraryCS的引用,将别名从全局更新为LibraryCS,并添加外部别名LibraryCS;,然后可以使用LibraryCS::MyNamespace.MyClass引用LibraryCS中的类。可以使用MyNamespace.MyClass或global::MyNamespace.MyClass引用LibWrapper中的类,也可以使用别名引用该类

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

从链接中提取

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

步骤1:使用VS IDE。在客户端应用程序解决方案中添加对两个DLL的引用。然后在参考节点下的解决方案资源管理器中选择第一个旧版本类库。在属性窗口中,将“别名”字段从“全局”更改为“旧版本”。lly,newVer用于更新的版本

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

extern alias oldVer;
extern alias newVer;
现在使用

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

希望这能有所帮助。

围绕另一个命名空间中存在的一个类编写包装器可以吗?如果我能够在同一测试代码中运行这两个类,这可能是可以接受的。它将是一个仅用于测试目的的包装器。为了使客户端代码更易于迁移,我感觉到了您被管理的痛苦。◔_◔ ;^DYou无法直接卸载程序集,只能卸载AppDomain。为了做到这一点,你需要一个单独的appdomain与该程序集。好的调用,将必须关闭appdomain以卸载该程序集,我将编辑响应。我同意Quartermeister。更多参考请参见下文:@Kari您的链接已断开。