【问题标题】:why do an assembly with no direct dependency to another assembly have to reference it?为什么一个与另一个程序集没有直接依赖关系的程序集必须引用它?
【发布时间】:2013-01-28 06:30:09
【问题描述】:

我对 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 的引用时,它可以工作。请告诉我为什么会这样。 为什么没有直接依赖于另一个程序集的程序集必须引用它? 提前致谢。

【问题讨论】:

标签: c# inheritance .net-assembly


【解决方案1】:

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

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

【讨论】:

    【解决方案2】:

    如果您将项目从 Asm3 引用到 Asm1,则无需将 Asm2 引用到您的项目。编译时会抓取asm2,放到bin文件夹下。但是,如果您在 Asm3 中直接对 Asm1 进行二进制引用,则它需要 bin 中的 asm2(因为 asm1 需要它)。这不一定需要引用 asm2,但它必须在 asm3 的 bin 中。因此,您不需要手动将 Asm2 复制到 bin,因此您可以引用它,它会为您复制它。但是,我会执行以下操作,

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

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

    【讨论】:

    • 感谢您的代表 Dan,但我说的是 Asm3 和 Asm2 的关系。正如您在上面的代码中看到的那样,当 A 类不是 B 的子类时,不需要将它作为 asm3 中的引用,并且没有它也能正常运行。那为什么会这样呢?
    • 是的,当你确实有继承时,虽然 Asm1 需要 asm2,所以如果 asm3 要使用 asm1,为了 asm1 的正确功能,它需要 asm2。我还稍微编辑了答案以澄清
    • 我查看了 asm3 清单,正如我所料,其中没有 asm2 引用。但你是对的伙伴。我明白了。我的 asm1 无论走到哪里都需要 asm2
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-12-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多