如何从C ++ DLL导入结构?

时间:2015-09-22 00:54:33

标签: c# c++ dll struct named-pipes

如何在struct中创建C++将其放入dll并使用C#代码?我正在使用C#和C ++开发一个应用程序,其中每个进程使用命名管道与其他进程交互,并且我希望在via结构之间共享数据(将原始字节传递给进程然后将其转换为struct类型)而不是在C ++中定义两个结构,而在C#中定义两个结构,具有相同的内存对齐,成员名称等(这非常容易出错,如果我更新C ++并且忘记了C#的那个)I'我只想要一个人,所以只有一个地方可以改变。我的想法是(如果可能,我认为由于P / invoke限制而不可能)在用C ++编写的dll中定义这个结构,并且只是从我的C#应用​​程序中使用它。这只是我的想法;解决这个问题的任何不同方法也是非常受欢迎的。

1 个答案:

答案 0 :(得分:0)

你做不到。结构和类不是暴露的ABI的一部分,DLL不以任何方式定义它们。这是C / C ++世界中DLL地狱的部分原因,你的函数定义陈述了它们所采用的结构的名称,但该结构的实现细节实际上并未在DLL本身的任何地方公开或定义。 / p>

C和C ++依赖于使用头文件来通知依赖项目结构和类的布局,因为该信息不是通过DLL或lib文件公开的。由于在本机代码中是不可能的,因此在托管代码中不可能(或者,迂腐,同样不可能)加倍。

我建议一些替代方案,如果超性能不是约束,那么可能是某种序列化库。如果你想专注于快速开发和一致性,你可以通过Google的protobuf,消除p / invoke和兼容性问题等来完成一些疯狂的事情。还有一些方法可以通过脚本生成相关结构的C#和C / C ++源代码,这些脚本包括自己编写的C / Python / Perl脚本,为C和C#生成结构,以完成专注于创建源代码的项目来自语言无关的结构定义的代码,但这可能超出了这个答案的范围。