Member 12716184 Ответов: 1

Маршаллинг 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 вместо.

1 Ответов

Рейтинг:
2

KarstenK

Это выглядит нормально, поэтому я думаю, что проблема в dll. Моя первая догадка заключается в том, что экспорт функции не является правильным.

Взгляните на код в моем статья о вызове C++ для C# или откройте dll с помощью старого доброго Ходок Зависимости.