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については情報があまり見つからない。
- C++/CLI プロジェクトを .NET Core または .NET 5 に移植する方法 (learn.microsoft.com)
の「MSBuild なしでビルドする」節で次のように言及されているくらい。
3. リンクするときに、.NET Core アプリのホスト ディレクトリを LibPath として指定します (ijwhost.lib が検出されるようにします)。
4. ijwhost.dll を (.NET Core アプリのホスト ディレクトリから) プロジェクトの出力ディレクトリにコピーします。