.NET 4.x Маршалинг и структура - C#
Формулировка задачи:
Добрый день, товарищи.
Есть библиотека С++, в которой имеется структура и метод с нею работающий:
Пытаюсь заюзать длл в C# коде вот так:
Проблема в том, что SecondName выводится кракозяброй.
Почему - варианты были разные: игнорирование Unicode где то, неверный тип данных (вместо string использовал еще char[], string[] - результат тот же).
Есть предположение, что в С++ нужно wchar_t менять на TCHAR, но библиотека не моя - поменять не могу.
struct MyCPPStruct { char firstName[100]; wchar_t lastName[200]; }; void SetManInfo(MyCPPStruct *myStruct)
[StructLayout(LayoutKind.Sequential, CharSet = CharSet.Unicode)] internal struct MyCSharpStruct { [MarshalAs(UnmanagedType.ByValTStr, SizeConst = 100)] public string FirstName; [MarshalAs(UnmanagedType.ByValTStr, SizeConst = 200)] public string LastName; }; [DllImport("MyTestLib.dll", EntryPoint = "_SetManInfo", CharSet = CharSet.Unicode, CallingConvention = CallingConvention.Cdecl, ExactSpelling = true)] internal static extern void SetManInfo(IntPtr myStruct); // Вот так применяю try { var manInfo = new MyCSharpStruct { FirstName = "Vasya", SecondName = "Pupkin" }; IntPtr manInfoPtr = Marshal.AllocCoTaskMem(Marshal.SizeOf(typeof(MyCSharpStruct))); Marshal.StructureToPtr(manInfo, manInfoPtr, false); Wrapper.SetManInfo(manInfoPtr); } catch (Exception) { return false; }
Решение задачи: «.NET 4.x Маршалинг и структура»
textual
Листинг программы
[StructLayout(LayoutKind.Sequential)] struct Test { [MarshalAs(UnmanagedType.ByValArray, SizeConst = 100)] public byte[] FirstName; [MarshalAs(UnmanagedType.ByValArray, SizeConst = 400)] public byte[] LastName; }
ИИ поможет Вам:
- решить любую задачу по программированию
- объяснить код
- расставить комментарии в коде
- и т.д