2012-04-11 16 views
0

これは異常です...実行時にアセンブリをロードできません

私のプロジェクトでは、実行時に外部DLLをロードする必要があります。私はこれを頻繁にやったことがあります。私はそこですべての鉱山を踏んだと思っていましたが、ここで私がこれまでに最高のものを得ています。

本当に非常に基本的です。私はAssembly.LoadFrom("c:\\test\\mytestlibrary.dll")を使用しますが、Fusionはファイルを見つけることができません(私はFileNotFoundExceptionを取得します)。

私は融合ログをいつものように調べましたが、意味がありません。私が完全かつ絶対的なパスを提供しても、Fusionがファイルを見つけられないようにするいくつかの状況がありますか?私は問題のdllが他のアセンブリを必要としていたと考えていましたが、融合ログを見ることはこれを示していません。さらに、テストライブラリは、ホストアセンブリによって参照されていないものを参照しません。

提案がありますか?

+0

テストアセンブリは、何かの異なるバージョンを参照していますか? –

+0

ターゲットプラットフォームは異なりますか(32bit対64bit)? – Sascha

+1

おそらくばかげた質問ですが、 'C:\ test \ mytestlibrary.dll'ファイルが完全に100%確実に存在していますか? –

答えて

1

おそらく、Suzzanne Cookのこのブログエントリはいくつかの手掛かりを提供しますか?

FileNotFoundExceptionの場合: ログの最後に、Fusionがこのアセンブリに対してプロービングを試みたパスが記録されます。これがパスによるロード(Assembly.LoadFrom()の場合)の場合は、パスが1つしかなく、アセンブリを見つける必要があります。そうでなければ、あなたのアセンブリは、リストされているプロービングパスの1つになければなりません。

アセンブリのアンマネージ依存または内部モジュールがの読み込みに失敗した場合にも、この例外が発生することがあります。ファイルにdepends.exeを実行して、アンマネージ依存関係をロードできることを確認してください。 ASP.NETを使用している場合は、使用しているPATH環境変数がコマンドラインで使用されている環境変数と異なる場合があります。それらのすべてがロード可能な場合は、ファイルでildasm.exeを試し、 "MANIFEST"をダブルクリックして ".file"エントリを探します。これらのファイルのそれぞれは、マニフェストを含むファイルと同じディレクトリに存在する必要があります。 - http://blogs.msdn.com/b/suzcook/archive/2003/05/29/57120.aspx

IIRC、融合ログには、求められたパスのリストを表示する必要があります。あなたのパスは含まれていますか?さらに、アセンブリは既にプロジェクト参照として読み込まれているか、以前は同じアプリケーションドメインに以前に読み込まれていますか?

+0

はい、私はFusionログを調べましたが、問題は次のとおりです。アセンブリを使用している場合。LoadFrom/LoadFileではアセンブリへの正確なパスを指定するため、Fusionがプロービングを開始する必要はありません。実際、Assembly.LoadFrom/LoadFileを使用するのは、AppDomainアプローチを使用してアセンブリを動的にロードする際のプロービングの問題を解決する一般的な方法です。とにかくありがとう。 –

+0

彼女は事を書きました。あなたはログを調べました - 他のプローブ経路を探査していますか? –

+0

いいえ、そのパスはログに記録されません。それはとても奇妙です。 Fusionは、Assembly.LoadFile()ではなくAppDomain.Load()の呼び出しからロードを開始した場合と同様に、(ホスト)app.config、machine.configファイルなどを調べるプロービングを開始します。 –

関連する問題