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

时间:2010-09-09 00:20:24

标签: c# visual-studio-2010 .net-2.0

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

顺便说一下,这两个DLL有一些方法和类型,它们具有相同的名称但实现方式不同,并且有一些独特的方法和类型。

3 个答案:

答案 0 :(得分:84)

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

在极少数情况下,您引用2个具有相同类型名称相同名称空间的程序集(例如同一dll的2个不同版本) - 您可以区分哪个程序集用于给定类型使用别名。所有引用的默认别名是global,但您可以在引用它时为任何程序集指定自己的别名(使用编译器开关 - 或者只使用Visual Studio中的属性框) - 并且具有{{1您使用它的代码文件顶部的子句 - 您将使用extern alias <name>

访问来自不同程序集的类型

答案 1 :(得分:25)

如果您有两种类型完全相同的类型(请注意该名称包含命名空间),但在不同的DLL中,您有兴趣同时使用它们,那么您可以执行此操作。

简答

您在2个不同的DLL中有Acme.Foo类型,并且您想要使用它们。在引用属性窗口(视图|属性窗口)中为引用提供别名,然后像这样使用它:

extern alias TheAliasYouGaveTheReference

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

默认命名空间为global for any C# program,但请注意,我们使用的是我们创建的别名,而不是global

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

长答案

我正在复制here的大部分文章,因此会在此处记录,以防文章不再可用。

你如何陷入这样的境地?

首先,这里是你如何复制场景,所以我们正在谈论的内容非常清楚:

  1. 创建一个名为FooVersion1
  2. 的C#类库
  3. 使用以下内容替换Class1.cs中的模板代码:

    using System;
    
    namespace Acme
    {
        public class Foo
        {
            public void Bar()
            {
                Console.WriteLine("Bar");
            }
        }
    }
    
  4. 右键单击解决方案资源管理器中的解决方案,然后选择添加|新项目

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

    using System;
    
    namespace Acme
    {
        public class Foo
        {
            public void Bar()
            {
                Console.WriteLine("Bar");
            }
    
            public void Goo()
            {
                Console.WriteLine("Goo");
            }
        }
    }
    
  8. 在应用程序中使用类型

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

    1. 右键单击解决方案资源管理器中的解决方案,然后选择添加|新项目
    2. 选择一个控制台应用程序并将其命名为Consumer
    3. 右键单击Consumer并选择“设置为启动项目”
    4. 右键单击Consumer项目中的references节点,然后选择“Add Reference”
    5. 单击项目选项卡,然后多选FooVersion1和FooVersion2 单击“确定”
    6. 在Consumer项目的Program类型中将以下行添加到Main:

      Acme.Foo f = new Acme.Foo();
      
    7. 通过Ctrl + Shift + B(或F6)构建解决方案 请注意,您会收到两个构建错误[如下所示]:

      enter image description here

      修复

      以下是我们如何修复它:

      1. 打开解决方案资源管理器并在Consumer项目的References文件夹中选择FooVersion1
      2. 点击F4(或选择查看|属性窗口)
      3. 将别名属性更改为FooVersion1
      4. 构建解决方案
      5. 现在一切都会正确构建,因为Acme.Foo明确指的是FooVersion2
      6. 将以下指令添加到Consumer项目的Program.cs顶部:

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

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

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

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

      12. 使用Ctrl + Shift + B再次构建并注意到仍然没有构建错误

答案 2 :(得分:5)

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