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