В прошлом я работал с несколькими неуправляемыми 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);