1

状況は次のとおりです。「TestProject」と呼ぶテスト プロジェクトを使用して単体テストを実行しようとしています。「Class1」および「Project1」と呼ぶ別のプロジェクトのクラスをテストしています。

Project1 は、実行時にさまざまな dll の動的遅延読み込みを行います。これを「TheDynamicDLLs」と呼びます。Project1 は、独自のビルド出力パスに関連するディレクトリを調べることで、これらの dll を見つけます。

問題の最初の部分は、TestProject が Project1 を参照するときに発生します。明らかに、新しくビルドされた Project1.dll を独自のビルド ディレクトリにコピーします。次に、Project1.dll がその場所からの相対パスで TheDynamicDLLs を検索すると、それらを見つけることができません。自分の。

これを修正するために、TestProject の参照に移動し、Project1 参照を右クリックして、そのプロパティを開きました。次に、「ローカルにコピー」を「False」に設定します。また、参照の "Path" プロパティが Project1 のビルド パスと同じであることも確認しました。

今、私は新しい問題を抱えており、それが何であるかさえ理解できません。単体テストを実行するたびに、「System.IO.FileNotFoundException: ファイルまたはアセンブリを読み込めませんでした [Project1 が見つからないアセンブリであるという情報]」というレポートで失敗します。

さらに、単体テストを実行するだけでなく、デバッグしようとすると、例外がスローされたり、文句が出たりすることがないため、問題に関する詳細情報を見つけることができません。テストレポートにも、これ以上役立つ情報はありません。

以下は、機密保持のために名前などを差し替えた完全なテスト レポートです。

Test Name:  Class1_Tests
Test FullName:  TestProject.TestClass.Class1_Tests
Test Source:    c:\Code\Solution1\Tests\TestProject\TestClass.cs : line 175
Test Outcome:   Failed
Test Duration:  0:00:00.0348455

Result Message: 
Test method TestProject.TestClass.Class1_Tests threw exception: 
System.IO.FileNotFoundException: Could not load file or assembly 'Project1, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null' or one of its dependencies. The system cannot find the file specified.=== Pre-bind state information ===
LOG: DisplayName = Project1, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null
 (Fully-specified)
LOG: Appbase = file:///C:/Code/Solution1/Tests/TestProject/bin/Debug
LOG: Initial PrivatePath = NULL
Calling assembly : TestProject, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null.
===
LOG: This bind starts in default load context.
LOG: Using application configuration file: C:\Code\Solution1\Tests\TestProject\bin\Debug\TestProject.dll.config
LOG: Using host configuration file: 
LOG: Using machine configuration file from C:\Windows\Microsoft.NET\Framework\v4.0.30319\config\machine.config.
LOG: Policy not being applied to reference at this time (private, custom, partial, or location-based assembly bind).
LOG: Attempting download of new URL file:///C:/Code/Solution1/Tests/TestProject/bin/Debug/Project1.DLL.
LOG: Attempting download of new URL file:///C:/Code/Solution1/Tests/TestProject/bin/Debug/Project1/Project1.DLL.
LOG: Attempting download of new URL file:///C:/Code/Solution1/Tests/TestProject/bin/Debug/Project1.EXE.
LOG: Attempting download of new URL file:///C:/Code/Solution1/Tests/TestProject/bin/Debug/Project1/Project1.EXE.
Result StackTrace:  at TestProject.TestClass.Class1_Tests()

ログから、ローカルにコピーしないように明示的に指示したにもかかわらず、TestProject はまだ Project1 の dll を独自の #$%^ing ビルド パスからロードしようとしているようです。(ぐう…)

私は何を間違っていますか?

4

1 に答える 1

4

!!!注意してください: 私が投稿した元の質問は、より深い問題に対する私の解決策の問題に関するものでした。この回答は、質問が尋ねる問題ではなく、そのより深い問題に対する解決策です。

さらに説明するには:元の質問は、参照が「CopyLocal = false」に設定されている場合に、ランタイム環境が参照された依存関係を正しくロードする方法でした。

その質問がなされたのは、copylocal=false を設定して、別の単体テスト プロジェクトの一部として読み込まれて実行された場合でも、依存関係 dll を元のビルド パスで実行し続けるようにしていたためです。ビルド パスに相対的なフォルダー パスにあるランタイム。

この回答は最初の問題に対する回答であり、最初に copylocal=false を設定する必要がなくなります。したがって、ここでの回答を最も役立つものとして選択することはしません。誰かが直接の質問に対する答えを持っている場合でも、私とは異なる理由でその問題に苦しんでいる可能性のある人々を助けるために投稿する必要があります.

そうは言っても、 copylocal = falseを設定する必要があった理由に対する私の解決策は次のとおりです。

  1. TheDynamicDLLs を Project1 に追加しましたが、参照としてではありません。ソリューション エクスプローラーで Project1 を右クリックし、[既存の項目を追加] を選択してから、各 dll の場所を参照し、それをAS A LINKとして追加しました。(DynamicDLLProject によって再構築されるたびに更新されるように、リンクとして追加することが重要です)。
  2. Project1 に新しく追加された項目を右クリックし、[プロパティ] を選択します。「ビルド アクション」「なし」に設定し、 「出力ディレクトリにコピー」を「新しい場合はコピー」または「常にコピー」のいずれかに設定します。
  3. Project1 が実行時にロードする/ロードする可能性のある動的 dll ごとに、手順 1 と 2 を繰り返します。
  4. もちろん、TestProject では、Project1 の参照を "Copy Local = True" に戻します。

これの効果は、動的 dll が実際に Project1 に参照またはコンパイルされていない間 (Project1 の実行時に動的 dll が熱心に読み込まれないようにする場合)、Project1 を参照し、その dll を出力パスにコピーするすべてのプロジェクトは、そのプロジェクトの出力の一部として追加された項目 (この場合は TheDynamicDLLs) もコピーします。

私と同じような理由でこの問題を抱えている人の助けになることを願っています。

于 2014-07-22T22:26:16.017 に答える