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
}
Đ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
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
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. –