3

ネイティブ C++ アプリケーションで使用する C# ライブラリを作成しています。相互運用メカニズムとして C++/CLI を使用しています。

C++ から C# にコールバック関数を渡す必要があります (中間層として C++/CLI を使用)。C# ライブラリは、ゼロで終了するワイド文字の文字列を使用して C++ 関数を呼び出す必要があります。つまり、コールバック関数のプロトタイプは

Func(LPCWSTR pszString);

他にもパラメータはありますが、この説明では重要ではありません。

私はネットを検索し、使用できる Marshal.GetDelegateForFunctionPointer Method を見つけました。これの問題は、 System.String を C# から char* に変換し、探している wchar_t* に変換しないことです。

また、可能であれば、C++/CLI 部分を含むこのコード例を実現するための最良の方法は何ですか。C++/CLI dll は C# dll に依存しています。メソッドは同期的に呼び出す必要があります。

4

2 に答える 2

8

GetDelegateForFunctionPointer動作しますが、を に変換するに[MarshalAs(UnmanagedType.LPWStr)]は、デリゲート宣言のパラメーターに属性を追加する必要があります。Stringwchar_t*

delegate void MyDelegate([MarshalAs(UnmanagedType.LPWStr)] string foo)

IntPtr func = ...;
MyDelegate del = (MyDelegate)Marshal.GetDelegateForFunctionPointer(func,
                                 typeof(MyDelegate));

変更可能な文字列を渡すには、StringBuilder. アンマネージ関数が動作するためのスペースを明示的に予約する必要があります。

delegate void MyDelegate([MarshalAs(UnmanagedType.LPWStr)] StringBuilder foo)

StringBuilder sb = new StringBuilder(64); // reserve 64 characters.

del(sb);
于 2011-06-08T16:52:48.190 に答える
2

使用したい場合などは、デリゲートのようなあまり知られていないUnmanagedFunctionPointer属性を参照してください。DllImportCharSet

于 2011-07-22T03:59:50.040 に答える