Я пытаюсь сделать вызов из C # в функцию c ++ в DLL.Одним из аргументов этой функции является указатель на переменную короткого типа.
Я не делаю какой-либо причудливой структуры данных или переменных неизвестного размера.Просто короткое значение.
Когда функция DLL c ++ пытается изменить значение этой переменной, она выдает «Неуправляемое исключение 0xC0000005: Нарушение прав доступа».
Я не могу изменить источник DLL(он используется в других проектах, и я не могу его коснуться, хотя у меня есть исходный код для его отладки)
Код функции DLL c ++ (обратите внимание, что "// эта строка вызываетисключение "строка комментария в коде)
// declaration
virtual TestFunction(short __RPC_FAR *sRet) = 0;
// definition
STDMETHODIMP CABTest::TestFunction(short *sReturnValue)
{
//some
//calculations
//here
*sReturnValue = 1; //this line provoques the exception
return 0;
}
C # код, вызывающий библиотеку DLL
[DllImport("test.dll", SetLastError = true, CharSet = CharSet.Ansi, CallingConvention = CallingConvention.Cdecl)]
static extern short TestFunction(ref short sReturn);
short sMyValue = 0;
TestFunction(ref sMyValue);
Я бы ожидал, что sMyValue будет иметь значение 1, поскольку ссылка IПередача - прямой короткий тип (не причудливая структура данных), но я получаю только сбой приложения (исключение выше).
Что я могу сделать в коде C #, чтобы избежать этой проблемы?Все, что я видел при поиске похожих вопросов, требовало переписать функции C ++ (изменив «short * sReturnValue» на «short ** sReturnValue», но я не могу коснуться исходного исходного кода DLL.
Я думаю, что напишуwrapper.dll, который вызывает test.dll, но мне было интересно, есть ли прямое и более быстрое решение.