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