Как мне вызвать / вызвать Marshal C ++ "const uint64_t *" в C#? - PullRequest
1 голос
/ 29 апреля 2020

В прошлом я работал с несколькими неуправляемыми DLL-библиотеками C ++, но столкнулся с типом, которого никогда раньше не видел. Мои первые попытки вызвать его привели к взрывам. :)

Вот сигнатура функции C ++:

 DLL_EXPORTS int MUSH_ProcessBuffer(uint64_t NumEntries, const uint64_t* AbsTimeNs, const uint64_t* Events);

И AbsTimeNs, и события предназначены для массивов длинных без знака, которые передаются в моем коде C#. NumEntries - это длина соответствующих массивов.

Я пробовал оба из следующих действий:

[DllImport("mush.dll", CallingConvention = CallingConvention.StdCall)]
public static extern int MUSH_ProcessBuffer(UInt64 NumEntries, ref ulong[] AbsTimeNS, ref ulong[] Events);

[DllImport("mush.dll", CallingConvention = CallingConvention.StdCall)]
public static extern int MUSH_ProcessBuffer(UInt64 NumEntries, ref UInt64[] AbsTimeNS, ref UInt64[] Events);

Ни одна не работала ... У меня возникла исключительная ситуация: {"Попытка чтения или записи Защищенная память. Это часто указывает на то, что другая память повреждена. "} Я не уверен, что у меня неправильный тип, или это связано с" const "в сигнатуре функции или чем. В случае, если это то, что я передаю, а не сам пинвоук ... вот код C#:

ulong[] timeArray = absTimes.ToArray();
ulong[] eventArray = events.ToArray();

NativeMethods.MUSH_ProcessBuffer((ulong)absTimes.Count, ref timeArray, ref eventArray);

1 Ответ

2 голосов
/ 29 апреля 2020

Вам необходимо удалить ключевые слова ref в определении метода.

Массив уже передан по ссылке, добавление ref дает вам дополнительный указатель на эту ссылку.

В C это будет const uint64_t** вместо const uint64_t*.

Итак:

[DllImport("mush.dll", CallingConvention = CallingConvention.StdCall)]
public static extern int MUSH_ProcessBuffer(ulong NumEntries, ulong[] AbsTimeNS, ulong[] Events);
...