2016-12-29 19 views
3

質問なぜアセンブリを2回参照する必要がありますか?

私がクラスライブラリを作る任意の時間は、その依存関係のすべてはそれに付属しているべきであると私には思えます。言い換えれば、私は単に.dllを参照して行くことを期待します。結局のところ、私が参照している.dllはそれ自身でうまく構築されます。

これは当てはまりませんか?私はそれを使用するために、依存関係のすべての依存関係を参照していますか?

これについて啓発されることを楽しみにしています。

を説明するために

問題は、ここでは一例です。 Class1

  • ClassLibrary1

    は1つのpublicクラスで、クラスライブラリプロジェクトです。

  • ClassLibrary2は、別のクラスライブラリであり、同じ解決法で の公的クラス:Class1です。

    これらの2つのクラスは、それぞれ独自の名前空間に存在します。

    ただし、ClassLibrary2の参照ClassLibrary1およびClassLibrary2.Class1は、ClassLibrary1.Class1を継承しています。

  • ConsoleApplication1のみClassLibrary2を参照する同じ溶液中で、コンソールアプリケーションです。

これまではすべてがビルドされています。すべてが同じフレームワークです。私はClassLibrary2.Class1を開始しようとすると

はしかし、私は、ビルドエラーを取得:

Error 1 The type 'ClassLibrary1.Class1' is defined in an assembly that is not referenced. You must add a reference to assembly 'ClassLibrary1, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null'. ...\ConsoleApplication1\Program.cs 12 4 ConsoleApplication1

コードスニペット

namespace ClassLibrary1 
{ 
    public class Class1 
    { 
     public Class1() { } 
    } 
} 

...

namespace ClassLibrary2 
{ 
    public class Class1 : ClassLibrary1.Class1 
    { 
     public Class1() : base() { } 
    } 
} 

...

namespace ConsoleApplication1 
{ 
    using ClassLibrary2; 

    class Program 
    { 
     static void Main(string[] args) 
     { 
      // error mentioned previously in post is on following line 
      var a = new Class1(); 
     } 
    } 
} 
+1

、しかししたClassLibrary1.dllはアクセス可能でなければなりません。 – McNets

+0

私はそれがC#と.NETがどのように機能するかと思います。 'ClassLibrary1'は' ClassLibrary2'の直接の依存関係であり、 'ClassLibrary2'は' ConsoleApplication1'の直接の依存関係であるため、 'ClassLibrary1'は' ConsoleApplication1'の間接依存です。コンパイラは、そのプロジェクトが構築される前に特定のプロジェクトに対してすべての依存関係が利用可能であることを知る必要があります。 –

+0

正確には、すべての(直接的または間接的)使用済みライブラリをアプリケーションに追加する必要があります。 Btw。他のクラスから派生したクラスに同じ名前を使用することはお勧めできません。 –

答えて

3

私はここで答えを公式化しようとします。それはVSのプロジェクトレベルの依存関係を調べるのに役立ちます。うまくいけばもっと明確になります。

解決策に2つのプロジェクトProjectAProjectBがあるとします。どちらのプロジェクトもアセンブリImportant.dllを参照しています。ここを参照して、VSプロジェクトで「参照」を右クリックして追加することをお勧めします。また、VS内の我々の解での参照ProjectBを参照してください。これはつまり、右クリック→「リファレンスの追加」→「ソリューション」→選択Project B

実際に何が起こっていますか?すべてのVSリファレンスは、コンパイラが.dllを見つける手助けとなることを覚えておいてください。ビルド時(コンパイル時)、VSはソリューション内のビルドが必要なすべてのプロジェクトを処理します(これはConfiguration Managerで確認できます)。 ProjectAProjectBの両方がビルドされていることがわかります。次に、依存関係ツリーをトラバースすることによって、参照セクション内のすべての直接の依存関係を調べます。 'ローカルコピー'(デフォルトではtrue)に設定されているすべてのVSリファレンスに対して、それらはビルドフォルダに送られます。したがってImportant.dllはビルドフォルダに移動します。あなたはおそらくそれを知っていました。

しかし、ProjectAの参照ProjectBのVS。ソリューション内の別のプロジェクトを参照するプロジェクトがある場合、実際にはそのプロジェクトのビルドされた.dllを指しています。この場合はProjectB.dllです。これはantoher .dllと変わりありません。 ProjectAの 'Path'の参照セクションを参照すると、これは見ることができます。C:\users\jdwqdwqd\vs\ProjectB\ProjectB\bin\x64\ProjectB.dllのようなものになります。これは出力フォルダにもコピーされます。

Important.dllProjectB.dll?と一緒に2回コピーされません。 VSはあなたに多くの助けをここに与え、コピーする正しい.dllを選ぶでしょう。

これが役に立ちます。

いくつかのより多くの情報:それはshould'n

https://msdn.microsoft.com/en-us/library/ez524kew.aspx

0

これはC#の動作方法です。継承ルールは歪んでいるようです。私は仕事中の大規模なプロジェクトに取り組んでいます。クラスライブラリと名前空間を複数のファイルに使用できますが、継承にかかわらず毎回参照する必要があります。それは奇妙で迷惑なことだ。多分彼らはすぐにそれを修正するだろう。

+8

私には非常に非技術的な説明のようです。結局のところ、あなたは "それはちょうどxyzのやり方です"と説明することができます。 –

+2

これは本当にコメントです – Jonesopolis

+0

あなたはすべてのことをそのように説明することができます。より技術的な答えがあるときは教えてください。私はそれを批判しています。 –

関連する問題