1

如何将非托管 C++ 代码中的 shared_ptr 编组为 C#?

我在 C++ 中有一个函数(通过 C 绑定公开),它将分配一个新的 MyObject 并通过 shared_ptr 返回指向它的指针。

在 C++ 中,我可以调用该函数:

MyObjHandle* ref = NULL:
GetMyObject(&ref); // double ptr...

其中 MyObjHandle 被定义:

typedef struct obj_t {

   shared_ptr<MyObject> objPtr;

} MyObjHandle ;

我将如何 PInvoke 从 C# 对 GetMyObject 的调用?我做了很明显的定义结构 MyObjectHandle 几乎就像在 C# 中一样,除了我将成员 objPtr 定义为 IntPtr。这以 AccessViolationException 错误惨遭失败。尝试了其他几个 PInvoke 变体,但也失败了。我似乎找不到任何带有 shared_ptr 和 C# 的互操作示例。任何帮助表示赞赏...

4

1 回答 1

0

在 C# 中,您只能将 MyObjHandle 作为 IntPtr 检索。您将永远无法访问结构中的内部 objPtr。pinvoke 签名应如下所示:

// 根据需要调整返回类型 [DllImport(...)] int GetMyObject(out IntPtr pMyObjHandle);

然后,您可以将 pMyObjHandle 传递回任何其他期望 MyObjHandle* 作为参数的 pinvoke 方法。

于 2011-02-18T04:19:02.113 回答