C#PInvoke out字符串声明

在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); 

我想知道它是否正确?

谢谢

我相信这是正确的。

 [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); } 

我不认为在这里使用MarshalAs属性是必要的。 StringBuilder是char * out的正确选择。

我想添加CharSet属性会很好,因为你在这里处理字符串。

像这样:

 [DllImport(DllName, CharSet=CharSet.Auto)]