c# - 为什么一个程序集必须被引用两次?

标签 c# .net

问题

在我看来,每当我创建一个类库时,它的所有依赖项都应该随之而来。换句话说,我希望只引用一个 .dll 就可以了。毕竟,我引用的 .dll 可以自行构建。

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

期待对此有所启发。

问题

为了说明,这里有一个例子。

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

  • ClassLibrary2 是另一个类库,在同一个解决方案中,具有 一个公共(public)类:Class1

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

    但是,ClassLibrary2 引用了 ClassLibrary1,并且 ClassLibrary2.Class1 继承自 ClassLibrary1.Class1

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

至此,一切都已构建完成。一切都是相同的框架。

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

Error 1 The type 'ClassLibrary1.Class1' is defined in an assembly that is not referenced. You must add a reference to assembly 'ClassLibrary1, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null'. ...\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();
        }
    }
}

最佳答案

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

假设您在一个解决方案中有两个项目,ProjectAProjectB。这两个项目都引用了一个程序集 Important.dll。通过此处的引用,我指的是如果您右键单击 -> 在 VS 项目中添加“引用”。还假设 ProjectA 在我们的 VS 解决方案中引用了 ProjectB。我的意思是,右键单击 -> “添加引用” -> “解决方案” -> 选择 Project B

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

但是 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

关于c# - 为什么一个程序集必须被引用两次?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41382759/

相关文章:

c# - 从 c# 运行仅签名的 powershell 脚本

c# - 同时从多个文本框中选择文本

c# - 无法从字符串中删除空格?

c# - ObjectDisposedException 即使我正在使用 .Include()、.ToList() 和其他一切

c# - 比较不装箱的结构是否相等

.net - 用于生成 .net 代理的优秀库

c# - 如何在 C# 项目中嵌入 app.config?

c# - WindowProc 对于 c# 中的窗体

c# - 多个 WCF Web 服务的异步调用

mysql - 将数据绑定(bind)到 GridView