问题
在我看来,每当我创建一个类库时,它的所有依赖项都应该随之而来。换句话说,我希望只引用一个 .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 中查看项目级别的依赖关系,希望它会更加清晰。
假设您在一个解决方案中有两个项目,ProjectA
和 ProjectB
。这两个项目都引用了一个程序集 Important.dll
。通过此处的引用,我指的是如果您右键单击 -> 在 VS 项目中添加“引用”。还假设 ProjectA
在我们的 VS 解决方案中引用了 ProjectB
。我的意思是,右键单击 -> “添加引用” -> “解决方案” -> 选择 Project B
实际发生了什么?请记住,所有 VS 引用都是一种帮助编译器找到 .dll 的方法。在构建时(编译),VS 将遍历解决方案中需要构建的所有项目(您可以在配置管理器中看到这一点)。它会注意到 ProjectA
和 ProjectB
都设置为构建。然后它将通过遍历依赖树来查看引用部分中的所有直接依赖项。对于设置为“复制本地”(默认情况下为 true)的所有 VS 引用,它们将被发送到构建文件夹。所以 Important.dll
将转到构建文件夹。您可能知道这一点。
但是 ProjectA
在 VS 中引用了 ProjectB
。当您有一个项目引用解决方案中的另一个项目时,您真正要做的就是指向该项目的内置 .dll...在本例中为 ProjectB.dll
。它与 antoher .dll 没有什么不同。如果您查看 ProjectA
中“路径”下的引用部分,您可以看到这一点...它类似于 C:\users\jdwqdwqd\vs\ProjectB\ProjectB\bin\x64\ProjectB.dll
。所以这也将被复制到输出文件夹。
我猜有人可能会问“不会将 Important.dll
与 ProjectB.dll 一起复制两次吗?
”。 VS 在这里为您提供了很多帮助,并会选择正确的 .dll 进行复制。
希望这对您有所帮助。
更多信息:
关于c# - 为什么一个程序集必须被引用两次?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41382759/