DLLImportからC#プロジェクトに呼び出す(C/C++)DLLがあります。 は、このDLLは、このメソッドを持っていますアウト・モディファイアでアンマネージ・コードからポインタを渡す
int __stdcall Connect(OUT int *p_sessionID, IN BYTE mode, IN BYTE comport, IN char *servername, IN DWORD serverport);
私はC#にそれを「翻訳」するために、いくつかの方法を試してみましたが、私は近い見つけるものである:
[DllImport("UnmanagedDLL.dll", EntryPoint = "Connect", CallingConvention = CallingConvention.StdCall)]
private static extern unsafe int CS1_Connect(out IntPtr p_sessionID, byte mode, byte comport, string servername, int serverport);
私はこのように起動しようとしています:
追加情報:
IntPtr connection;
var i = Connect(out connection, 1, 0, "192.0.0.1", 1982);
しかし、私は常に次のエラーを取得するコールをPInvoke関数 'DllImportTest!DllImportTest.Program :: Connect'にスタックのアンバランスが発生しました。これは、管理対象のPInvokeシグネチャがアンマネージ対象シグネチャと一致しないためです。 PInvokeシグネチャの呼び出し規約とパラメータが、対象となる管理されていないシグネチャと一致することを確認します。
私は正常に動作する別の方法があるので、私はDLLに到達できることがわかります。
私は間違っていますか?
ありがとうございました。
最初の引数は 'out int'でなければなりません。しかし、それはMDAの警告を説明していない、あなたは関数のドキュメントが古くなっていると仮定する必要があります。チェックする他の方法はありません、すべての装飾は削除されています。サポートのために図書館の著者に連絡する必要があります。 –
ターゲットが64ビットの場合、MDAについて説明します –
実際には、IntPtrも同様に大きくなり、最初の4つの引数はスタックではなくレジスタを通過します。 –