【问题标题】:Using a DLL function in C# that requires a pointer as argument, am I declaring this properly?在 C# 中使用需要指针作为参数的 DLL 函数,我是否正确声明了这一点?
【发布时间】:2022-02-02 21:12:28
【问题描述】:

我正在使用 C# 开发应用程序,并且必须从 DLL 调用外部函数。此函数需要一个指向整数数组的指针作为参数。 DLL 文档指出整数数组必须具有 >= 4kb 的空间分配。我知道 C# 会避开指针,但我很确定我在这里别无选择,不是吗?如何在 C# 中分配指向整数数组的指针并保证其大小 >= 4kb?

我有:

public readonly unsafe int*[] dataBuffer = new int*[1000];

但我不确定这是否正确。

方法签名是

int DataRec(void* buf);

【问题讨论】:

  • 请显示您要调用的C方法的签名。
  • int DataRec(void* buf);

标签: c# pointers memory dll external


【解决方案1】:

这是一个非常简单的例子,你只需要一个指向数组的指针,而不是一个指针数组(正如你声明的那样)。

这应该可行:

byte[] buf = new byte[4096]; // allocate managed buffer
fixed (int* p = &buf[0]) // create a fixed pointer to the first element of the buffer (= to the buffer itself)
{ 
   int result = DataRec(p);
   // ...
   // use the data
}

【讨论】:

  • 感谢您的回复。所以我主要完成了这项工作,但我必须将 p 声明为字节指针而不是 int 指针。如果我想将它保留为一个 int 指针,我必须这样声明 buf。然后我可以执行 'int[] buf = new int[1024]' 并保持 4kb 的大小要求吗?抱歉,我不经常在这个级别上工作。
  • 如果您需要一个字节指针,只需将其更改为:fixed (byte* p = &buf[0])。如果您的函数采用void*,那么您传递的指针类型并不重要,指针的值在所有情况下都是相同的。 int[] buf = new int[1024] 给出了相同大小的缓冲区,是的。
猜你喜欢
  • 1970-01-01
  • 2013-09-25
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-06-26
  • 2016-08-14
相关资源
最近更新 更多