我有一个 c++ dll,它有一些外部函数。 它看起来像这样
//C++ Code
void GetData(byte * pData)
{
byte a[] = {3,2,1};
pData = a;
}
我在 C# 端使用这段代码来获取数据:
//C# Code
[DllImport(UnmanagedDLLAddress)]
public static extern void GetData(ref IntPtr pData);
//and use it like
IntPtr pointer = IntPtr.Zero;
GetData(ref pointer);
byte[] data = new byte[3] // <===== think we know size
Marshal.Copy(pointer,data ,0,3);
但“指针”始终为零,因此 Marshal.Copy 抛出 null 异常 我哪里弄错了? 型
最佳答案
首先,您的 C++ 代码将数组放入堆栈。您需要以其他方式分配它,文档从这里开始:http://msdn.microsoft.com/en-us/library/aa366533%28VS.85%29.aspx
其次,pData 是一个“普通”值参数,实际上是一个局部变量。你分配给它,然后当函数返回时它会被遗忘。如果您希望它是返回值的“输出参数”,则需要它是对指针的引用或指向指针的指针。如果你想实际复制数组内容到pData指向的缓冲区,那么你需要使用memcpy
来自 #include <cstring>
的函数.
关于c# - 获取指向 C# 的 C++ 指针,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13173492/