Возврат строк в виде структур из С++ dll - C#

Узнай цену своей работы

Формулировка задачи:

День добрый заглянувшим. Появился такой вот оригинальный вопрос. Имеется С++ Dll (моя), которая работает на каллбеках и в каллбеках должна передавать структуры типа
Листинг программы
  1. struct myData
  2. {
  3. char text[255];
  4. }
Собственно проблема в том, что как только в структуре появляется поле char text[], комплятор начинает ругань про
Необработанное исключение типа "System.Runtime.InteropServices.MarshalDirectiveException" в CSharpGetDll.exe Дополнительные сведения: Сигнатура типа метода не совместима с PInvoke.
Собственно вопрос - каким образом можно получить такую структуру из DLL. (При использовании указателей IntPtr и char* ,соответственно, начинается проблема - при копировании структуры, запись данных вылазит за пределы структуры и сметает всё за ними). Что я пробовал
Листинг программы
  1. [StructLayout(LayoutKind.Sequential, CharSet = CharSet.Auto, Pack =1)]
  2. public unsafe struct charStruct
  3. {
  4. [MarshalAs(UnmanagedType.ByValArray, SizeConst= 255)]
  5. public byte[] path;
  6. }
Не соответствует pInvoke бла бла.
Листинг программы
  1. [StructLayout(LayoutKind.Sequential, CharSet = CharSet.Auto, Pack =1)]
  2. public unsafe struct charStruct
  3. {
  4. public IntPtr path;
  5. }
Работает, копирует, перезаписывает всё на 255 байт после адреса структуры, портя все остальные данные.
Листинг программы
  1. [StructLayout(LayoutKind.Sequential, CharSet = CharSet.Auto, Pack =1)]
  2. public unsafe struct charStruct
  3. {
  4. public fixed char path[255];
  5. }
Попытка чтения или записи в защищенную память. Это часто свидетельствует о том, что другая память повреждена. Собственно проблема именно в возврате структуры. При выделении памяти под структуру и передаче в dll для заполнения проблемы нет. Но в DLL имеются событийные вызовы каллбеков с возвращаемыми структурами, под которые выделить память заранее не представляется возможным.

Решение задачи: «Возврат строк в виде структур из С++ dll»

textual
Листинг программы
  1.     public struct intStruct
  2.     {
  3.         public int a;
  4.         public int b;
  5.     }
  6.  
  7.     [StructLayout(LayoutKind.Sequential)]
  8.     unsafe struct middleDeviceStruct
  9.     {
  10.         public int count;
  11.         [MarshalAs(UnmanagedType.ByValArray, SizeConst = 2)]
  12.         public intStruct[] list;
  13.     };
  14.  
  15.     [StructLayout(LayoutKind.Sequential)]
  16.     unsafe struct hardDeviceStruct
  17.     {
  18.         public int count;
  19.         //public IntPtr list;
  20.         public intStruct* list;
  21.     };
  22.  
  23.  
  24.         [DllImport(dllName, EntryPoint = "middleDevice", CallingConvention = CallingConvention.Cdecl)]
  25.         internal static extern IntPtr middleDevice(out middleDeviceStruct s);
  26.  
  27.         [DllImport(dllName, EntryPoint = "hardDevice", CallingConvention = CallingConvention.Cdecl)]
  28.         internal static extern hardDeviceStruct hardDevice();
  29.  
  30.  
  31.             middleDeviceStruct md;
  32.             ass.middleDevice(out md);
  33.  
  34.             hardDeviceStruct hd = ass.hardDevice();
  35.             int a1 = hd.list[0].a;
  36.             int a2 = hd.list[1].a;
  37.             int a3 = hd.list[2].a;

ИИ поможет Вам:


  • решить любую задачу по программированию
  • объяснить код
  • расставить комментарии в коде
  • и т.д
Попробуйте бесплатно

Оцени полезность:

7   голосов , оценка 3.857 из 5

Нужна аналогичная работа?

Оформи быстрый заказ и узнай стоимость

Бесплатно
Оформите заказ и авторы начнут откликаться уже через 10 минут