6

重複の可能性:
pinvokestackimbalance — どうすればこれを修正したりオフにしたりできますか?

c# コードから c++ dll ライブラリ (ソース コードがありません) にアクセスする必要があります。

たとえば、次の関数:

UINT32 myfunc1()
UINT32 myfunc2(IN char * var1)
UINT32 myfunc3(IN char * var1, OUT UINT32 * var2)

myfunc1 の場合、次のコードを使用しても問題はありません。

[DllImport("mydll.dll")]
public static extern int myfunc1();

一方、myfunc2 と myfunc3 は使用できませんでした。myfunc2 については、次のことを試しました:(そして他の多くの人は必死に)

[DllImport("mydll.dll")]
public static extern int myfunc2(string var1);

[DllImport("mydll.dll")]
public static extern int myfunc2([MarshalAs(UnmanagedType.LPStr)] string var1);

[DllImport("mydll.dll")]
public static extern int myfunc2(char[] var1);

しかし、それらのすべてが次のエラーを出しました: "Managed Debugging Assistant 'PInvokeStackImbalance' has detected a problem in 'C:\Users\....\myproject\bin\Debug\myproj.vshost.exe'.

追加情報: PInvoke 関数の呼び出しにより'myproject!myproject.mydll::myfunc2'、スタックのバランスが崩れました。これは、マネージド PInvoke 署名がアンマネージド ターゲット シグネチャと一致しないことが原因である可能性があります。PInvoke シグネチャの呼び出し規約とパラメーターがターゲットのアンマネージド シグネチャと一致することを確認してください。」

私が何をすべきかについてのガイドをお願いします。

4

2 に答える 2

5

C++ 関数はcdecl呼び出し規約を使用しますが、の既定の呼び出し規約はDllImportですstdcall。この呼び出し規約の不一致は、スタックの不均衡な MDA エラーの最も一般的な原因です。

呼び出し規約を一致させることで問題を解決します。これを行う最も簡単な方法は、次のように指定するcdeclように C# コードを変更することです。

[DllImport("mydll.dll", CallingConvention=CallingConvention.Cdecl)]
public static extern int myfunc2(string var1);
于 2013-01-07T10:52:23.493 に答える
0

文字セットの不一致かもしれません これを試してください

[DllImport("mydll.dll", CharSet = CharSet.Ansi)]
public static extern int SendText([MarshalAs(UnmanagedType.LPStr)] string var1);

ニックネーム:

DLL import char * C# からのポインタ

于 2013-01-07T10:31:00.457 に答える