2016-05-13 9 views
-1

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に到達できることがわかります。

私は間違っていますか?

ありがとうございました。

+0

最初の引数は 'out int'でなければなりません。しかし、それはMDAの警告を説明していない、あなたは関数のドキュメントが古くなっていると仮定する必要があります。チェックする他の方法はありません、すべての装飾は削除されています。サポートのために図書館の著者に連絡する必要があります。 –

+0

ターゲットが64ビットの場合、MDAについて説明します –

+0

実際には、IntPtrも同様に大きくなり、最初の4つの引数はスタックではなくレジスタを通過します。 –

答えて

0

最初のパラメータが正しく翻訳されていません。

OUT int *p_sessionID 

ここでOUTは、読者にセマンティクスを示すマ​​クロです。マクロは何も展開しません。そして、その前処理した後、あなたが持っている:

int *p_sessionID 

あなたのC#で

として
out int sessionID 

を変換すること。

関数を安全でないと宣言する必要はありません。その関数を削除してください。最後のパラメータは符号なしです。 uintに切り替えることをお勧めします。

正しい翻訳は、したがって、次のようになります。

[DllImport("UnmanagedDLL.dll", EntryPoint = "Connect", 
    CallingConvention = CallingConvention.StdCall)] 
private static extern int CS1_Connect(
    out int sessionID, 
    byte mode, 
    byte comport, 
    string servername, 
    uint serverport 
); 

あなたはまだスタック不均衡メッセージを受け取った場合、あなたは、アンマネージ関数を使用して、質問に引用されている署名を持っていないことを知っているだろう。

+0

私はすでにそれを試してみました。しかし、私は同じエラーを持っています。私が安全でない場合は、コードをコンパイルできません。 これは最後のパラメータで使用されていました。私がここに入力したときに綴りが間に合わない。 –

+0

これは試行錯誤の試合ではありません。それは行く方法ではありません。私の答えの関数がスタックの不均衡の警告につながる場合は、あなたが持っているC関数の宣言が実際の関数と一致していないことがわかります。 –

+0

ご協力ありがとうございました! –

関連する問題