.NET 4.x Маршалинг и структура - C#

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

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

Добрый день, товарищи. Есть библиотека С++, в которой имеется структура и метод с нею работающий:
struct MyCPPStruct
{
  char firstName[100];
  wchar_t lastName[200];
};
 
void SetManInfo(MyCPPStruct *myStruct)
Пытаюсь заюзать длл в C# коде вот так:
[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;
}
Проблема в том, что SecondName выводится кракозяброй. Почему - варианты были разные: игнорирование Unicode где то, неверный тип данных (вместо string использовал еще char[], string[] - результат тот же). Есть предположение, что в С++ нужно wchar_t менять на TCHAR, но библиотека не моя - поменять не могу.

Решение задачи: «.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;
}

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


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

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

14   голосов , оценка 4.143 из 5
Похожие ответы