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. 呼び出し側の記述」で書いたままだと、デバッグ実行時に。  下記のような表示になることがあります。
「C#」-「pinvoke stack imbalance」

 こういうときは。


[DllImport(@"sample.dll")]
 の部分を、下記のように書き換えます。

[DllImport(@"sample.dll", CallingConvention = CallingConvention.Cdecl)]
AbemaTV 無料体験