Подтвердить что ты не робот

P/Invoke, С#: unsigned char потеря байт

Im работает с файлом dll для SDK программного обеспечения, и я пытаюсь вызвать функцию для получения информации о хосте программного обеспечения.

есть две беззнаковые переменные char (HostMachineAddress, HostProgramVersion) в структуре, которую хочет функция, и кажется, что я "освобождаю" последний байт, когда я пытаюсь вызвать его из С#... если я изменю SizeConst в С# struct ниже до 5, я получаю недостающий байт, однако он заставляет другую переменную терять данные.

Может ли кто-нибудь помочь мне найти способ решить эту проблему? также пытается использовать класс вместо struct вызывает ошибку system.stackoverflow

С# Struct

[StructLayout(LayoutKind.Sequential, CharSet = CharSet.Ansi)]
public struct sHostInfo
{
    public int bFoundHost;
    public int LatestConfirmationTime;
    [MarshalAs(UnmanagedType.ByValTStr, SizeConst = 128)]
    public string szHostMachineName;
    [MarshalAs(UnmanagedType.ByValTStr, SizeConst = 4)]
    public string HostMachineAddress;
    [MarshalAs(UnmanagedType.ByValTStr, SizeConst = 128)]
    public string szHostProgramName;
    [MarshalAs(UnmanagedType.ByValTStr, SizeConst = 4)]
    public string HostProgramVersion;
}

С#

[DllImport("Cortex_SDK.dll")]
public static extern int GetHostInfo(out sHostInfo pHostInfo);
4b9b3361

Ответ 1

Ваш макет структуры С# отличается от С++ (HostProgramVersion должен быть последним).

Также для строк, помеченных как ByValTStr, используйте [StructLayout(LayoutKind.Sequential, CharSet = CharSet.Ansi)].

Проблема с отсутствующим последним байтом может заключаться в том, что маршаллер пытается добавить нуль к вашей строке (как в строке с нулевым завершением). Попытайтесь использовать sbyte[] + ByValArray вместо строки.