【发布时间】:2016-12-29 15:35:59
【问题描述】:
问题
在我看来,每当我创建一个类库时,它的所有依赖项都应该随之而来。换句话说,我希望只引用一个 .dll 就可以了。毕竟,我引用的 .dll 可以自行构建。
不是这样吗?我引用所有依赖项的依赖项,以便使用它?
期待对此有所启发。
问题
为了说明,这里举个例子。
ClassLibrary1是一个类库项目,有一个公共类:Class1.-
ClassLibrary2是另一个类库,在同一个解决方案中,具有 一节公开课:Class1。这两个类存在于它们自己的命名空间中。
但是,
ClassLibrary2引用ClassLibrary1,而ClassLibrary2.Class1继承自ClassLibrary1.Class1。 ConsoleApplication1是一个控制台应用程序,在同一解决方案中,仅引用ClassLibrary2。
到目前为止,一切都建立起来了。一切都是同一个框架。
但是,当我尝试启动 ClassLibrary2.Class1 时,出现构建错误:
错误 1 类型“ClassLibrary1.Class1”在程序集中定义 没有被引用。您必须添加对程序集的引用 'ClassLibrary1,版本=1.0.0.0,文化=中性, 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();
}
}
}
【问题讨论】:
-
应该没有,但 ClassLibrary1.dll 必须是可访问的。
-
我认为这就是 C# 和 .NET 的工作方式。
ClassLibrary1是ClassLibrary2的直接依赖,ClassLibrary2是ConsoleApplication1的直接依赖,所以ClassLibrary1是ConsoleApplication1的间接依赖。在构建特定项目之前,编译器需要知道所有依赖项都可用于该项目。 -
确切地说,您必须将所有(直接或间接)使用的库添加到您的应用程序中。顺便提一句。对从另一个派生的类使用相同的名称不是一个好主意。
-
如果
ClassLibrary2在内部使用ClassLibrary1.Class1,是否需要参考ClassLibrary1? -
它们在同一个解决方案中的事实并不重要。在 VS 中,项目级别更为重要。每个项目都有自己的依赖项,然后在构建时,编译器将遍历依赖项树并将所需的所有依赖项复制到输出文件夹。如果一个项目在 VS 中引用了另一个项目,那么你真正要做的就是指向构建的 .dll 的位置。