2009-07-28 5 views

Antwort

21

ist werden Sie müssen dies manuell tun, da es keine Möglichkeit gibt, die P zu sagen/Invoke Schicht, wie viele Daten von Ihrem C++ Marschall Wert zurück.

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

Beachten Sie, wenn Sie den Speicher für innerStructs von C# -Code befreien wollen, müssen Sie die Standard-Allocator verwenden CoTaskMemAlloc in Ihrem C++ Code - dann können Sie Marshal.CoTaskMemFree rufen innerStructs zu befreien.

+0

Cooler Mann, vielen Dank. Auch als eine schnelle Frage, ist es möglich, einen Vektor zu marshallen, so dass ich OuterStruct einfach einen Vektor von InnerStructs haben kann? Ich weiß, dass du keinen Unterricht organisieren kannst, aber ich dachte, dass jemand etwas Schwieriges geschrieben hat, um das zu tun. – DevDevDev

+0

Nicht, dass ich weiß, aber ich habe nie gesucht. :-) –

+0

Sie werfen den Zeiger auf 'int'? Was passiert, wenn es in einem 64-Bit-Prozess läuft ?! [Sie brauchen die Casts nicht] (https://msdn.microsoft.com/en-us/library/system.intptr.op_addition (v = vs.110) .aspx) – doug65536