Возврат строк в виде структур из С++ dll - C#
Формулировка задачи:
День добрый заглянувшим.
Появился такой вот оригинальный вопрос.
Имеется С++ Dll (моя), которая работает на каллбеках и в каллбеках должна передавать структуры типа
Собственно проблема в том, что как только в структуре появляется поле char text[], комплятор начинает ругань про
Собственно вопрос - каким образом можно получить такую структуру из DLL. (При использовании указателей IntPtr и char* ,соответственно, начинается проблема - при копировании структуры, запись данных вылазит за пределы структуры и сметает всё за ними).
Что я пробовал
Не соответствует pInvoke бла бла.
Работает, копирует, перезаписывает всё на 255 байт после адреса структуры, портя все остальные данные.
Попытка чтения или записи в защищенную память. Это часто свидетельствует о том, что другая память повреждена.
Собственно проблема именно в возврате структуры. При выделении памяти под структуру и передаче в dll для заполнения проблемы нет. Но в DLL имеются событийные вызовы каллбеков с возвращаемыми структурами, под которые выделить память заранее не представляется возможным.
Листинг программы
- struct myData
- {
- char text[255];
- }
Необработанное исключение типа "System.Runtime.InteropServices.MarshalDirectiveException" в CSharpGetDll.exe
Дополнительные сведения: Сигнатура типа метода не совместима с PInvoke.
Листинг программы
- [StructLayout(LayoutKind.Sequential, CharSet = CharSet.Auto, Pack =1)]
- public unsafe struct charStruct
- {
- [MarshalAs(UnmanagedType.ByValArray, SizeConst= 255)]
- public byte[] path;
- }
Листинг программы
- [StructLayout(LayoutKind.Sequential, CharSet = CharSet.Auto, Pack =1)]
- public unsafe struct charStruct
- {
- public IntPtr path;
- }
Листинг программы
- [StructLayout(LayoutKind.Sequential, CharSet = CharSet.Auto, Pack =1)]
- public unsafe struct charStruct
- {
- public fixed char path[255];
- }
Решение задачи: «Возврат строк в виде структур из С++ dll»
textual
Листинг программы
- public struct intStruct
- {
- public int a;
- public int b;
- }
- [StructLayout(LayoutKind.Sequential)]
- unsafe struct middleDeviceStruct
- {
- public int count;
- [MarshalAs(UnmanagedType.ByValArray, SizeConst = 2)]
- public intStruct[] list;
- };
- [StructLayout(LayoutKind.Sequential)]
- unsafe struct hardDeviceStruct
- {
- public int count;
- //public IntPtr list;
- public intStruct* list;
- };
- [DllImport(dllName, EntryPoint = "middleDevice", CallingConvention = CallingConvention.Cdecl)]
- internal static extern IntPtr middleDevice(out middleDeviceStruct s);
- [DllImport(dllName, EntryPoint = "hardDevice", CallingConvention = CallingConvention.Cdecl)]
- internal static extern hardDeviceStruct hardDevice();
- middleDeviceStruct md;
- ass.middleDevice(out md);
- hardDeviceStruct hd = ass.hardDevice();
- int a1 = hd.list[0].a;
- int a2 = hd.list[1].a;
- int a3 = hd.list[2].a;
ИИ поможет Вам:
- решить любую задачу по программированию
- объяснить код
- расставить комментарии в коде
- и т.д