C# - C++ の DLL を使用する - 呼び出し側
- 1. 概要
- 2. 呼び出し側の記述
- 3. 引数の定義
- 4. PInvokeStackImbalance
1. 概要
前ページで作成した、「.dll」を「C#」側で、どうやって呼び出すか、という話です。
本ページは、下記のサイトを参考にさせていただきました。
「C# から C++ の DLL を呼ぶ」
「c# - pinvokestackimbalance -- how can I fix this or turn it off?」
2. 呼び出し側の記述
前ページの。
#ifdef __cplusplus
extern "C"
{
#endif
int __stdcall function(int arg1);
#ifdef __cplusplus
}
#endif
で記述して、作成された「.dll」が、「sample.dll」という名前であれば、上の関数を呼び出すには、「C#」側で。
[DllImport(@"sample.dll")]
public static extern int function(int arg1);
という定義をすれば、呼び出すことができます。
3. 引数の定義
「C++」の型定義と「C#」の型定義は異なるので、いささか書き換えが必要です。
これは、参考サイトの丸パクリで(実際は、もっとあるはずで、必要になったら探そう~っと)。
| C++ | C# | 備考 |
| int | int | |
| int& | ref int | |
| int* | out int | |
| int[] | IntPtr | |
| int** | out IntPtr | |
| unsigned char | byte | |
| char | sbyte | |
| char*(文字列) | StringBuilder | |
4. PInvokeStackImbalance
「2. 呼び出し側の記述」で書いたままだと、デバッグ実行時に。
下記のような表示になることがあります。
こういうときは。
[DllImport(@"sample.dll")]
の部分を、下記のように書き換えます。
[DllImport(@"sample.dll", CallingConvention = CallingConvention.Cdecl)]
|
|