Как правильно передать объект из C# в библиотеку C++?
От: lesovick Россия  
Дата: 19.12.17 08:49
Оценка:
Приветствую.

Есть библиотека на 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 типа "Попытка чтения или записи в защищенную память..." Предпологаю, что неправильно объявляю структуры/классы внутри структур, которые передаются в библиотеку (закомментированные атрибуты)? Подскажите, пожалуйста, как передавать подобные данные в библиотеку С++? Что я делаю не так?

Спасибо большое!
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.