两个具有相同名称空间的不同的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下来,以防文章不再可用。
你如何进入这样的情况?
首先,这里是你如何复制这个场景,所以我们真的很清楚我们在说什么:
- 创build一个名为FooVersion1的C#类库
-
将Class1.cs中的模板代码replace为以下内容:
using System; namespace Acme { public class Foo { public void Bar() { Console.WriteLine("Bar"); } } }
-
右键单击解决scheme资源pipe理器中的解决scheme,然后select添加| 新项目
- 保存当前项目(仅适用于快递)
- 在新项目对话框中select一个类库,并将项目名称更改为FooVersion2,然后按确定
-
将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一个控制台应用程序,并尝试使用每一个。
- 右键单击解决scheme资源pipe理器中的解决scheme,然后select添加| 新项目
- select一个控制台应用程序并称之为使用者
- 用鼠标右键单击消费者,然后select“设置为启动项目”
- 右键单击Consumer项目中的引用节点,然后select“添加引用”
- 单击项目选项卡,并多选FooVersion1和FooVersion2单击确定
-
将下面一行添加到Consumer项目的Programtypes的Main中:
Acme.Foo f = new Acme.Foo();
通过Ctrl + Shift + B(或F6)构build解决scheme请注意,您会得到两个构build错误[如下所示]:
修正
以下是我们如何解决这个问题:
- 打开解决scheme资源pipe理器,并在Consumer项目的References文件夹中selectFooVersion1
- 按F4(或select查看|属性窗口)
- 将Aliases属性更改为FooVersion1
- build立解决scheme
- 现在一切都会正确地build立,因为Acme.Foo明确地指的是FooVersion2
-
将以下指令添加到Consumer项目中的Program.cs顶部:
extern alias FooVersion1;
-
将Acme.Foo的用法更改为:
FooVersion1::Acme.Foo f = new FooVersion1::Acme.Foo(); f.Bar();
-
注意,当你input'f'时 完成列表只包含Acme.Foo的FooVersion1中的那些方法(特别是它不包括Goo)
- 构build解决scheme,一切都将正确构build
-
最后在Consumer项目的Program.cs中的f.Bar()下添加下面的代码:
Acme.Foo f2 = new Acme.Foo(); f2.Goo();
-
注意f2的完成列表包含Goo。
- 再次使用Ctrl + Shift + B构build并注意,仍然没有生成错误
您可以使用/ reference(导入元数据)(C#编译器选项)编译器选项的别名function来解决您的问题,请阅读此处了解更多详细信息