2009-07-28 11 views

cevap

21

olduğunda değeri döndürmek ++ sizin C'den sıralamakta ne kadar veri katmanı çağırır/P anlatmak için bir yolu yoktur beri, el ile yapmak gerekecek. o zaman innerStructs boşaltmak için Marshal.CoTaskMemFree çağırabilir - Eğer C# kodu innerStructs için belleği boşaltmak istiyorsanız, size C++ kodunda standart ayırıcı CoTaskMemAlloc kullanmak zorunda olduğu

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; 
} 

Not.

+0

Harika adam, çok teşekkürler. Ayrıca, hızlı bir soru olarak, bir vektörü Mareşal'e mümkün kılacak, böylece OuterStruct'ın bir InnerStructs vektörüne sahip olabilmem mümkün mü? Sınıfları marş edemeyeceğinizi biliyorum, ama belki de birinin bunu yapmak için zor bir şey yazdığını düşündüm. – DevDevDev

+0

Bildiğimden değil ama bakmadım. :-) –

+0

İşaretçiyi "int" 'ye çeviriyor musunuz? Ya 64-bit bir süreçte çalışıyorsa ?! [Atmalara ihtiyacınız yok] (https://msdn.microsoft.com/en-us/library/system.intptr.op_addition (v = vs.110) .aspx) – doug65536