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 回答