1

私はC#プログラミングにまったく慣れていません。したがって、2 つのクラスが次のように定義されている 2 つのアセンブリ 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 を参照する これで、次のコードで Asm1 を使用する asm3 という実行可能なアセンブリができました。

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

上記のコードは、エラーなしで正しくコンパイルされます。

しかし、クラス A に少し変更を加えてクラス B から継承すると、うまくいきません。コンパイルされず、エラーが発生します。しかし、asm3 への参照として asm2 を追加すると、機能します。それはなぜか教えてください。別のアセンブリに直接依存していないアセンブリが、それを参照する必要があるのはなぜですか? 前もって感謝します。

4

2 に答える 2

2

この場合、コンパイラは、使用する型 (つまりA) の基本クラスが宣言されているアセンブリへのアクセスを必要とします。正確なルールはやや複雑です。

.NET 4.0 と Visual Studio 2010 では、1 つのアセンブリで、参照されていない 3 番目のアセンブリから型を公開する 2 番目のアセンブリからクラスを継承した場合 (そして、自分のプロジェクトがこれらの型のいずれも公開していない場合)、それは機能することが報告されています。大丈夫。ただし、.NET 4.5 および Visual Studio 2012 にアップグレードすると、同じコードと参照の組み合わせが失敗し、3 番目のアセンブリを参照する必要があります。

于 2013-02-12T22:38:10.497 に答える
0

Asm3 から Asm1 へのプロジェクト参照を行った場合、Asm2 をプロジェクトに参照する必要はありません。コンパイル中に、asm2 を取得して bin フォルダーに配置します。ただし、Asm3 で Asm1 の直接バイナリ参照を行う場合は、bin のいずれかで asm2 が必要です (asm1 が必要なため)。これは、必ずしも asm2 への参照を作成する必要はありませんが、asm3 のビンにある必要があります。したがって、Asm2 を bin に手動でコピーする必要はありません。したがって、それを参照することができ、自動的にコピーされます。ただし、次のようにします。

Asm1 と Asm2 をフォルダーに入れ、依存関係 (asm3 用) を指定します。次に、asm3 で Asm1 のみを参照し、ビルド中に asm2 を bin ディレクトリにコピーします。

要するに、asm1 はどこに行っても asm2 を必要とします。それがあなたがそれを必要とした理由です

于 2013-02-12T20:49:56.680 に答える