1

我对 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 = new A(); 不编译并产生错误。但是当我们添加 asm2 作为对 asm3 的引用时,它可以工作。请告诉我为什么会这样。为什么没有直接依赖于另一个程序集的程序集必须引用它?提前致谢。

4

2 回答 2

2

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

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

于 2013-02-12T22:38:10.497 回答
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。这就是你需要它的原因

于 2013-02-12T20:49:56.680 回答