C ++からの呼び出しをシミュレートするために、次のコードを試しています
private delegate void CppFuncDelegate(string message);
private static void Main(string[] args)
{
Console.WriteLine("+++ BEGIN TEST +++");
Action<string> action = str => Console.WriteLine("Received:" + str);
IntPtr delegatePtr = action.Method.MethodHandle.GetFunctionPointer();
CppFuncDelegate cppFuncDelegate = (CppFuncDelegate)
Marshal.GetDelegateForFunctionPointer(delegatePtr,
typeof(CppFuncDelegate));
cppFuncDelegate.Invoke("Hello");
}
しかし、私は得る
PInvokeStackImbalance が検出されました。PInvoke 関数 'Test!Test.Program+CppFuncDelegate::Invoke' の呼び出しにより、スタックのバランスが崩れています。これは、マネージド PInvoke 署名がアンマネージド ターゲット シグネチャと一致しないことが原因である可能性があります。PInvoke シグネチャの呼び出し規約とパラメーターがターゲットのアンマネージド シグネチャと一致することを確認します。
誰が私が間違っているのか教えてもらえますか?
注: action.Invoke(); を実行するように言わないでください。それはこの演習の目的ではありません。デリゲートへの IntPtr ハンドルを取得し、GetDelegateForFunctionPointer() を使用して、返されたデリゲートを呼び出したいと考えています。
ありがとう。