我在c#中分配了一个大的char []缓冲区,并希望将指向此数据的指针传递给DLL中的n函数。

现在,我认为要使其正常工作,必须对char缓冲区进行修复,以便在函数正常工作时GC无法对其进行移位。

如果是这样,我是否将缓冲区声明为FIXED并在UNSAFE块中调用DLL?

fixed ( int* p = &bigbuffer )
{
    processbigbuffer(bigbuffer);
}


我进行了搜索,但是没有太多参考文献强调内存属于c#的问题以及它如何在DLL中工作。

谢谢

最佳答案

您不必使用fixed。运行时将自动为您执行此操作。因此,如果您具有C函数:

void ProcessBigBuffer(char* buffer);


然后,您的托管原型将如下所示:

[DllImport("foo.dll", CallingConvention=CallingConvention.Cdecl)]
static extern void ProcessBigBuffer([MarshalAs(UnmanagedType.LPArray)] char[] buffer);


您的呼叫站点将是:

char[] buffer = new char[bufferSize];
// initialize the buffer
// and then process it
ProcessBigBuffer(buffer);


也可以看看:


UnmanagedType enumeration
Interoperating with Unmanaged Code

关于c# - 将引用托管代码中分配的内存的指针传递给非托管,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/16611619/

10-17 02:39