4

我正在将大量 .h 和 .lib 文件从本机 C++ 包装到托管 C++ 以最终用作 C# 中的引用 .dll。

一些本机 C++ 函数的返回类型为 void*。当我将值传回我的调用代码时,我不确定如何处理这个问题。例如:如果 C# 应用程序调用我的 dll 包装器,我从本机调用返回什么:

void* start(ThreadFunc,void *, unsigned *);

我目前正在尝试将返回装箱在通用 System::Object^ 中,但没有成功。这是包装器中的调用:

m_NativeThread->start(cb, 
        GCHandle::ToIntPtr(GCHandle::Alloc(o)).ToPointer(),
        static_cast<unsigned int*>(GCHandle::ToIntPtr(GCHandle::Alloc(u)).ToPointer())));

任何人都可以提供解决方案吗?

4

2 回答 2

5

如果您的托管代码需要查看 void* 中的数据:

您不能将 void* 强制转换为托管对象引用的非托管内存。要将其转换为托管内存,您必须使用 Marshal.Copy() 或 Marshal.PtrToStructure()。这当然只有在您知道 void* 指向的数据类型时才有效。 来源

如果您的托管代码不需要查看 void* 中的数据:

如果您的托管代码不需要查看它是什么并且稍后将其传递回非托管代码,则将其存储在 IntPtr 中。 来源

于 2009-07-20T18:14:39.707 回答
1

你能把它变成一个 IntPtr 吗?您希望客户如何处理 void*?

于 2009-07-20T18:04:27.623 回答