我正在使用一些使用UDP向我发送字节数组的服务。 这个服务应用程序是用C语言开发的 - 这个字节数组是一个C结构。
我知道我可以在C#上重新定义这个结构,并使用StructLayout属性对成员进行相同的对齐(我是对的吗?)
但是是否可以使用托管C ++ / CLI定义相同的结构并将此托管C ++代码导入到我的C#项目中并以此方式进行序列化?
如果可以 - 那该怎么做? 当我谷歌它时,我找不到任何例子。
答案 0 :(得分:5)
不,这对你没有帮助。 C ++ / CLI还区分本机结构(struct
关键字)和托管结构(value struct
关键字)。你当然可以声明结构,使用#include是最好的,所以你总是使用C声明,你甚至可以强迫它将结构导出到#pragma make_public
的元数据中。但是C#编译器只会看到一个没有任何成员的不透明值类型。
CLR做了大量工作,使结构的布局与C或C ++编译器将使用的本机布局相同。重要的是使interop有效,它使struct blittable 。但它使用的规则是故意没有记录的,实际上取决于结构成员的特定类型和过程的位数。在不起眼的情况下,它将支持[StructLayout(LayoutKind.Auto)]。你可以找到一个这样的事故的例子here。
"有时候不是"子句是擦,编译器不能假设任何关于布局的东西。您仍然可以通过使用#include解析C结构声明来使C ++ / CLI得到回报。这有助于避免事故,无论是通过使管理结构声明错误还是C代码更改。您必须使用public value struct
关键字声明托管版本,以便您的C#代码使用它。令人怀疑的是,您认为这是值得花费额外项目的成本,它可能不是。