2010-01-03 107 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)]