C# 为什么对另一个程序集没有直接依赖关系的程序集必须引用它?

C# 为什么对另一个程序集没有直接依赖关系的程序集必须引用它?,c#,inheritance,.net-assembly,C#,Inheritance,.net Assembly,我对c#编程相当陌生。 假设我们有两个程序集Asm1,Asm2,其中两个类的定义如下: //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 i

我对c#编程相当陌生。 假设我们有两个程序集Asm1,Asm2,其中两个类的定义如下:

//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();不编译并产生错误。 但是,当我们将asm2作为asm3的参考添加时,它是有效的。请告诉我这是为什么。 为什么一个与另一个程序集没有直接依赖关系的程序集必须引用它?
提前感谢。

如果您做了一个从Asm3到Asm1的项目引用,那么就没有必要将Asm2引用到您的项目中。在编译期间,它将抓取asm2并将其放入bin文件夹中。但是,如果您在Asm3中直接引用Asm1的二进制代码,它需要asm2在bin中(因为Asm1需要它)。这不一定需要引用asm2,但它必须位于asm3的bin中。因此,您不需要手动将Asm2复制到bin,因此您可以引用它,它将为您复制它。但是我会做以下几件事,

我会把Asm1和Asm2放在一个文件夹中,比如说dependencies(对于asm3),然后我会在asm3中只引用Asm1,在构建过程中,Asm2会被复制到bin目录,你会很好


总之,你的asm1需要asm2,无论它去哪里。这就是为什么需要它的原因。在本例中,编译器需要访问声明所使用类型(即
a
)的基类的程序集。确切的规则有些复杂


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

可能重复感谢您的rep Dan,但我说的是Asm3和Asm2的关系。正如您在上面的代码中所看到的,当类A不是子类B时,在asm3中不需要将其作为引用,并且没有它也可以正常工作。为什么呢?是的,当你有继承时,尽管Asm1需要asm2,所以如果asm3要使用Asm1,为了Asm1的正确功能,它需要asm2。我还对答案进行了一些编辑以澄清我查看了asm3清单,其中没有我预期的asm2引用。但你是对的,伙计。我明白了。我的asm1无论去哪里都需要asm2