-1

作業ディレクトリにある dll の読み込みを防止し、指定した別の場所で dll を強制的に使用することは可能ですか?

いくつかの単体テストを実行しようとしていますが、この InvalidCast 例外が発生しています:

[A]AssemblyA.DataType は [B]AssemblyA.DataType にキャストできません。タイプ A は、場所 'E:\webservice\bin\AssemblyA\AssemblyA.dll' のコンテキスト 'LoadFrom' の 'AssemblyA, Version=1.0.4645.21698, Culture=neutral, PublicKeyToken=null' に由来します。タイプ B は、'AssemblyA, Version=1.0.4645.21698, Culture=neutral, PublicKeyToken=null' のコンテキスト 'Default' の場所 'E:\TestResults\Out\AssemblyA.dll' に由来します。

テストの起動時に、Assembly.LoadFrom を使用して E:\webservice\bin\AssemblyA\AssemblyA.dll から dll をロードし、いくつかの型を作成してキャッシュに入れる初期化コードを呼び出します。

dll をその場所に xcopy するビルド後のイベントがあるため、両方の場所でまったく同じ dll になります。

しかし、単体テストは E:\testresults\out\ の作業ディレクトリから実行されているため、そこに AssemblyA.dll が自動的に読み込まれ、既に読み込まれているアセンブリは無視されます。Appdomain.AssemblyResolve イベントでその読み込みをインターセプトする機会はありません。

そのため、単体テスト コードが E:\webservice\bin\AssemblyA\AssemblyA.dll からそこに配置されたキャッシュからオブジェクトを取得しようとすると、E:\TestResults\Out\AssemblyA からの型が必要であるため、無効なキャストと表示されます。 .dll

アセンブリの読み込みのベスト プラクティスを見た後、使用したい dll を既に手動で読み込んでいるにもかかわらず、作業ディレクトリから dll を読み込むのを防ぐ方法はないようです。E:\webservice\bin からロードしないようにアプリケーションを変更する以外にオプションはありますか?

(LoadFile または Load byte[] の両方を使用しても、同じエラーが発生します)

4

2 に答える 2

1

今、私はあなたの問題からあなたを助けようとします。

アセンブリにStrongNameで署名することをお勧めします。

CLRは、これを使用してアセンブリを識別します。これはほとんどあなたの問題を解決していません。しかし、あなたの問題を解決するために、私はあなたの異なるタイプをカプセル化するためにインターフェースを使用することを提案します。したがって、任意のタイプをキャッシュに保存して、インターフェイスのみを返すことができ、キャストはなくなります。

これで問題が解決しない場合は、詳細情報を提供する必要があります。

于 2012-09-20T07:56:22.130 に答える
1

上記のコメントで Panos が示唆したように、これは、参照されているアセンブリに CopyLocal=false を設定することで解決されました。そうすれば、dll が存在しないため、CLR は作業ディレクトリから dll を読み込もうとしません。

于 2013-01-02T21:12:18.563 に答える