Frage

In einem Versuch, zu lernen PInvoke in C # zu verwenden, bin ich ein wenig unsicher, wie verschiedene Fälle mit Zeigern die einfache Werttypen zu behandeln.

Ich importiere die folgenden zwei Funktionen aus einem nicht verwalteten DLL:

public int USB4_Initialize(short* device);
public int USB4_GetCount(short device, short encoder, unsigned long* value);

Die erste Funktion verwendet den Zeiger als einen Eingang, der zweiten als Ausgang. Ihre Verwendung ist ziemlich einfach in C ++:

// Pointer as an input
short device = 0; // Always using device 0.
USB4_Initialize(&device);

// Pointer as an output
unsigned long count;
USB4_GetCount(0,0,&count); // count is output

Mein erster Versuch in C # Ergebnisse in der folgenden P / Ruft:

[DllImport("USB4.dll")]
public static extern int USB4_Initialize(IntPtr deviceCount); //short*

[DllImport("USB4.dll")]
public static extern int USB4_GetCount(short deviceNumber, short encoder, IntPtr value); //ulong*

Wie verwende ich diese Funktionen in C # in der gleichen Weise wie bei der C ++ Code oben? Gibt es einen besseren Weg, um diese Arten zu erklären, vielleicht MarshalAs mit?

War es hilfreich?

Lösung

Wenn der Zeiger auf einen einzigen primitiven Typen ist und nicht ein Array verwenden ref / heraus die Parameter zu beschreiben

[DllImport("USB4.dll")]
public static extern int USB4_Initialize(ref short deviceCount);

[DllImport("USB4.dll")]
public static extern int USB4_GetCount(short deviceNumber, short encoder, ref uint32 value)

In diesen Beispielen aus ist wahrscheinlich besser geeignet, aber entweder funktioniert.

Andere Tipps

Die .NET-Laufzeit eine Menge dieser Umwandlung tun können (bezeichnet als „Marshalling“) für Sie. Während eine explizite IntPtr wird immer genau das tun, was Sie ihm sagen, können Sie wahrscheinlich das ref Schlüsselwort für einen Zeiger so ersetzen.

[DllImport("USB4.dll")]
public static extern int USB4_Initialize(ref short deviceCount); //short*

[DllImport("USB4.dll")]
public static extern int USB4_GetCount(short deviceNumber, short encoder, ref short value); //ulong*

Sie können sie dann wie folgt aufrufen:

short count = 0;

USB4_Initialize(ref count);

// use the count variable now.
Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top