2009-09-14 9 views
7

En un intento de aprender a utilizar PInvoke en C#, no estoy seguro de cómo manejar varios casos con punteros que involucran tipos de valores simples.Cómo invocar cuando hay punteros involucrados

estoy importando los siguientes dos funciones de un archivo DLL no administrado:

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

La primera función utiliza el puntero como una entrada, la segunda como una salida. Su uso es bastante 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 

Mi primer intento en C# los resultados en la siguiente P/Invoca:

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

¿Cómo se utilizan estas funciones en C# en la misma forma que el C++ código de arriba? ¿Existe alguna forma mejor de declarar estos tipos, quizás usando MarshalAs?

+0

Hey, USB 4 ya? Todavía estoy esperando 3.0 –

+1

Ojalá. No tiene nada que ver con USB4. Este es solo un dispositivo USB que la compañía tiene para conectarse a un codificador, y dado que es la 4ª revisión de su producto, estúpidamente llamaron al producto USB4. –

Respuesta

12

Si el puntero se encuentra a un solo tipo primitivo y no una matriz, usa ref de entrada/salida para describir el parámetro

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

En estos ejemplos fuera es probablemente más apropiado, pero tampoco va a funcionar.

+0

Entonces, en GetCount() puedo usar out en lugar de ref? –

+0

Veo, esto es exactamente lo que estaba esperando. Gracias. –

+0

Sí iba a decir lo mismo, excepto para tener fuera en la definición de USB4_GetCount – zebrabox

0

El .NET runtime puede hacer una gran cantidad de esa conversión (referida como "cálculo de referencias") para usted. Mientras que un IntPtr explícito siempre hará EXACTAMENTE lo que le diga, puede sustituir la palabra clave ref por un puntero como ese.

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

A continuación, se les puede llamar así:

short count = 0; 

USB4_Initialize(ref count); 

// use the count variable now. 
Cuestiones relacionadas