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 アプリのホスト ディレクトリから) プロジェクトの出力ディレクトリにコピーします。
2023年04月18日(火) [長年日記]
■ [windows][c++] VC++でコンパイル時の警告がエラーとみなされるのを解除する
deprecatedとマークされた関数などを使用していると、VC++のコンパイラはC4996という警告を報告する。
これは警告なのだけれど、Visual Studio上ではエラーとみなされてコンパイルが成功せず困った。
コンパイラの次のオプションが有効だと、一部の警告がエラー扱いになるようだ。
- /sdl (追加のセキュリティ チェックの有効化) (Microsoft Lean)
Visual Studio 2019が生成するプロジェクトではこのオプションが有効になっている模様。プロジェクトのプロパティの次の場所で設定を変更できる。
- 構成プロパティ → C/C++ → 全般 → SDLチェック
2023年04月19日(水) [長年日記]
■ [windows][c++] VC++プロジェクトのビルドイベントでcmakeコマンドを呼び出す
Visual Studio 2019のC++プロジェクトの「ビルドイベント」でcmakeコマンドを呼び出したかった。
Visual StudioにはCMakeが付属しているので普通に呼び出せると思っていたが、コマンドが見つからないというエラーになってしまった。
Visual Studioの「Developer Command Prompt」からならcmakeコマンドを呼び出せる。調べると、Developer Command Promptとビルドイベントの環境とではPATH環境変数の値が違っていた。
Developer Command Promptの環境はVsDevCmd.batというバッチファイルから開けるようだ。幸い、ビルドイベントの環境はVsDevCmd.batへのパスが通っているので、ビルドイベントで実行するスクリプトに
call VsDevCmd.bat cmake --help
などと書けばcmakeコマンドを実行できた。
- call (Microsoft Learn)