考虑我们有3层应用,并有三个名为P1,P2,P3的项目。
依赖性:P1(数据)<< P2(业务逻辑)<< P3(讲演)
P2有一个基类 X ,它在P2中的其他类 Y 中继承。因此,我们将ref P1添加到P2。但是,P3使用P2。 Y 并且不直接使用P1。 X 。
为此,我们必须将ref P2添加到P3。但是VB和C#之间存在差异。
在 VB 中,我们仅将ref P2添加到P3。 P2使用P1,但对P3无关紧要。我们不需要将ref P1添加到P3 。这就足够了!
但是,在 C#中,我们必须将ref P1和P2都添加到P3 ,即使P3不使用P1.X也是如此。如果您没有将ref A添加到C,则会收到以下错误:
类型'P1.X'在未引用的程序集中定义。您必须添加对程序集'P1,Version = 1.0.0.0,Culture = neutral,PublicKeyToken = null'的引用。
为什么我们必须在C#中添加两个项目?
或者,我们可以阻止这种行为吗?
答案 0 :(得分:1)
可能的原因是P2公开公开其类型在P1中定义的成员。在这种情况下,P1也必须在P3中引用,即使您没有在P3中明确使用它。
示例:
// Assembly P1
public class C1
{
...
}
// Assembly P2
public class C2
{
public string Foo { get; set; }
public C1 Bar { get; set; }
}
// Assembly P3
void Main()
{
C2 c = ...
Console.WriteLine(c.Foo);
}
在上面的代码中,P3使用C2(在P2中定义),C2暴露了C1类型的成员(在P1中定义),因此P3必须引用P1 (即使它不使用C2.Bar )击>
编辑:实际上我错了:只有在引用C2.Bar
时才必须引用P1 ... VB中的行为与C#中的行为完全相同,我只是尝试过(如果你没有添加参考P1得到this error)。如果你以前在VB项目中没有这个约束,那只是因为P3没有使用任何依赖于P1的东西。