C# 具有相同命名空间的两个不同DLL

C# 具有相同命名空间的两个不同DLL,c#,visual-studio-2010,.net-2.0,C#,Visual Studio 2010,.net 2.0,我有两个DLL文件,它们有相同的名称空间,但它们有不同的方法和类型。 如何在项目中引用这两个DLL并使用它们的方法和类型 顺便说一句,这两个DLL有一些名称相同但实现不同的方法和类型,还有一些独特的方法和类型。您不需要做什么特别的事情,只需引用它们并使用这些类型即可。名称空间可以跨越多个程序集而不会出现问题,因为它们不是真正的不透明类型。名称空间只是向其包含的所有类型添加公共前缀的一种方式,允许您在不同的名称空间下具有多个相同名称的类型。(框架并不认为它们具有相同的名称,因为它看到的是所有内容的

我有两个DLL文件,它们有相同的名称空间,但它们有不同的方法和类型。 如何在项目中引用这两个DLL并使用它们的方法和类型


顺便说一句,这两个DLL有一些名称相同但实现不同的方法和类型,还有一些独特的方法和类型。

您不需要做什么特别的事情,只需引用它们并使用这些类型即可。名称空间可以跨越多个程序集而不会出现问题,因为它们不是真正的不透明类型。名称空间只是向其包含的所有类型添加公共前缀的一种方式,允许您在不同的名称空间下具有多个相同名称的类型。(框架并不认为它们具有相同的名称,因为它看到的是所有内容的“完全限定”名称——其前面附加了别名和名称空间。)


在罕见的情况下,您引用的两个程序集具有相同的类型名称相同的名称空间(例如同一dll的两个不同版本)-您可以使用别名来区分对给定类型使用哪个程序集。所有引用的默认别名都是
global
,但您可以在引用任何程序集时为其指定自己的别名(使用编译器开关,或仅使用Visual Studio中的“属性”框)-并在使用它的代码文件顶部有一个
extern alias
子句-您可以使用
:MyNamespace.Type

从不同的程序集访问类型您可以使用/reference(导入元数据)(C#Compiler Options)编译器选项的别名功能来解决您的问题,有关更多详细信息,请阅读

如果有两种类型具有完全相同的名称(请注意,该名称包含名称空间),但位于不同的DLL中,并且您对使用这两种类型都感兴趣,则可以执行此操作

简短回答

您在两个不同的DLL中有type
Acme.Foo
,您想使用它们。在“引用属性”窗口(查看|属性窗口)中为引用指定一个别名,然后按如下方式使用它:

extern alias TheAliasYouGaveTheReference

TheAliasYouGaveTheReference::Acme.Foo f = new 
    TheAliasYouGaveTheReference::Acme.Foo();
默认名称空间是,但请注意,上面我们使用的是我们创建的别名,而不是
global

最好的方法是首先不要陷入这样的情况,如果两个程序集都是您自己的,那么不要在完全相同的命名空间中创建两个名称完全相同的类型。但有时我们不控制源代码,因此在这些时候,可以使用上述解决方案

长答案

我复制了大部分的文章,所以它被记录在这里,以防文章不再可用

你是如何进入这种情况的?

首先,这里介绍了如何复制场景,以便真正清楚地了解我们所讨论的内容:

  • 创建一个名为FooVersion1的C#类库
  • 将Class1.cs中的模板代码替换为以下代码:

    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");
            }
        }
    }
    
  • 右键单击解决方案资源管理器中的解决方案,然后选择添加|新项目

  • 保存当前项目(仅适用于express)
  • 在“新建项目”对话框中选择类库,并将项目名称更改为FooVersion2,然后按“确定”
  • 将Class1.cs中的代码替换为以下代码:

    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
    。现在,让我们创建一个控制台应用程序,并尝试使用每个控制台应用程序

  • 右键单击解决方案资源管理器中的解决方案,然后选择添加|新项目
  • 选择一个控制台应用程序并将其称为Consumer
  • 右键单击使用者并选择“设置为启动项目”
  • 右键单击使用者项目中的“引用”节点,然后选择“添加引用”
  • 单击projects选项卡,并多选FooVersion1和FooVersion2 单击“确定”
  • 将以下行添加到消费者项目的程序类型中的Main:

    Acme.Foo f = new Acme.Foo();
    
    Acme.Foo f2 = new Acme.Foo();
    f2.Goo();
    
  • 通过Ctrl+Shift+B(或F6)构建解决方案 请注意,会出现两个生成错误[如下所示]:

    修复程序

    以下是我们如何修复它:

  • 打开解决方案资源管理器并在使用者项目的References文件夹中选择FooVersion1
  • 点击F4(或选择查看|属性窗口)
  • 将Alias属性更改为FooVersion1
  • 构建解决方案
  • 现在一切都将正确构建,因为Acme.Foo明确地引用了FooVersion2
  • 将以下指令添加到Consumer项目中Program.cs的顶部:

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

    FooVersion1::Acme.Foo f = new FooVersion1::Acme.Foo();
    f.Bar();
    
  • 请注意,当您键入“f.”时,完成列表仅包含Acme.Foo的FooVersion1中的那些方法(值得注意的是,它不包括Goo)

  • 构建解决方案,一切都将正确构建
  • 最后,在Consumer项目的Program.cs中的f.Bar()下添加以下代码:

    Acme.Foo f = new Acme.Foo();
    
    Acme.Foo f2 = new Acme.Foo();
    f2.Goo();
    
  • 请注意,f2的完成列表包含Goo

  • 使用Ctrl+Shift+B再次构建,请注意仍然没有构建错误

  • 我想到的第一个问题是,为什么要为同一个名称空间创建两个不同的dll?他可能只是试图使用两个碰巧使用同一名称空间的dll。我不是在创建它。我正在写一个程序,应该使用2 DLL,我不能改变他们,因为他们在他们的公司是稳定的。不幸的是,它们都有相同的文件名和名称空间。这两个DLL的某些函数和类型具有相同的名称和不同的实现,还有一些独特的函数和类型。@Searock-即使在框架内,尤其是在使用第三方控件时,也很容易发现跨越多个程序集的同一命名空间。您可以在此处阅读有关
    extern alias
    的内容:谢谢!我以前从未理解过
    Alias
    属性,以及之前的searc