Question

Dans une tentative pour apprendre à utiliser PInvoke en C #, je ne suis pas certain de savoir comment gérer divers cas avec des pointeurs impliquant des types de valeur simples.

J'importe les deux fonctions suivantes à partir d'une DLL non gérée:

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

La première fonction utilise le pointeur comme entrée, la seconde comme sortie. Leur utilisation est assez simple en 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

Ma première tentative en C # a pour résultat le P / Invokes suivant:

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

Comment utiliser ces fonctions en C # de la même manière que le code C ++ ci-dessus? Existe-t-il un meilleur moyen de déclarer ces types, en utilisant peut-être MarshalAs ? <

Était-ce utile?

La solution

Si le pointeur est sur un seul type primitif et non sur un tableau, utilisez ref / out pour décrire le paramètre

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

Dans ces exemples, out est probablement plus approprié, mais l’un ou l’autre fonctionnera.

Autres conseils

Le runtime .NET peut effectuer une grande partie de cette conversion (appelée "marshaling") pour vous. Même si un IntPtr explicite fera toujours EXACTEMENT ce que vous lui dites, vous pouvez probablement remplacer le mot clé ref par un pointeur comme celui-ci.

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

Vous pouvez ensuite les appeler comme suit:

short count = 0;

USB4_Initialize(ref count);

// use the count variable now.
Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top