c# - 将带有字符串的 C# 结构传递给 C++ 应用程序

标签 c# c++ string struct

我有一个通过 UDP 传递给 C++ 应用程序的 C# 结构。我检查了字符串字段的长度,得到了 C# 和 C++ 代码的不同结果。以下是结构的定义:

//  C# Side
//-------------
[StructLayout(LayoutKind.Sequential, Pack = 1)]
public struct stName
{
 /// Some data types
 [MarshalAs(UnmanagedType.ByValTstr, SizeConst = 20)]
 string StringName;
}

// C Side
//---------
struct stName{
/// Some data types
char StringName[20];

当 StringName = "192.168.53.2"时,该字段在 C# 端的大小为 12,而在 C 端为 20。我究竟做错了什么?如果C#使用字符串的实际长度,那么SizeConst字段代表什么?

最佳答案

当您在 C# 中检查字符串的长度时,它会计算字符数(192.168.53.2 正确地是 12 个字符长)。

但是,在 C 语言中,字符串实际上只是一个以 null 结尾的字符数组。但是,在这种情况下数组的大小就是您设置的大小,即 20。所以这个“字段”的大小是 20。

SizeConst 字段指的是 C 数组的大小,以便互操作可以适本地创建 C 数组(具有正确的总大小)。

关于c# - 将带有字符串的 C# 结构传递给 C++ 应用程序,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31388569/

相关文章:

c# - 从 C# 命令行获取字符串并将其传递到 wpf 窗口

c# - 如何保存datagridview的排序阶段通知c#

python - 仅当它是最后一个字符时如何去除标点符号

c# - 使用具有 ref 参数的方法的 AssertWasCalled 和 Stub

c# - 使用 C# 将 PDF 文件转换为图像

c++ - 将 std::filesystem 添加到 CMake 项目时出现问题

c++ - std::atomic 是否提供原子行为,而不管顺序如何?

c++ - 类成员的 std::mem_fn 不会编译

swift - 如何使标签对指定日期使用不同的字符串?

string - Julialang 中带有前导(左填充)零的数字到字符串