9

C# PInvoke で、文字列バッファを渡して C DLL がバッファを埋めて戻るようにするにはどうすればよいですか? PInvoke 宣言はどうなりますか?

C 関数の宣言は次のとおりです。

int GetData(char* data, int buflength);

C# では、次のように宣言しました。

[DllImport(DllName)]
static extern Int32 GetData([MarshalAs(UnmanagedType.LPStr)]StringBuilder receiveddata, Int32 buflen);

それが正しいか?このように StringBuilder 変数を渡しています

int bufferLength = 32;
StringBuilder data = new StringBuilder(bufferLength);
int result = GetData(data, bufferLength);

私はそれが正しいかどうか知りたいですか?

ありがとう

4

2 に答える 2

9

私はそれが正しいと信じています。

[DllImport(DllName)]
static extern int GetData(StringBuilder data, int length);

これは次のように呼び出されます。

StringBuilder data = new StringBuilder(32);
GetData(data, data.Capacity);

私はかつて、関数によって返されたバイトをより詳細に制御したいと考えていましたが、次のようにしました。

[DllImport(DllName)]
private unsafe static bool GetData(byte* data, int length);

次のように使用します。

byte[] bytes = new byte[length];

fixed(byte* ptr = bytes)
{
  bool success = Library.GetData(ptr, length);

  if (!success)
    Library.GetError();

  return Encoding.UTF8.GetString(bytes);
}
于 2010-01-03T10:18:19.920 に答える
4

ここでは MarshalAs 属性を使用する必要はないと思います。StringBuilder は char* out の正しい選択です。

ここでは文字列を扱っているので、CharSet プロパティを追加するとよいでしょう。

このような:

[DllImport(DllName, CharSet=CharSet.Auto)]
于 2010-01-03T10:25:04.290 に答える