如何在 C# 代码中使用 c/c++ 结构?

How to use c/c++ struct in C# code?

我正在使用一些使用 UDP 向我发送字节数组的服务。 这个服务应用程序是用 C 语言开发的——这个字节数组是一个 C 结构。

我知道我可以在 C# 上重新定义此结构并使用 StructLayout 属性使成员具有相同的对齐方式(对吗?)

但是是否可以使用托管 C++/CLI 定义相同的结构并将此托管 C++ 代码导入我的 C# 项目并以此方式进行序列化?

如果这是可能的 - 那么该怎么做呢? 当我 google 它时,我找不到任何例子。

不,这对你没有帮助。 C++/CLI 还区分本机结构(struct 关键字)和托管结构(value struct 关键字)。您当然可以声明该结构,使用#include 是最好的,这样您将始终使用 C 声明,您甚至可以强制它使用 #pragma make_public 将结构导出到元数据中。但是 C# 编译器只会看到没有任何成员的不透明值类型。

CLR 做出了大量努力来使结构的布局与 C 或 C++ 编译器将使用的本机布局相同。重要的是使互操作高效,它使结构 blittable。但是它使用的规则是故意没有记录的,实际上取决于结构成员的特定类型和进程的位数。在模糊的情况下,它会偏向于 [StructLayout(LayoutKind.Auto)] 。您可以找到此类事故的示例 here.

"sometimes not" 子句是个问题,编译器无法对布局做出任何假设。您仍然可以通过使用 #include 解析 C 结构声明的能力使 C++/CLI 获得回报。这有助于避免意外,无论是通过错误的托管结构声明还是 C 代码更改。您必须使用 public value struct 关键字声明托管版本,以便您的 C# 代码使用它。怀疑你是否认为值得额外项目的成本,它可能不值得。