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#调用它.我如何在"安全模式"下执行此操作?
一个选项只是使用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)