c# - P/调用,c# : unsigned char losing a byte

标签 c# pinvoke marshalling unsigned-char

我正在为软件的 SDK 编写一个 dll 文件,我正在尝试调用一个函数来获取有关软件主机的信息。

函数想要的结构中有两个无符号字符变量(HostMachineAddress,HostProgramVersion),当我尝试从 c# 调用它时,我似乎“松开了”最后一个字节...如果我更改 c# 中的 SizeConst结构低于 5 我确实得到了丢失的字节,但是它导致另一个变量丢失数据。

有人可以帮我找到解决这个问题的方法吗?还尝试使用类而不是结构导致 system.stackoverflow 错误

C# 结构

[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);

最佳答案

您的 C# 结构的布局与 C++ 的布局不同(HostProgramVersion 应该在最后)。

对于编码为 ByValTStr 的字符串,也使用 [StructLayout(LayoutKind.Sequential, CharSet = CharSet.Ansi)]

缺少最后一个字节的问题可能是编码器试图将 null 附加到您的字符串(如在以 null 终止的字符串中)。尝试使用 sbyte[]+ByValArray 而不是字符串。

关于c# - P/调用,c# : unsigned char losing a byte,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5221606/

相关文章:

c# - 简单问题 : convert a string to an image tag in c# asp.net mvc

c# - 开始使用C#/ASP.NET学习SQL

C# 导入 C++ 非托管 dll 并从一个 dll 创建多个实例?

c# - 当通过 C# 调用 C++ DLL 的导出类时,该类的 C 样式字符串成员在一个导出函数中是 OK,但在另一个函数中不是

c# - 将结构数组从 C# 传递到 C++

java - 将 JavaMail 消息的 HashMap 传递给 Android Activity

javascript - 如何获取 Kendo Multi Select 的选定值?

c# - 在 C# 中管理 C++ Garmin API

c# - 在 C# 中编码固定大小的枚举数组

c# - 如何在 C# 中将 System.Drawing.Image 转换为 System.Drawing.Icon?