3

シナリオ: ProjectA は ProjectB を参照し、ProjectB は ProjectC を参照します。

ProjectC で定義されたインターフェイスがあります

namespace Cmp.Product.Family.Configuration.Container
{
  public interface IComponent
  {
    // a couple of methods
  }
}

ProjectB (ProjectB は ProjectC に依存) では、次のようにします。

using Cmp.Product.Family.Configuration.Container;

namespace Cmp.Product.Family.UI
{
    public interface IPublicComponent :  IComponent
    {

    }
}

ここまでは順調ですね。ただし、問題は ProjectA がコンパイルできないことです。コンパイラは、

Cmp.Product.Family.Configuration.Container.IComponent が定義されていません。ProjectC への参照を追加します。

ProjectC への参照を追加する必要がある理由がわかりません。私はまだIPublicComponentProjectA で を使用していません。

小さい再現ではこの問題を再現できませんでした。C# コンパイラから詳細な出力を得る方法はありますか?

ヒント : ProjectA で問題が発生するクラスは、ネストされた名前空間 ( namespace Cmp.Product.Family.UI.Settings) です。の定義で名前空間を変更すると、問題はなくなりますIPublicComponent

編集 :

IPublicComponent を含む名前を から変更すると:

 Cmp.Product.Family.UI

に :

 Cmp.Product.Family.SomethingElse

それは役立ちます。問題が ProjectA にあるクラスは、この名前空間のコンテナであることを知っています:

Cmp.Product.Family.UI.Settings
4

3 に答える 3

4

ProjectA には ProjectC が必要です。これは、A が B を必要とし、B が C に関するパブリック型情報を公開しているためです。B には、C のインターフェイスを継承するパブリック インターフェイスがあります。

A が C を参照していなければ、A は B のスーパー タイプが何であるかわかりません。その情報は、.NET のメタデータ スキームで必要です。

問題を再現する方法の非常に簡単な例を次に示します。プロジェクト B と C に正確なコードを使用したと仮定すると、これはプロジェクト A で問題を再現します。

namespace ProjectA
{
    public class Class1
    {
        private IPublicComponent d = null;
    }
}
于 2012-06-25T14:13:22.850 に答える
0

これは、プロジェクト B がプロジェクト C で定義されたインターフェイスに依存しているためです。そのため、プロジェクト B への参照を追加すると、.Net フレームワークはクラスがプロジェクト C のインターフェイスを実装していることを識別しますが、それを理解していないため、フレームワークがインターフェイスを「理解」してプロジェクト B をコンパイルするには、プロジェクト C のインターフェイスが何であるかを知る必要があります。

于 2012-06-25T14:15:13.373 に答える
0

あなたがこれを持っているとしましょう:

ProjectC.ClassC1
ProjectB.ClassB1
ProjectB.ClassB2 : ProjectC.ClassC1

ProjectAそれから何かを使用する場合はProjectB、少なくとも を参照する必要があることProjectBは明らかです。たとえば、ProjectAを使用する場合はProjectB.ClassB1、参照するだけで済みますProjectB。ただし、このシナリオでは参照する必要はありません。ProjectCただし、(継承/実装/使用)を使用するProjectA場合は、同様に参照する必要があります。ProjectB.ClassB2ProjectC.ClassC1ProjectC

したがって、ProjectAがコンパイルされない場合、コードのどこかに からのコードを使用するコードを使用するものがありProjectBますProjectC

私はちょうどそれを自分でテストしました。お役に立てれば。

編集

それでも参照の問題がある場合は、参照が破損しているか、何か他の問題が発生している可能性があります。参照を削除して再度追加してみてください。プロジェクトのソース xml ファイルも見てください。最後に、プロジェクトを新規作成し、既存のすべてのファイルを追加することで、プロジェクトを再作成することができます。

于 2012-06-25T17:11:10.280 に答える