.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;
}