P / Invoke, c #: символ без знака теряет байт - PullRequest
11 голосов
/ 07 марта 2011

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

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

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

C # 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;
}

C #

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

1 Ответ

6 голосов
/ 07 марта 2011

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

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

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

...