C# 具有相同命名空间的两个不同DLL
我有两个DLL文件,它们有相同的名称空间,但它们有不同的方法和类型。 如何在项目中引用这两个DLL并使用它们的方法和类型C# 具有相同命名空间的两个不同DLL,c#,visual-studio-2010,.net-2.0,C#,Visual Studio 2010,.net 2.0,我有两个DLL文件,它们有相同的名称空间,但它们有不同的方法和类型。 如何在项目中引用这两个DLL并使用它们的方法和类型 顺便说一句,这两个DLL有一些名称相同但实现不同的方法和类型,还有一些独特的方法和类型。您不需要做什么特别的事情,只需引用它们并使用这些类型即可。名称空间可以跨越多个程序集而不会出现问题,因为它们不是真正的不透明类型。名称空间只是向其包含的所有类型添加公共前缀的一种方式,允许您在不同的名称空间下具有多个相同名称的类型。(框架并不认为它们具有相同的名称,因为它看到的是所有内容的
顺便说一句,这两个DLL有一些名称相同但实现不同的方法和类型,还有一些独特的方法和类型。您不需要做什么特别的事情,只需引用它们并使用这些类型即可。名称空间可以跨越多个程序集而不会出现问题,因为它们不是真正的不透明类型。名称空间只是向其包含的所有类型添加公共前缀的一种方式,允许您在不同的名称空间下具有多个相同名称的类型。(框架并不认为它们具有相同的名称,因为它看到的是所有内容的“完全限定”名称——其前面附加了别名和名称空间。)
在罕见的情况下,您引用的两个程序集具有相同的类型名称和相同的名称空间(例如同一dll的两个不同版本)-您可以使用别名来区分对给定类型使用哪个程序集。所有引用的默认别名都是
global
,但您可以在引用任何程序集时为其指定自己的别名(使用编译器开关,或仅使用Visual Studio中的“属性”框)-并在使用它的代码文件顶部有一个extern alias
子句-您可以使用:MyNamespace.Type
从不同的程序集访问类型您可以使用/reference(导入元数据)(C#Compiler Options)编译器选项的别名功能来解决您的问题,有关更多详细信息,请阅读如果有两种类型具有完全相同的名称(请注意,该名称包含名称空间),但位于不同的DLL中,并且您对使用这两种类型都感兴趣,则可以执行此操作
简短回答
您在两个不同的DLL中有typeAcme.Foo
,您想使用它们。在“引用属性”窗口(查看|属性窗口)中为引用指定一个别名,然后按如下方式使用它:
extern alias TheAliasYouGaveTheReference
TheAliasYouGaveTheReference::Acme.Foo f = new
TheAliasYouGaveTheReference::Acme.Foo();
默认名称空间是,但请注意,上面我们使用的是我们创建的别名,而不是global
最好的方法是首先不要陷入这样的情况,如果两个程序集都是您自己的,那么不要在完全相同的命名空间中创建两个名称完全相同的类型。但有时我们不控制源代码,因此在这些时候,可以使用上述解决方案
长答案
我复制了大部分的文章,所以它被记录在这里,以防文章不再可用
你是如何进入这种情况的?
首先,这里介绍了如何复制场景,以便真正清楚地了解我们所讨论的内容:
using System;
namespace Acme
{
public class Foo
{
public void Bar()
{
Console.WriteLine("Bar");
}
}
}
using System;
namespace Acme
{
public class Foo
{
public void Bar()
{
Console.WriteLine("Bar");
}
public void Goo()
{
Console.WriteLine("Goo");
}
}
}
using System;
namespace Acme
{
public class Foo
{
public void Bar()
{
Console.WriteLine("Bar");
}
}
}
using System;
namespace Acme
{
public class Foo
{
public void Bar()
{
Console.WriteLine("Bar");
}
public void Goo()
{
Console.WriteLine("Goo");
}
}
}
Acme.Foo
。现在,让我们创建一个控制台应用程序,并尝试使用每个控制台应用程序
Acme.Foo f = new Acme.Foo();
Acme.Foo f2 = new Acme.Foo();
f2.Goo();
extern alias FooVersion1;
FooVersion1::Acme.Foo f = new FooVersion1::Acme.Foo();
f.Bar();
Acme.Foo f = new Acme.Foo();
Acme.Foo f2 = new Acme.Foo();
f2.Goo();
我想到的第一个问题是,为什么要为同一个名称空间创建两个不同的dll?他可能只是试图使用两个碰巧使用同一名称空间的dll。我不是在创建它。我正在写一个程序,应该使用2 DLL,我不能改变他们,因为他们在他们的公司是稳定的。不幸的是,它们都有相同的文件名和名称空间。这两个DLL的某些函数和类型具有相同的名称和不同的实现,还有一些独特的函数和类型。@Searock-即使在框架内,尤其是在使用第三方控件时,也很容易发现跨越多个程序集的同一命名空间。您可以在此处阅读有关
extern alias
的内容:谢谢!我以前从未理解过Alias
属性,以及之前的searc