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

She*_* Hu 4 c c# pinvoke interop

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

int GetBuffer(char* buffer, int* maxSize)
Run Code Online (Sandbox Code Playgroud)

在C中,我将这样称呼它:

char buffer[4096];
int maxSize = 4096;
GetBuffer(buffer, &maxSize);
Run Code Online (Sandbox Code Playgroud)

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

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

Pav*_*aev 5

一个选项只是使用C#指针类型 - 这需要unsafe块(或方法/类上的修饰符),并使用/unsafe以下代码进行编译:

[DllImport(...)]
static extern int GetBuffer(byte* buffer, ref int maxSize);
Run Code Online (Sandbox Code Playgroud)

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

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

另一个是使用stackalloc,虽然这只适用于小缓冲区:

byte* buffer = stackalloc byte[4096];
int maxSize = 4096;
GetBuffer(buffer, ref maxSize);
Run Code Online (Sandbox Code Playgroud)

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

另一个选择是对堆数组使用编组,并完全避免指针.

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

byte[] buffer = new byte[4096];
int maxSize = buffer.Length;
GetBuffer(buffer, ref maxSize);
Run Code Online (Sandbox Code Playgroud)


Chr*_*nce 2

拥有指针句柄根本不适合“安全模式”模型;如果资源不是由框架管理的,那么它是不安全的。