gpt4 book ai didi

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

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

我有一个带有签名的 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/

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