我在 C# 中分配了一个大的 char[] 缓冲区,并且希望将指向此数据的指针传递给 DLL 中的未管理的 c 函数。
现在我认为要使其工作,必须修复字符缓冲区,以便 GC 在函数工作时无法移动它。
如果是这样,我会声明缓冲区已固定并调用 UNSAFE 块内的 DLL 吗?
fixed ( int* p = &bigbuffer )
{
processbigbuffer(bigbuffer);
}
我进行了搜索,但没有多少参考文献强调内存属于 c# 的问题以及它如何在 DLL 中工作。
Thanks
你不必使用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);
也可以看看:
- 非托管类型枚举 http://msdn.microsoft.com/en-us/library/system.runtime.interopservices.unmanagedtype.aspx
- 与非托管代码互操作 http://msdn.microsoft.com/en-us/library/sd10k43k.aspx
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)