.net - 在编码包装通过传递接口(interface)句柄工作的 C++ 接口(interface)(全部抽象)时 Intptr 是否足够?

标签 .net c++ interop pinvoke marshalling

我正在尝试包装一个非托管 C++ 接口(interface),该接口(interface)由几个抽象结构(具有所有纯虚拟方法)和一个返回这些结构的句柄 (shared_ptrs) 的小型工厂命名空间组成。

看来,正因为如此,我也许可以通过将指针编码为 System.IntPtr 类型(尽管它们属于 boost::shared_ptr 类型,这样可以吗?我是否需要额外处理? ) 并将它们传递给简单的托管包装器,然后返回到 native 代码,而无需担心它们指向什么。这是在正确的轨道上吗?

对于使用 STL 类型或 shared_ptr 类型的 pinvoke 进行数据编码的任何帮助或引用,我将不胜感激(我在 MSDN 和其他网站上找到的关于字符串和基元结构的信息很少。)

谢谢,

最佳答案

我建议定义一个 C API 以供 .NET 层使用。使用 void *const void *对于结构的“句柄”类型,并定义一个 extern "C"每个方法的函数(包括工厂方法和析构函数)。你不能编码 shared_ptr<T>直接参数,所以你需要使用 void *处理。

在.NET层,首先定义一个派生自SafeHandle的类型其唯一目的是正确处理句柄(即调用表示对象析构函数的 C API)。接下来,定义一个表示实际对象的包装器类型,并为表示对象成员函数的每个 C API 函数提供方法。最后,定义一个包装 C API 工厂方法的工厂类型。

工作量很大,但这是正确的做法。

关于.net - 在编码包装通过传递接口(interface)句柄工作的 C++ 接口(interface)(全部抽象)时 Intptr 是否足够?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3340273/

相关文章:

c# - 如何检查窗口是否是 MDI 窗口?

c# - 是否可以获取作为 `params object[]` 传递的变量名称?

c++ - IPV6 套接字 connect() 返回 EADDRNOTAVAIL

c++ - 如何使用 std::accumulate 对单独定义的索引指向的 vector 中的值进行巧妙的求和(替换循环)

c++ - 删除 constexpr 会改变链接吗?

c# - 为什么我必须重建一个未更改的项目?

java - WCF MTOM/XOP 客户端反序列化错误

c# - 转换 VB.NET --> C# 项目

c# - .Net 中的 Async/await --> 调用没有异步实现的服务方法

c# - 如何使用 .NET (Windows/Mac/Linux) 将 PCM S16LE 音频转换为 MU-LAW/8000