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