22

DotNet1.1を使用していたときにC#でこの問題が発生しました

問題はこれです。私は管理されていない dll を持っています。これには、(他の引数の中でも) 関数ポインターを受け取る関数があります。C# コードで DLLImport を宣言するときに、デリゲートを渡します。ただし、C# のデリゲートにはstdcall呼び出し規約がありますが、アンマネージ関数にはcdecl関数ポインターが必要です。したがって、私の素朴なアプローチはクラッシュを引き起こしました。http://www.codeproject.com/KB/cs/cdeclcallback.aspxある人が、私が理解しているように、MSIL ハッキングによってデリゲートの呼び出し規約を変更できる優れたライブラリを作成しました物事はうまくいった、まで...

VS2008 と新しいバージョンの .NET に移行しました。このバージョンでは、上記のライブラリは動作しません。私は実際には C# や .NET の専門家ではありません。実を言うと、彼のライブラリが何をするものなのかほとんど理解していません (オープン ソースではありますが)。ただし、C# の新しいバージョンには、私の問題に対するより良い解決策があることを願っています。

だから、SOの専門家、お尻の痛みを手伝ってください:)

4

1 に答える 1

49

デフォルトでは、p/invoke システムはデリゲートを stdcall 関数にラップします。UnmanagedFunctionPointer属性を使用して、生成されたラッパーの呼び出し規約を変更できます。

[UnmanagedFunctionPointer(CallingConvention.Cdecl)]
public delegate void MyDelegate();
于 2011-03-01T13:38:09.790 に答える