2009-07-28 7 views
13

Tôi có cấu trúC++ C sauLàm thế nào để sắp xếp một mảng có kích thước biến của các cấu trúc? C# và C++ interop giúp đỡ

struct InnerStruct 
{ 
    int A; 
    int B; 
}; 

struct OuterStruct 
{ 
    int numberStructs; 
    InnerStruct* innerStructs; 
}; 

Và một hàm C++

OuterStruct getStructs(); 

Làm thế nào tôi có thể sắp xếp này để C#? Trong trường hợp các định nghĩa C# là

struct OuterStruct { 
    InnerStruct[] innerStructs; 
}; 

Trả lời

21

Bạn sẽ phải làm điều này bằng tay, vì không có cách nào để nói với P/Gọi lớp bao nhiêu dữ liệu để marshal từ C++ trở lại giá trị.

struct OuterStruct { 
    int numberStructs; 
    IntPtr innerStructs; 
}; 

OuterStruct s = getStructs(); // using DllImport 
var structSize = Marshal.SizeOf(typeof(InnerStruct)); 
var innerStructs = new List<InnerStruct>(); 
var ptr = s.innerStructs; 

for (int i = 0; i < s.numberStructs; i++) 
{ 
    innerStructs.Add((InnerStruct)Marshal.PtrToStructure(ptr, 
     typeof(InnerStruct)); 
    ptr = ptr + structSize; 
} 

Lưu ý rằng nếu bạn muốn giải phóng bộ nhớ cho innerStructs từ mã # C của bạn, bạn phải sử dụng bộ cấp phát chuẩn CoTaskMemAlloc trong C++ mã - sau đó bạn có thể gọi Marshal.CoTaskMemFree để giải phóng innerStructs.

+0

Người đàn ông tuyệt vời, cảm ơn rất nhiều. Ngoài ra, như một câu hỏi nhanh, liệu có thể So sánh một vectơ, để tôi có thể có OuterStruct có một vector của InnerStructs không? Tôi biết bạn không thể so sánh các lớp học, nhưng tôi nghĩ rằng có lẽ ai đó đã viết một điều gì đó phức tạp để làm điều này. – DevDevDev

+0

Không phải là tôi biết, nhưng tôi chưa bao giờ nhìn. :-) –

+0

Bạn đưa con trỏ tới 'int'? Điều gì xảy ra nếu nó đang chạy trong một quá trình 64-bit ?! [Bạn không cần các phôi] (https://msdn.microsoft.com/en-us/library/system.intptr.op_addition (v = vs.110) .aspx) – doug65536