3

System.Runtime.InteropServicesを使用してC#アプリケーションから既存のC dllを呼び出そうとしていますが、PInvoke関数とTarget関数の間で署名を一致させるのに問題があります。

対象となる機能は

__declspec(dllexport) DWORD GetSomeString(char* strOut);

そして私のPInvoke関数は

[DllImport("Existing.dll")]
public static extern uint GetSomeString([MarshalAs(UnmanagedType.LPWStr)]
                            string strDisplay);

関数呼び出しを行います

string tempStr = "My Output String";
uint retVal = GetSomeString(tempStr);

しかし、私はメッセージを受け取ります

Managed Debugging Assistant'PInvokeStackImbalance'が問題を検出しました......PInvoke関数'GetSomeString'の呼び出しにより、スタックのバランスが崩れました。これは、マネージドPInvokeシグニチャがアンマネージドターゲットシグニチャと一致しないことが原因である可能性があります。PInvokeシグニチャの呼び出し規約とパラメータがターゲットのアンマネージドシグニチャと一致することを確認してください。

また、PInvoke関数を次のように実装してみました

[DllImport("Existing.dll")]
public static extern uint GetSomeString([MarshalAs(UnmanagedType.LPWStr)]
                            StringBuilder strDisplay);

しかし、役に立たない。

誰かが私が間違っている可能性があることを知っていますか?

さらに情報が必要な場合、または私の質問が不明な場合はお知らせください。

前もって感謝します。

4

2 に答える 2

4

呼び出し規約を指定する必要があります。デフォルトでは、PInvokeはを使用しStdCallますが、メソッドは(おそらく)Cdeclです。

[DllImport("Existing.dll", CallingConvention=CallingConvention.Cdecl)]
于 2012-09-07T17:16:43.817 に答える
2

Reed Copseyによって言及された誤った呼び出し規約に加えて、の一致するタイプはchar*ですUnmanagedType.LPStr

于 2012-09-07T17:29:01.890 に答える