Вопрос

В попытке научиться использовать PInvoke в C # я немного не уверен, как обрабатывать различные случаи с помощью указателей, включающих простые типы значений.

Я импортирую следующие две функции из неуправляемой DLL:

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

Первая функция использует указатель в качестве ввода, вторая - в качестве вывода. Их использование довольно просто в 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

Моя первая попытка в C # приводит к следующему вызову P /:

[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 # таким же образом, как и код C ++, приведенный выше? Есть ли лучший способ объявить эти типы, возможно, с использованием MarshalAs ?

Это было полезно?

Решение

Если указатель относится к одному типу примитива, а не к массиву, используйте ref / out для описания параметра

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

В этих примерах, вероятно, более уместно, но любой из них будет работать.

Другие советы

.NET Runtime может многое сделать для вас (так называемый «маршалинг»). Хотя явный IntPtr всегда будет выполнять ТОЧНО то, что вы ему говорите, вы, вероятно, можете заменить ключевое слово ref на такой указатель.

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

Затем вы можете назвать их так:

short count = 0;

USB4_Initialize(ref count);

// use the count variable now.
Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top