C#PInvoke out字符串声明

aki*_*kif 9 c# parameters pinvoke stringbuilder out

在C#PInvoke中,如何传递字符串缓冲区以便C DLL填充它并返回?PInvoke宣言是什么?

C函数声明是

int GetData(char* data, int buflength);
Run Code Online (Sandbox Code Playgroud)

在C#中,我已将其声明为

[DllImport(DllName)]
static extern Int32 GetData([MarshalAs(UnmanagedType.LPStr)]StringBuilder receiveddata, Int32 buflen);
Run Code Online (Sandbox Code Playgroud)

这是对的吗?我像这样传递StringBuilder变量

int bufferLength = 32;
StringBuilder data = new StringBuilder(bufferLength);
int result = GetData(data, bufferLength);
Run Code Online (Sandbox Code Playgroud)

我想知道它是否正确?

谢谢

Gre*_*osz 9

我相信这是正确的.

[DllImport(DllName)]
static extern int GetData(StringBuilder data, int length);
Run Code Online (Sandbox Code Playgroud)

这被称为:

StringBuilder data = new StringBuilder(32);
GetData(data, data.Capacity);
Run Code Online (Sandbox Code Playgroud)

我曾经希望对我的函数返回的字节有更多的控制权,并且这样做:

[DllImport(DllName)]
private unsafe static bool GetData(byte* data, int length);
Run Code Online (Sandbox Code Playgroud)

像这样使用:

byte[] bytes = new byte[length];

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

  if (!success)
    Library.GetError();

  return Encoding.UTF8.GetString(bytes);
}
Run Code Online (Sandbox Code Playgroud)