2009-04-08 34 views
8

tôi đã cơ cấu như sau trong C#:Làm thế nào để marshall mảng của cấu trúc trong C#?

[StructLayoutAttribute(LayoutKind.Sequential)] 
public struct RECORD 
{ 
    public uint m1; 
    public uint m2; 
    public uint m3; 
} 

tôi cần vượt qua một quá mảng (chiều dài cố định) của các cấu trúc giao cho Mã nguồn gốc, mà viết một số dữ liệu để cấu trúc này. Mảng được cấp phát trong C# và được chuyển qua dll C. Tôi đã tuyên bố chức năng được nhập là:

[DllImport("marshall.dll", CallingConvention = CallingConvention.Cdecl)] 
private static extern void doIt(RECORD[] dataRecord); 

nhưng tôi không nhận lại bất kỳ dữ liệu nào. Tôi đã thử PInvoke Interop Assistant. Tôi có nên sử dụng IntPtr ở đây không? Bất kỳ ý tưởng?

Edit:

Đây là mã C# để gọi hàm mẹ đẻ:

RECORD[] rec = new RECORD[256]; 
doIt(rec); 
// values of rec are all zero here 

Dưới đây là hàm C:

int doIt(RECORD* rec) 
{ 
    // deref pointer and write some data 
} 

Trả lời

13

Tôi xa một P/Gọi chuyên gia, nhưng tôi tự hỏi nếu làm cho nó tham số vào/ra có thể giúp:

DllImport("marshall.dll", CallingConvention = CallingConvention.Cdecl)] 
private static extern void doIt([In, Out] RECORD[] dataRecord); 

Tôi sẽ không có được mong đợi cần thiết, như với LayoutKind.Sequential Tôi hy vọng rằng cấu trúc của bạn đã là một loại blittable, và rằng mảng sẽ blittable quá.

+0

Điều đó đã thực hiện mẹo, thx. Có những nơi khác mà những từ khóa này được sử dụng không? Tôi không bao giờ thấy chúng trước – SDD

+1

Từ MSDN: [tham chiếu đến các mảng có thể blittable] Tuy nhiên, các loại này thực sự được sắp xếp theo tham số và bạn phải áp dụng thuộc tính InAttribute và OutAttribute nếu bạn muốn sắp xếp đối số dưới dạng Tham số vào/ra. – SDD

+0

Cảm ơn điều này đã làm việc cho tôi - và kết thúc cuộc đấu tranh hai giờ để hoàn thành công việc này. –

Các vấn đề liên quan