【トラブル】C# から C++ のDLL を呼び出す際のトラブルシュート

■ はじめに

https://blogs.yahoo.co.jp/dk521123/37078399.html
で行ったトラブルシュート。

■ エラー「(呼び出し関数名)がスタックを不安定にしています」が表示される

エラー内容

(呼び出し関数名)がスタックを不安定にしています。
PInvoke シグネチャがアンマネージ ターゲット シグネチャに一致していないことが原因として考えられます。
呼び出し規約、および PInvoke シグネチャのパラメータがターゲットのアンマネージ シグネチャに一致していることを
確認してください。

原因

.NetFramework 3.5 までは、[DllImport("demodll.dll")]でよかったが、
.NetFramework 4.0 からは、「CallingConvention = CallingConvention.Cdecl」が必要。

解決策

【修正前】
[DllImport("demodll.dll")]
【修正後】
[DllImport("demodll.dll", CallingConvention = CallingConvention.Cdecl)]

参考文献

http://csharpblues.jugem.jp/?eid=8

■ エラー「(呼び出し関数名)がスタックを不安定にしています」が表示される

エラー内容

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

解決策

プロジェクトを右クリックし、[ビルド]で「プラットフォームターゲット:x64」を選択

参考文献

https://greentown.tokyo/badimageformatexception/

C++ の DLLファイルを参照追加した際にエラーが表示する

エラー内容

' XXX.dll' への参照を追加できませんでした。
ファイルがアクセス可能で、有効なアセンブリまたは
COMコンポーネントであることを確認してください。

原因

 * 追加しようとしているDLLが、.NETのアセンブリではないため

解決策

案1
 * 参照に追加するのではなく、DLLを実行ファイルと同じフォルダに配置する
   (プログラムの内容については、以下の関連記事を参照)
https://blogs.yahoo.co.jp/dk521123/37078399.html
案2
 * DLLファイルのプログラムをC++ / CLIに書き直し、.NETのアセンブリに対応させる
   (プログラムの内容については、以下の関連記事を参照)
https://blogs.yahoo.co.jp/dk521123/38074280.html

参考文献

案1
https://so-zou.jp/software/tech/programming/c-sharp/troubleshooting/dll-could-not-be-added.htm

関連記事

C# から C++ のDLL を呼び出す (C# => C++)

https://blogs.yahoo.co.jp/dk521123/37078399.html

C++ / CLI ~ 入門編 ~

https://blogs.yahoo.co.jp/dk521123/38074280.html