两个具有相同名称空间的不同的DLL

我有两个DLL文件,他们都有一个相同的命名空间,但他们有不同的function和types。 我怎样才能在我的项目中引用这两个DLL并使用它们的函数和types?

顺便一提。 这两个DLL有一些相同名称,不同实现的function和types,以及一些独特的function和types

没有什么特别的,你需要做的 – 只是引用他们,并使用types。 命名空间可以跨越几个程序集而没有问题,因为它们不是非常不透明的types。 命名空间只是向它包含的所有types添加公共前缀的一种方式,允许您在不同的命名空间下使用同一个名称的多个types。 (框架没有看到它们具有相同的名称,因为它看到了所有事物的“完全限定”名称 – 它的前面有一个别名和一个名称空间。)

在极less数情况下,您引用了两个具有相同types名称相同名称空间的程序集(例如同一个dll的两个不同版本) – 您可以使用别名区分哪个程序集要用于给定types。 所有引用的默认别名是global ,但是当引用它时(使用编译器开关 – 或者只是使用Visual Studio中的属性框),您可以为任何程序集指定自己的别名 – 并且在extern alias <name>具有extern alias <name>子句你使用它的代码文件的顶部 – 你可以使用<name>::MyNamespace.Type访问不同程序<name>::MyNamespace.Type

如果你有两个types完全相同的名字(注意这个名字包含名字空间),但是在不同的DLL中,你有兴趣使用它们,那么你可以这样做。

简答

你在两个不同的DLL中input了Acme.Foo ,你想使用它们。 在引用属性窗口(View | Properties Window)中给引用一个别名,然后像这样使用它:

 extern alias TheAliasYouGaveTheReference TheAliasYouGaveTheReference::Acme.Foo f = new TheAliasYouGaveTheReference::Acme.Foo(); 

默认的命名空间对于任何C#程序都是global ,但是请注意,上面我们使用的是我们创build的别名,而不是global

最好的办法是不要陷入这样的情况,如果这两个程序集都是你自己的,那么不要在完全相同的命名空间中创build2个完全相同的名称。 但有时我们不能控制源代码,所以以上的解决scheme都可以使用。

长答案

我从这里复制了大部分文章,所以在这里logging下来,以防文章不再可用。

你如何进入这样的情况?

首先,这里是你如何复制这个场景,所以我们真的很清楚我们在说什么:

  1. 创build一个名为FooVersion1的C#类库
  2. 将Class1.cs中的模板代码replace为以下内容:

     using System; namespace Acme { public class Foo { public void Bar() { Console.WriteLine("Bar"); } } } 
  3. 右键单击解决scheme资源pipe理器中的解决scheme,然后select添加| 新项目

  4. 保存当前项目(仅适用于快递)
  5. 在新项目对话框中select一个类库,并将项目名称更改为FooVersion2,然后按确定
  6. 将Class1.cs中的代码replace为以下内容:

     using System; namespace Acme { public class Foo { public void Bar() { Console.WriteLine("Bar"); } public void Goo() { Console.WriteLine("Goo"); } } } 

在应用程序中使用该types

好了,现在我们有两个不同的包含Acme.Foo程序集。 现在让我们创build一个控制台应用程序,并尝试使用每一个。

  1. 右键单击解决scheme资源pipe理器中的解决scheme,然后select添加| 新项目
  2. select一个控制台应用程序并称之为使用者
  3. 用鼠标右键单击消费者,然后select“设置为启动项目”
  4. 右键单击Consumer项目中的引用节点,然后select“添加引用”
  5. 单击项目选项卡,并多选FooVersion1和FooVersion2单击确定
  6. 将下面一行添加到Consumer项目的Programtypes的Main中:

     Acme.Foo f = new Acme.Foo(); 

通过Ctrl + Shift + B(或F6)构build解决scheme请注意,您会得到两个构build错误[如下所示]:

在这里输入图像描述

修正

以下是我们如何解决这个问题:

  1. 打开解决scheme资源pipe理器,并在Consumer项目的References文件夹中selectFooVersion1
  2. 按F4(或select查看|属性窗口)
  3. 将Aliases属性更改为FooVersion1
  4. build立解决scheme
  5. 现在一切都会正确地build立,因为Acme.Foo明确地指的是FooVersion2
  6. 将以下指令添加到Consumer项目中的Program.cs顶部:

     extern alias FooVersion1; 
  7. 将Acme.Foo的用法更改为:

     FooVersion1::Acme.Foo f = new FooVersion1::Acme.Foo(); f.Bar(); 
  8. 注意,当你input'f'时 完成列表只包含Acme.Foo的FooVersion1中的那些方法(特别是它不包括Goo)

  9. 构build解决scheme,一切都将正确构build
  10. 最后在Consumer项目的Program.cs中的f.Bar()下添加下面的代码:

     Acme.Foo f2 = new Acme.Foo(); f2.Goo(); 
  11. 注意f2的完成列表包含Goo。

  12. 再次使用Ctrl + Shift + B构build并注意,仍然没有生成错误

您可以使用/ reference(导入元数据)(C#编译器选项)编译器选项的别名function来解决您的问题,请阅读此处了解更多详细信息