问题
在我看来,无论何时我创建一个类库,它的所有依赖都应该随之而来。换句话说,我希望只引用一个.dll然后去。毕竟,.dll我引用它自己构建得很好。
情况不是这样吗?我引用所有依赖项的依赖项,以便使用它?
期待对此有所启发。
问题
为了说明,这是一个例子。
ClassLibrary1
是一个类库项目,有一个公共类:
Class1
。
ClassLibrary2
是另一个类库,在同一个解决方案中,带有
一个公共课:Class1
。
这两个类存在于它们自己的命名空间中。
但是,ClassLibrary2
引用ClassLibrary1
,ClassLibrary2.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();
}
}
}
答案 0 :(得分:3)
我会尝试在这里制定答案。它有助于查看VS中项目级别的依赖关系,并希望它会更加清晰。
假设您在解决方案中有两个项目ProjectA
和ProjectB
。两个项目都引用程序集Important.dll
。在此引用,我指的是你是否右击 - >在VS项目中添加“引用”。假设我们在VS中的解决方案中ProjectA
引用ProjectB
。我的意思是,右键单击 - > '添加参考' - > '解决方案' - >选择Project B
究竟发生了什么?请记住,所有VS引用都是帮助编译器找到.dll的一种方法。在构建时(编译),VS将遍历解决方案中需要构建的所有项目(您可以在Configuration Manager中看到这一点)。它会注意到ProjectA
和ProjectB
都设置为构建。然后,它将通过遍历依赖关系树来查看引用部分中的所有直接依赖关系。对于所有设置为“复制本地”的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.dll
与ProjectB.dll?
一起被复制两次。 VS在这里为您提供了很多帮助,并将选择正确的.dll进行复制。
希望这会有所帮助。
更多信息:
答案 1 :(得分:0)
这就是C#的工作方式。继承规则似乎有些偏差。我正在开发一个工作中的大型项目,我可以在多个文件中使用类库和命名空间,但我必须每次都引用它们,而不管继承。这很奇怪而且烦人。也许他们很快就会解决这个问题。