0

TL:DRアセンブリをライブラリと呼び出し元のプロジェクトではなくクラスライブラリでのみ参照するにはどうすればよいですか?呼び出し元プロジェクトへの参照を追加せずにクラスライブラリを使用してDLL参照を正しく解決する方法

コードの再利用を促進するために、C#でユーティリティライブラリを構築しています。この例では、私はTFSサーバーで何か物事をやりたいと思っや物事のTFS側からいくつかのアセンブリを参照する必要があるのです:

  • Microsoft.TeamFoundation.Client
  • Microsoft.VersionControl.Client
  • Microsoft.WorkItemTracking.Client

私はこれらの参照を、たとえばユーティリティと呼ばれるクラスライブラリに含めます。次に、ヘルパーオブジェクトのアセンブリ内のオブジェクトをラップします。エラーはなく、Intellisenseは正しく動作します。

同じソリューション内の別のプロジェクト、たとえばTestCLIでそのクラスライブラリを使用する場合は、[ソリューション参照]タブからプロジェクトを選択してUtilityプロジェクトへの参照を追加します。私はビルドするまで、問題なくUtilityクラスを使用することができます。

The type 'Microsoft.TeamFoundation.VersionControl.Client.BranchObject' is defined in an assembly that is not referenced. You must add a reference to assembly 'Microsoft.TeamFoundation.VersionControl.Client, Version=12.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a

過去には、私は、呼び出し元のプロジェクト(TestCLI)内に同じ参照を追加することでこの問題を回避働いている:私は、ソリューションをビルドすると、それは突然のようなエラーがスローされます

クラスライブラリへの追加(ユーティリティ)。私はこれがクラス図書館の目的の1つを打ち負かしていると感じています。私は自分の呼び出したプロジェクトで図書館の参照を心配する必要がないためには足りなかったと感じています。

クラスライブラリと呼び出し元プロジェクトの両方に参照を含めないと、これらの依存関係を解決する方法はありますか?私のソリューションが正しく構成されていませんか?クラスライブラリについて誤った考えをしていますか?

+2

これは、ライブラリが他のライブラリのクラスまたはメソッドを直接公開しているためです。そのため、参照が必要です。他のライブラリオブジェクトを完全に隠す場合は、それらのライブラリオブジェクトへの参照は必要ありません。 – Gusman

+0

私は今、そんなに馬鹿だと感じる。それは壊れているよりはるかに理にかなっています。私はこれらの変更を解決するために少し仕事があります。それらの参照を埋める方法があるかどうか分かりますので、オブジェクトのいくつかを使用したい場合でも参照できます。 また、ご希望の場合は、回答を書き留めてください。私はそれを受け入れます。そうでなければ、私はそれが何かを持っているように書くことができます。 – Gilbrilthor

+0

さて、オブジェクトをまったく公開することはできませんが、それらをカプセル化することは、公開しているものによって異なります。それらがデータクラスの場合は、ライブラリにそのクラスのコピーを作成することができます。これらが関数の場合は、ラッパーを作成できます。 – Gusman

答えて

2

他のライブラリのオブジェクトを公開し、これらのクラスを使用するためには、最終的なプログラムで参照が必要であるため、参照が必要です。

これを回避するには、外部オブジェクトをラッパー、クラスのコピー、またはその他のもので非表示にする必要があります。主にそれらのオブジェクトを公開する理由とその理由によって異なります。

関連する問題