我正在尝试包装一个非托管 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/