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

How do I Import a struct from a C++ dll?

如何在 C++ 中创建 struct 并将其放入 dll 中并使用来自 C# 的代码?我正在使用 C# 和 C++ 开发一个应用程序,其中每个进程使用命名管道相互通信,我想通过结构共享数据(将原始字节传递给进程,然后将其转换为结构类型),而不是定义两个结构,一个在 C++ 中,另一个在 C# 中,具有相同的内存对齐方式、成员名称等(这很容易出错,如果我更新 C++ 一个而忘记了 C# 的一个)我只想创建一个,这样只有一处改变。我的想法是(如果可能的话,由于 P/invoke 的限制,我认为这是不可能的)在用 C++ 编写的 dll 中定义这个结构,然后从我的 C# 应用程序中使用它。这只是我的想法;也欢迎任何不同的方法来解决这个问题。

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

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

如果 über 性能不是约束,我建议研究的一些替代方案是某种序列化库。如果您想专注于快速开发和一致性,您可以使用 Google 的 protobuf 来完成一些疯狂的事情,消除 p/invoke 和兼容性问题等。还有一些方法可以通过脚本生成具有相关结构的 C# 和 C/C++ 源代码,范围从 hack-it-yourself C/Python/Perl 脚本到为 C 和 C# 生成结构以完成项目专注于从与语言无关的结构定义创建源代码,但这可能超出了这个答案的范围。