ファイルまたはアセンブリ xxx またはその依存関係の1つが読み込めませんでした。間違ったフォーマットのプログラムを読み込もうとしました。

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ビット環境に配布した場合、このエラーが発生するようです。

関連する原因は以下の通りです。

https://www.ipentec.com/document/document.aspx?page=visual-studio-2015-asp-net-runtime-error-in-64bit

原因
Visual Studioでのデバッグ時に利用するIIS Expressがデフォルトの状態では、32ビット版であり、64ビットのASP.NETバイナリを実行できないため。

x86 と x64 について詳しくは以下をご覧ください。

ARMとx86/x64 (Intel, AMD) のCPU、アーキテクチャの違い、シェア、性能比較、アーキテクチャ、エンディアン
プロセッサ(CPU、Central Processor Unit)の話で必ず出てくる単語に「ARM」と「x86」「x64」と...

ただ、私のケースの場合、Any CPUでビルドしていたのですが、どういう訳か x86 のDLLを呼び出す時に失敗しているようです。

Any CPUなら問題ないはずなのですが、原因は別なんでしょうか?

Dependency Walker を使って関連ライブラリを調べてみる

Dependency Walker は、DLLやexe 実行モジュールの依存関係のライブラリを調べることができる優れた実行モジュールです。

Dependency Walker は

http://www.dependencywalker.com/

からダウンロードします。

x86版とx64版があります。

Dependency Walkerで該当のDLLを調べてみたところ、

MSVCR100.DLL の x86版が入っていないことが分かりました。

なるほど、Any CPUでビルドしておいたおかげて、該当モジュールは正しく読み込まれたけれど、さらに、そのモジュールが読み込もうとしていた MSVCR100.DLL が入っていないわけですね。。。

これは気づかない!

このエラーの解決策

「MSVCR100.DLL が見つからなかったため、アプリケーションを開始できませんでした。」というエラーが出た時と同じ解決方法で

Microsoft Visual C++ 2010再頒布可能パッケージ (x86) 

https://www.microsoft.com/ja-jp/download/details.aspx?id=5555

をインストールします。

ちなみに、x64版は、以下にあります。

Microsoft Visual C++ 2010再頒布可能パッケージ (x64) 

https://www.microsoft.com/ja-jp/download/details.aspx?id=14632

これをインストールして無事に問題は解決しました。