Как преобразовать PInvoke `<[In] (), Out ()> ByRef` в C #? - PullRequest
0 голосов
/ 05 сентября 2018

У меня есть функция с этого VB.net, которую нужно импортировать в C #. Я пробовал различные конвертеры VB.NET в C #, но он не работает правильно с импортированной DLL, связанной с этой функцией. Любой знает, как правильно преобразовать следующую функцию VB в C #:

  <DllImport("E5KDAQ.dll")> _
  Public Function E5K_ReadDIStatus(ByVal id As Short,<[In](),Out()> ByRef chnval As Integer) As Short
  End Function

Используя онлайн-конвертер, он дает следующее: Конвертировать c # с ошибкой

[DllImport("E5KDAQ.dll")]
public static extern short E5K_ReadDIStatus(short id, [In()] out int chnval);

enter image description here

Ответы [ 2 ]

0 голосов
/ 05 сентября 2018

Из официальной документации здесь: http://www.acceed.de/manuals/inlog/EDAM5000_Manual.pdf есть определение C ++, плюс немного документации о том, что является вторым параметром, и это действительно то, что вы хотите посмотреть:

VC ++: (см. E5KDAQ.h)

unsigned short E5K_ReadDIStatus (int id, unsigned long *Didata);

Параметры:

id: идентификатор модуля, адрес

Didata: указывает на 32-битный буфер для хранения статуса DI

Таким образом, определение C # должно быть просто (long и int в C ++ 32-битные)

[DllImport("E5KDAQ")]
static extern ushort E5K_ReadDIStatus(int id, ref uint Didata)
0 голосов
/ 05 сентября 2018

Вы можете использовать это.

public static extern short E5K_ReadDIStatus(short id, ref int[] chnval)

Ссылка: Являются ли атрибуты P / Invoke [In, Out] необязательными для маршалинга массивов?

...