Маршаллинг C# (C# call C++ DLL)
Не могли бы вы, ребята, помочь мне решить следующую проблему?
У меня есть dll-библиотека функций C++, и она будет вызвана другим приложением C#.
Одна из функций, которые мне нужны, заключается в следующем:
unsigned long makeArray(unsigned char* sendArr, unsigned long sendArrLen, unsigned char *recvArr, unsigned long *recvArrLen);<pre>
Что я уже пробовал:
Я написал следующий код на языке Си#:
[DllImport("test.dll", CallingConvention = CallingConvention.Cdecl)] public static extern ulong makeArray(byte[] sendArr, ulong sendArrLen, byte[] recvArr, ulong recvArrLen); private byte[] MakeArray() { byte[] arrSend = new byte[] { 0x00, 0x12, 0x34 }; ulong nRecvArrLen = 0; byte[] arrRecv = null; // assign in c++ dll function (variable size) if(makeArray(arrSend, (ulong)arrSend.Length, arrRecv, nRecvArrLen) == 1) //System.AccessViolationException { return arrRecv; } return null; }
К сожалению, приведенный выше код не работает...
(Ошибка - " Система.AccessViolationException". не " EntryPointNotFoundException")
Могу ли я узнать, как я могу передать указатель на указатель в функцию C++?
Если это невозможно,есть ли какой-нибудь обходной путь?
Спасибо.
Richard Deeming
unsigned long *recvArrLen ulong recvArrLen
Этот параметр, похоже, не совпадает. Версия C++ - это указатель на 64-битное целое число; версия C# - это 64-битное целое число.
Попробуйте изменить объявление C# на
ref ulong recvArrLen
вместо.