为什么没有直接依赖于另一个程序集的程序集必须引用它?

时间:2013-02-12 20:29:05

标签: c# inheritance .net-assembly

我对c#编程很新。 因此,假设我们有两个程序集Asm1,Asm2,其中两个类定义为Follows:

//Asm1
namespace ClassLibrary1
{
public class A//: B
  {
    B b = new B { i = 2};
    public int MyProperty { get { return b.i; } }
  }
}

//Asm2
namespace ClassLibrary2
{
  public class B
  {
    public int i;
  } 
}

Asm1引用Asm2 现在我们有一个可运行的程序集,例如asm3,它使用Asm1和下面的代码:

//Asm3
A a = new A();
System.Console.Write(a.MyProperty.ToString());

以上代码编译正确无误。

但是当我们在A类中做了一点改变并让它继承自B类时,事情就出错了。 在这种情况下行:A a = new A();不编译并产生错误。 但是当我们添加asm2作为asm3的引用时,它可以工作。请告诉我为什么。 为什么一个装配,没有直接依赖于另一个装配,必须参考它? 提前谢谢。

2 个答案:

答案 0 :(得分:2)

在这种情况下,编译器需要访问程序集,其中声明了您使用的类型的基类(即A)。确切的规则有点复杂。

据报道,在.NET 4.0和Visual Studio 2010中,如果您在一个程序集中继承了第二个程序集中的类,该类从未引用的第三个程序集中公开类型(并且您自己的项目未公开任何这些类型),它会工作正常。但是,当升级到.NET 4.5和Visual Studio 2012时,相同的代码和引用组合将失败,您必须引用第三个程序集。

答案 1 :(得分:0)

如果您从Asm3到Asm1进行了项目引用,则无需将Asm2引用到您的项目中。在编译期间,它将获取asm2并将其放入bin文件夹中。但是,如果在Asm3中直接对Asm1进行二进制引用,则需要在bin中使用asm2(因为asm1需要它)。这不一定需要引用asm2,但它必须在asm3的bin中。因此,您不需要手动将Asm2复制到bin,因此您可以参考它,它会为您复制它。但是,我会做以下事情,

我将Asm1和Asm2放在一个文件夹中说依赖(对于asm3),然后我将在asm3中仅引用Asm1,在构建期间,asm2将被复制到bin目录中,你会很好

所以简而言之,你的asm1需要asm2,无论它走到哪里。这就是你需要它的原因