如何从c++ dll中导入结构体?
本文关键字:导入 结构体 dll c++ | 更新日期: 2023-09-27 18:14:03
我如何在C++
中创建struct
,将其放入dll并从C#
代码中使用?我使用c#和c++开发一个应用程序,每个过程跟其他使用命名管道和每一个我想通过结构之间共享数据(通过原始字节处理,然后丢给结构体类型),而是比定义两个结构体在c++和c#相同内存对齐,成员名称等(这很容易出错,如果我更新c++和c#忘记的)我想creare只有一个,只有一个地方改变。我的想法是(如果可能的话,我认为由于P/调用限制,这不是不可能的)在用c++编写的dll中定义这个结构体,然后从我的c#应用程序中使用它。这只是我的想法;任何解决这个问题的不同方法都是非常受欢迎的。
你不能。结构体和类不是公开的ABI的一部分,DLL没有以任何方式定义它们。这就是C/c++世界中的DLL地狱的部分原因,你的函数定义声明了它们接受的结构体的名称,但该结构体的实现细节实际上并没有在DLL本身的任何地方公开或定义。
C和c++依赖于使用头文件来告知相关项目结构体和类的布局,因为这些信息不是通过DLL或lib文件公开的。由于这在本机代码中是不可能的,因此在托管代码中更是不可能的(或者,学究地说,就是不可能的)。
如果她的性能不是一个约束,我建议考虑一些替代方案,比如某种序列化库。如果你想专注于快速开发和一致性,你可以用Google的protobuf之类的东西完成一些疯狂的事情,消除p/invoke和兼容性问题等。还有一些方法可以通过脚本生成带有相关结构的c#和C/c++源代码,从自己编写C/Python/Perl脚本到为C和c#生成结构体,以完成专注于从语言无关的结构体定义创建源代码的项目,但这可能超出了这个答案的范围。