gpt4 book ai didi

c# - 从非托管代码传递指针

转载 作者:太空狗 更新时间:2023-10-29 20:12:16 24 4
gpt4 key购买 nike

我有一个导入C dll的C#项目,该dll有这个功能:

int primary_read_serial(int handle, int *return_code, int *serial, int length);

我想访问串行参数。我实际上已经让它返回串行参数的一个字符,但我不太确定我在做什么,我想了解发生了什么,当然让它工作。

所以,我非常确定 dll 正在被访问,其他没有指针的函数也可以正常工作。我如何处理指针?我必须编码吗?也许我必须有一个固定的地方来放置数据呢?

最好有解释。

谢谢!理查德

最佳答案

您将必须使用 IntPtr 并将该 IntPtr 编码到您想要放入的任何 C# 结构中。在您的情况下,您必须将其编码为 int[]。

这是分几步完成的:

  • 分配一个非托管句柄
  • 用未管理的数组调用函数
  • 将数组转换为托管字节数组
  • 将字节数组转换为整型数组
  • 释放非托管句柄

该代码应该给你一个想法:

// The import declaration
[DllImport("Library.dll")]
public static extern int primary_read_serial(int, ref int, IntPtr, int) ;


// Allocate unmanaged buffer
IntPtr serial_ptr = Marshal.AllocHGlobal(length * sizeof(int));

try
{
// Call unmanaged function
int return_code;
int result = primary_read_serial(handle, ref return_code, serial_ptr, length);

// Safely marshal unmanaged buffer to byte[]
byte[] bytes = new byte[length * sizeof(int)];
Marshal.Copy(serial_ptr, bytes, 0, length);

// Converter to int[]
int[] ints = new int[length];
for (int i = 0; i < length; i++)
{
ints[i] = BitConverter.ToInt32(bytes, i * sizeof(int));
}

}
finally
{
Marshal.FreeHGlobal(serial_ptr);
}

不要忘记 try-finally,否则你将面临泄露非托管句柄的风险。

关于c# - 从非托管代码传递指针,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/835072/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com