2010-01-03 36 views
7

Trong C# PInvoke, làm thế nào để vượt qua một bộ đệm chuỗi để các DLL C điền vào nó và trả về? Tuyên bố PInvoke sẽ là gì?C# PInvoke ra tuyên bố dây

Việc kê khai chức năng C là

int GetData(char* data, int buflength); 

Trong C#, tôi đã tuyên bố nó như

[DllImport(DllName)] 
static extern Int32 GetData([MarshalAs(UnmanagedType.LPStr)]StringBuilder receiveddata, Int32 buflen); 

Is it correct? Tôi đang chuyển biến StringBuilder như thế này

int bufferLength = 32; 
StringBuilder data = new StringBuilder(bufferLength); 
int result = GetData(data, bufferLength); 

Tôi muốn biết nó có chính xác hay không?

Cảm ơn

+0

Nó là đúng nếu nó hoạt động. Không có lý do rõ ràng nó không nên hoạt động. –

Trả lời

7

Tôi tin là đúng.

[DllImport(DllName)] 
static extern int GetData(StringBuilder data, int length); 

được gọi là như thế này:

StringBuilder data = new StringBuilder(32); 
GetData(data, data.Capacity); 

Tôi đã từng muốn có kiểm soát tốt hơn các byte được trả về bởi chức năng của tôi và đã làm điều đó như thế này:

[DllImport(DllName)] 
private unsafe static bool GetData(byte* data, int length); 

sử dụng như thế này :

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

Tôi làm không nghĩ rằng sử dụng thuộc tính MarshalAs cần thiết ở đây. StringBuilder là một lựa chọn đúng cho char * out.

Tôi đoán sẽ tốt hơn khi thêm thuộc tính CharSet vì bạn đang xử lý chuỗi ở đây.

Như thế này:

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