为什么必须引用程序集两次?

时间:2016-12-29 15:36:00

标签: c# .net

问题

在我看来,无论何时我创建一个类库,它的所有依赖都应该随之而来。换句话说,我希望只引用一个.dll然后去。毕竟,.dll我引用它自己构建得很好。

情况不是这样吗?我引用所有依赖项的依赖项,以便使用它?

期待对此有所启发。

问题

为了说明,这是一个例子。

  • ClassLibrary1是一个类库项目,有一个公共类: Class1

  • ClassLibrary2是另一个类库,在同一个解决方案中,带有 一个公共课:Class1

    这两个类存在于它们自己的命名空间中。

    但是,ClassLibrary2引用ClassLibrary1ClassLibrary2.Class1继承自ClassLibrary1.Class1

  • ConsoleApplication1是一个控制台应用,在同一解决方案中,只引用 ClassLibrary2

到目前为止,一切都在建立。一切都是相同的框架。

但是,当我尝试启动ClassLibrary2.Class1时,出现构建错误:

  

错误1类型'ClassLibrary1.Class1'在程序集中定义   没有引用。您必须添加对程序集的引用   'ClassLibrary1,Version = 1.0.0.0,Culture = neutral,   公钥=空”。 ... \ ConsoleApplication1 \ Program.cs 12 4 ConsoleApplication1

代码段

namespace ClassLibrary1
{
    public class Class1
    {
        public Class1() { }
    }
}

...

namespace ClassLibrary2
{
    public class Class1 : ClassLibrary1.Class1
    {
        public Class1() : base() { }
    }
}

...

namespace ConsoleApplication1
{
    using ClassLibrary2;

    class Program
    {
        static void Main(string[] args)
        {
            // error mentioned previously in post is on following line
            var a = new Class1();
        }
    }
}

2 个答案:

答案 0 :(得分:3)

我会尝试在这里制定答案。它有助于查看VS中项目级别的依赖关系,并希望它会更加清晰。

假设您在解决方案中有两个项目ProjectAProjectB。两个项目都引用程序集Important.dll。在此引用,我指的是你是否右击 - >在VS项目中添加“引用”。假设我们在VS中的解决方案中ProjectA引用ProjectB。我的意思是,右键单击 - > '添加参考' - > '解决方案' - >选择Project B

究竟发生了什么?请记住,所有VS引用都是帮助编译器找到.dll的一种方法。在构建时(编译),VS将遍历解决方案中需要构建的所有项目(您可以在Configuration Manager中看到这一点)。它会注意到ProjectAProjectB都设置为构建。然后,它将通过遍历依赖关系树来查看引用部分中的所有直接依赖关系。对于所有设置为“复制本地”的VS引用(默认为true),它们将被发送到构建文件夹。所以Important.dll将转到build文件夹..你可能知道这一点。

ProjectA引用了VS中的ProjectB。当你有一个项目引用解决方案中的另一个项目时,你所做的只是指向该项目的内置.dll ......在这种情况下是ProjectB.dll。它与antoher .dll没有什么不同。如果您查看ProjectA中“路径”下的参考部分,就可以看到这一点......它就像C:\users\jdwqdwqd\vs\ProjectB\ProjectB\bin\x64\ProjectB.dll。所以这也将被复制到输出文件夹。

我想有人可能会问'不会Important.dllProjectB.dll?一起被复制两次。 VS在这里为您提供了很多帮助,并将选择正确的.dll进行复制。

希望这会有所帮助。

更多信息:

https://msdn.microsoft.com/en-us/library/ez524kew.aspx

答案 1 :(得分:0)

这就是C#的工作方式。继承规则似乎有些偏差。我正在开发一个工作中的大型项目,我可以在多个文件中使用类库和命名空间,但我必须每次都引用它们,而不管继承。这很奇怪而且烦人。也许他们很快就会解决这个问题。