メモの日々


2023年04月07日(金) [長年日記]

[windows][c#] Ijwhost.dllが無いとSystem.BadImageFormatExceptionが投げられる

C++のコードをC#から呼び出したくて、C++/CLIを初めて試している。使うためには、Visual Studioに「C++/CLIサポート」コンポーネントを追加する必要があった。

で、C++/CLIのプロジェクトでDLLを作成し、C#のプロジェクトでそのDLLを直接参照する実行ファイルを作成してみたのだけれど、実行ファイルを実行すると

Unhandled exception. System.BadImageFormatException: Could not load file or assembly 'sample, Version=1.0.8497.30461, Culture=neutral, PublicKeyToken=null'. 間違ったフォーマットのプログラムを読み込もうとしました。

というエラーになってしまい困った。BadImageFormatExceptionという例外は64ビット用と32ビット用のバイナリが混在していると投げられるようなのだが、混在はしていない。

次の記事に解決方法が書かれていた。

C++/CLIのDLLを使う場合、DLLだけ持ってきてもダメで、同じ位置に出力されるIjwhost.dllもDLLと同じ位置に持っていかないとダメだそうです。

この通り、C++/CLIのプロジェクトのビルド結果に含まれていたIjwhost.dllを実行ファイルと同じフォルダにコピーしてみたところ、正しく動くようになった。

Ijwhost.dllについては情報があまり見つからない。

の「MSBuild なしでビルドする」節で次のように言及されているくらい。

3. リンクするときに、.NET Core アプリのホスト ディレクトリを LibPath として指定します (ijwhost.lib が検出されるようにします)。

4. ijwhost.dll を (.NET Core アプリのホスト ディレクトリから) プロジェクトの出力ディレクトリにコピーします。