Приветствую.
Есть библиотека на C++. Есть программа на C#, которая её использует.
В качестве параметров библиотека принимает "структуру из структуры из ссылок на функции":
public enum CallbackResult
{
OPERATION_OK,
OPERATION_ERR
}
public class LibraryMediatorClass
{
#region структуры и классы
[StructLayout(LayoutKind.Sequential, Pack = 1)]
public struct LibraryInitialContext
{
//[MarshalAs(UnmanagedType.LPStruct)]
public SetOfCallbacks callbacks;
};
[StructLayout(LayoutKind.Sequential, Pack = 1)]
public struct SetOfCallbacks
{
//[MarshalAs(UnmanagedType.LPStruct)]
public SendAPDU sendAPDU;
};
#endregion
#region переменные
[UnmanagedFunctionPointer(CallingConvention.Cdecl)]
public delegate CallbackResult SendAPDU([MarshalAs(UnmanagedType.LPStr)] String apdu, ulong apduLength, [MarshalAs(UnmanagedType.LPStr)] String response, ulong maxResponseLength, [MarshalAs(UnmanagedType.U8)] UInt64 responseLength);
[DllImport(@"com_ftc_library_lib_s.dll", CharSet = CharSet.Unicode, SetLastError = true, EntryPoint = "initializeLibrary", CallingConvention = CallingConvention.Cdecl)]
private static extern int initializeLibrary([In]LibraryInitialContext context);
#endregion
#region функции
public LibraryMediatorClass()
{
SetOfCallbacks soc = new SetOfCallbacks();
soc.sendAPDU = new SendAPDU(_SendAPDU);
LibraryInitialContext libraryInitialContext = new LibraryInitialContext();
libraryInitialContext.callbacks = soc;
int qwe = initializeLibrary(libraryInitialContext);
}
public static CallbackResult _SendAPDU([MarshalAs(UnmanagedType.LPStr)] String apdu, ulong apduLength, [MarshalAs(UnmanagedType.LPStr)] String response, ulong maxResponseLength, [MarshalAs(UnmanagedType.U8)] UInt64 responseLength)
{
return CallbackResult.OPERATION_OK;
}
#endregion
}
После запуска функция initializeLibrary возвращает Exception типа "Попытка чтения или записи в защищенную память..." Предпологаю, что неправильно объявляю структуры/классы внутри структур, которые передаются в библиотеку (закомментированные атрибуты)? Подскажите, пожалуйста, как передавать подобные данные в библиотеку С++? Что я делаю не так?
Спасибо большое!