c# - 获取指向 C# 的 C++ 指针

标签 c# c++ extern intptr

我有一个 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/

相关文章:

c# - 在 Mono 中检测符号链接(symbolic link)和管道

c# - 我如何使用 MSBuild 15 打包多目标包?

c++ - 这是哪个设计模式 : Factory Method or Abstract Factory

c++ - 检测到 QT UTC linux 时钟偏差。您的构建可能不完整

c++ - 使用指向函数指针的外部引用时的链接器警告

C++:如何在不使用全局变量的情况下通过系统传递用户输入?

c# - 在资源文件中存储项目的序列化列表

c# - ContexMenuStrip 奇怪的特定怪异行为

c++ - GetCPUDescriptorHandleForHeapStart 堆栈损坏

c++ - 如何跨多个文件声明全局 std::vector 二维数组? C++