gpt4 book ai didi

c# - 将引用在托管代码中分配的内存的指针传递给非托管

转载 作者:行者123 更新时间:2023-11-30 22:17:44 24 4
gpt4 key购买 nike

我在 C# 中分配了一个大的 char[] 缓冲区,我想将指向该数据的指针传递给 DLL 中的未管理的 C 函数。

现在我认为要让它工作,必须固定字符缓冲区,这样 GC 就不能在函数工作时移动它。

如果是这样,我会声明缓冲区 FIXED 并在 UNSAFE block 中调用 DLL 吗??

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

我已经搜索过,但没有多少引用资料突出了内存属于 c# 的问题以及它如何在 DLL 中工作。

谢谢

最佳答案

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

void ProcessBigBuffer(char* buffer);

那么您的托管原型(prototype)将如下所示:

[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);

另见:

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

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com