2010-01-03 56 views
7

在C#PInvoke中,如何传递字符串缓冲区,以便C DLL填充它并返回?什么是PInvoke声明?C#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); 

我想知道的是它正确与否?

谢谢

+0

这是正确的,如果它的工作原理。没有明显的理由不应该起作用。 – 2010-01-03 11:20:13

回答

7

我相信这是正确的。

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

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

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

像这样:

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