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

标签 c#

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

现在我认为要使其工作,必须修复字符缓冲区,以便 GC 在函数工作时无法移动它。

如果是这样,我会声明缓冲区已修复并在 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/

相关文章:

c# - 在 Windows 10 64 位中使用 Crystal 报表不显示值

c# - C#中的继承问题

c# - 初学者数据库最佳实践

c# - 无法从程序文件文件夹运行 ps1 脚本

c# - CSS不适用于从ABC pdf创建pdf

c# - 如何检查一个数组是否包含另一个数组的任何项目

c# - 隐式使用 null 参数作为良好代码风格的标志

c# - Linq2db.MySQL C# 中 DateTime 的 GroupBy 日期部分

c# - HTML 电子邮件 : Must you send an alternate plain text view as well?

c# - 在 ASP.Net 中跟踪文件下载点击/计数