IISでWEBアプリケーションを動かそうとした時に以下のエラーが出て来ました。
ファイルまたはアセンブリ xxx またはその依存関係の1つが読み込めませんでした。間違ったフォーマットのプログラムを読み込もうとしました。
説明:現在のWEB要求を実行中に、バンドルされていない例外が発生しました。エラーに関する詳細および例外の発生場所については、スタックトレースを参照してください。
例外の詳細:System.BadImageFormatException: ファイルまたはアセンブリ xxx またはその依存関係の1つが読み込めませんでした。間違ったフォーマットのプログラムを読み込もうとしました。
Could not load file or assembly 'xxx' or one of its dependencies. The system cannot find the file specified.
これは何なんでしょうか?
このエラーの原因と解決策
このエラーの原因をしらべてみました。
呼び出された関数のDLLに、32ビット(x86)環境と64ビット(x64)環境のそれぞれに対応した専用のランタイムファイルが用意されており、運用環境に合わせて適切なファイルを配布する必要があるようです。
たとえば、32ビット環境用のDLLファイルを64ビット環境に配布した場合、このエラーが発生するようです。
関連する原因は以下の通りです。
原因
Visual Studioでのデバッグ時に利用するIIS Expressがデフォルトの状態では、32ビット版であり、64ビットのASP.NETバイナリを実行できないため。
x86 と x64 について詳しくは以下をご覧ください。
ただ、私のケースの場合、Any CPUでビルドしていたのですが、どういう訳か x86 のDLLを呼び出す時に失敗しているようです。
Any CPUなら問題ないはずなのですが、原因は別なんでしょうか?
Dependency Walker を使って関連ライブラリを調べてみる
Dependency Walker は、DLLやexe 実行モジュールの依存関係のライブラリを調べることができる優れた実行モジュールです。
Dependency Walker は
からダウンロードします。
x86版とx64版があります。
Dependency Walkerで該当のDLLを調べてみたところ、
MSVCR100.DLL の x86版が入っていないことが分かりました。
なるほど、Any CPUでビルドしておいたおかげて、該当モジュールは正しく読み込まれたけれど、さらに、そのモジュールが読み込もうとしていた MSVCR100.DLL が入っていないわけですね。。。
これは気づかない!
このエラーの解決策
「MSVCR100.DLL が見つからなかったため、アプリケーションを開始できませんでした。」というエラーが出た時と同じ解決方法で
Microsoft Visual C++ 2010再頒布可能パッケージ (x86)
をインストールします。
ちなみに、x64版は、以下にあります。
Microsoft Visual C++ 2010再頒布可能パッケージ (x64)
これをインストールして無事に問題は解決しました。
コメント