Ich habe versucht, ein Handle zu einem Strukturtyp zu erstellen, weil ich einen gepinnten Zeiger darauf brauche, aber ich bekomme den Fehler "Objekt enthält nicht primitive oder nicht blitfähig Daten "Wie ordne ich GCHandle der Struktur zu, wenn die Struktur bool enthält
Meine Struktur sieht wie folgt aus:
[StructLayout(LayoutKind.Sequential)]
public struct MyStruct
{
[MarshalAs(UnmanagedType.U1)]
public bool Test;
}
Nun, wenn ich rufe,
var mystruct = new MyStruct();
var handle = GCHandle.Alloc(mystruct, GCHandleType.Pinned);
ich den Fehler" Objekt enthält nicht-primitive oder nicht-blitfähig Daten ". Jetzt verstehe ich, dass das Bool-Feld ein nicht-blitbarer Typ ist. Aber ich hatte den Eindruck, dass ich durch Hinzufügen des MarshalAs-Attributs dem Marshaller sagen konnte, wie man den Typ umwandelt. (Ich habe auch versucht UnmanagedType.Bool
)
Diese Struktur muss global definiert werden, weil es in meiner Klasse benötigt wird. Der einzige Grund, warum ich den Zeiger brauche, ist, weil ich eine nicht verwaltete API habe, die diese Struktur als Zeiger übergeben muss. Dann muss ich diese Struktur in einem Callback bekommen und Mitglieder lesen/aktualisieren.
Das ist also das Basisszenario.
- Struktur ist global angelegt in einer verwalteten Klasse
- Zeiger auf Struktur erhalten wird
- Zeiger auf die Struktur in die API übergeben
- Die API eine statische Methode Rückrufe, wo ich muss dann bekommen Meine Struktur und lese/aktualisiere Mitglieder.
Ich versuchte Marshal.StructureToPtr
zu verwenden, aber das schafft nur eine Kopie, so dass, wenn in meinem verwalteten Klasse I das Element aktualisieren, wenn der Rückruf ausgelöst wird, wird der aktualisierte Wert nicht da.
Weiß jemand, wie ich einen gepinnten Zeiger auf meine Struktur bekommen kann, damit ich die öffentlichen Mitglieder lesen/ändern kann und sie im Rückruf verfügbar haben?
Dank
hier ist die Liste der blitfähig Typen http://msdn.microsoft.com/en-us/library/75dwhxf7.aspx – Mayank