Domanda

Nel tentativo di imparare a usare PInvoke in C #, non sono sicuro di come gestire vari casi con puntatori che coinvolgono tipi di valore semplici.

Sto importando le seguenti due funzioni da una DLL non gestita:

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

La prima funzione utilizza il puntatore come input, la seconda come output. Il loro utilizzo è abbastanza semplice 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

Il mio primo tentativo in C # porta al seguente P / Invokes:

[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*

Come posso usare queste funzioni in C # allo stesso modo del codice C ++ sopra? Esiste un modo migliore per dichiarare questi tipi, magari usando MarshalAs ?

È stato utile?

Soluzione

Se il puntatore si riferisce a un singolo tipo di primitiva e non a un array, utilizzare ref / out per descrivere il parametro

[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 questi esempi è probabilmente più appropriato uscire ma funzionerà.

Altri suggerimenti

Il runtime .NET può eseguire gran parte di tale conversione (definita come "marshalling") per te. Mentre un IntPtr esplicito farà sempre ESATTAMENTE ciò a cui lo dici, puoi probabilmente sostituire la parola chiave ref con un puntatore del genere.

[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*

Puoi quindi chiamarli in questo modo:

short count = 0;

USB4_Initialize(ref count);

// use the count variable now.
Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top