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

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

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

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

Решение задачи: «Возврат строк в виде структур из С++ 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;

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


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

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

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