Pinvoke DeviceIoControl-Parameter

Ich arbeite an einem C # -Projekt mitDeviceIoControl. Ich habe die verwandten konsultiertPinvoke.net Seite für meine Unterschrift:

[DllImport("Kernel32.dll", SetLastError = false, CharSet = CharSet.Auto)]
public static extern bool DeviceIoControl(
    SafeFileHandle hDevice,
    EIOControlCode IoControlCode,

    [MarshalAs(UnmanagedType.AsAny)]
    [In] object InBuffer,
    uint nInBufferSize,

    [MarshalAs(UnmanagedType.AsAny)]
    [Out] object OutBuffer,
    uint nOutBufferSize,

    out uint pBytesReturned,
    [In] IntPtr Overlapped
    );

Ich hatte noch nie gesehenobject und[MarshalAs(UnmanagedType.AsAny)] vorher, aber dieMSDN-Dokumentation klang vielversprechend:

Ein dynamischer Typ, der den Typ eines Objekts zur Laufzeit bestimmt und das Objekt als diesen Typ marshallt. Dieses Mitglied ist nur für Plattformaufrufmethoden gültig.

Meine Frage ist: Was ist die "beste" und / oder "richtige" Art, diese Signatur zu verwenden?

Zum Beispiel,IOCTL_STORAGE_QUERY_PROPERTY erwartetInBuffer ein ... zu seinSTORAGE_PROPERTY_QUERY Struktur. Es scheint, als ob ich in der Lage sein sollte, diese Struktur zu definieren und eine zu erstellennew Instanz, und übergeben Sie es an meine Pinvoke-Signatur:

var query = new STORAGE_PROPERTY_QUERY { PropertyId = 0, QueryType = 0 };
DeviceIoControl(..., query, Marshal.SizeOf(query), ...);

Allerdings habe ich gerade eineSystem.ExecutionEngineException da ich das gemacht habe, habe ich etwas geändert wie:

int cb = Marshal.SizeOf(typeof(...));
IntPtr query = Marshal.AllocHGlobal(cb);
...
Marshal.PtrToStructure(...);
Marshal.FreeHGlobal(query);

und es hat zumindest keine Ausnahmen ausgelöst, als ich es nannte. Das ist nur sehr hässlich und ein großer Schmerz im Hintern. Kann der Marshaller das Kopieren von Daten zu / von meinen lokalen Strukturen nicht so handhaben, wie ich es mir erhofft hatte?

Die Ausgabedaten können manchmal schwierig sein, da es sich nicht um Strukturen mit fester Größe handelt. Ich verstehe, dass der Marshaller das unmöglich automatisch erledigen kann, und ich bin damit einverstanden, das HGlobal- und Kopiergeschäft dort zu erledigen, wo ich es brauche.

Zusätzlich:

Diese Frage sah anfangs hilfreich aus, war aber nur eine falsche Konstante.

Ich bin nicht gegen die Verwendungunsafe Konstrukte. (Dasfixed-Größestruct Mitglieder benötigen dies.)

Antworten auf die Frage(1)

Ihre Antwort auf die Frage