Возврат строк в виде структур из С++ 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;
ИИ поможет Вам:
- решить любую задачу по программированию
- объяснить код
- расставить комментарии в коде
- и т.д