次のシグネチャを持つアンマネージC++関数があります。
int function(char* param, int ret)
私はそれをC#から呼び出そうとしています:
unsafe delegate int MyFunc(char* param, int ret);
..。
int Module = LoadLibrary("fullpathToUnamanagedDll");
IntPtr pProc = GetProcAddress(Module, "functionName");
MyFunc func = (MyFunc)System.Runtime.InteropServices.Marshal.GetDelegateForFunctionPointer(pProc, typeof(MyFunc));
unsafe
{
char* param = null;
int ret = 0;
int result = func(param, ret);
}
古いC++プロジェクトの仕様からわかる限り、paramの場合はnull、 retの場合は0の両方が関数への有効な入力です。電話をかけようとするとうまくいくようですが、終了すると次のエラーが発生します。
PInvokeStackImbalanceが検出されました
PInvoke関数'...::Invoke'の呼び出しでスタックのバランスが崩れました。これは、マネージドPInvokeシグニチャがアンマネージドターゲットシグニチャと一致しないことが原因である可能性があります。PInvokeシグニチャの呼び出し規約とパラメータがターゲットのアンマネージドシグニチャと一致することを確認してください。
私は考えられることはほとんど何でも試しましたが(安全ではないことが最後の手段でした)、不均衡なスタックを取得せずに関数を実行する方法を見つけることができません。他に試すことができるものはありますか?