c# - 如何在 C# 中传递指向整数的指针

标签 c# c interop pinvoke

我有一个带有签名的 C API:

int GetBuffer(char* buffer, int* maxSize)

在 C 中,我会这样调用它:

char buffer[4096];
int maxSize = 4096;
GetBuffer(buffer, &maxSize);

maxSize 设置为缓冲区大小,并设置为实际填充的大小。

我需要从 C# 调用它。我如何在“安全模式”下执行此操作?

最佳答案

一种选择是简单地使用 C# 指针类型 - 这需要 unsafe block (或方法/类上的修饰符),并使用 /unsafe 进行编译:

[DllImport(...)]
static extern int GetBuffer(byte* buffer, ref int maxSize);

缓冲区可以用几种不同的方式分配。一种是使用固定堆数组:

fixed (byte* buffer = new byte[4096])
{
    int maxSize = buffer.Length;
    GetBuffer(buffer, ref maxSize);
}

另一种方法是使用 stackalloc,尽管这只适用于小缓冲区:

byte* buffer = stackalloc byte[4096];
int maxSize = 4096;
GetBuffer(buffer, ref maxSize);

这种特殊方法在性能和分配模式方面几乎与您的 C 代码相同。

另一种选择是对堆数组使用编码(marshal)处理,并完全避免使用指针。

[DllImport(...)]
static extern int GetBuffer([Out] byte[] buffer, ref int maxSize);

byte[] buffer = new byte[4096];
int maxSize = buffer.Length;
GetBuffer(buffer, ref maxSize);

关于c# - 如何在 C# 中传递指向整数的指针,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1579446/

相关文章:

c - 改进我的 C 编码并查找代码问题

c# - F# OOP - 实现接口(interface) - 私有(private)和方法名称问题

c# - 您如何确保 .Net 始终从 namespace 树的根部搜索 namespace ?

c - 如何比较两个多维数组

c# - ASP.Net Dropdownlist ListItem (Enabled=false) 未显示在页面中

c - 将指向函数的指针作为参数传递给具有多个参数的其他函数

c# - 适用于 Windows 窗体的 HwndHost - Win32/WinForm 互操作性

C# .net Excel Interop 使 Excel 进程挂起

c# - 无需页面加载即可生成 GridView

c# - Visual Studio 应用程序中的解决方案中缺少某些 NuGet 包