gpt4 book ai didi

c# - 防止对非托管代码中使用的托管引用进行垃圾回收

转载 作者:可可西里 更新时间:2023-11-01 09:05:19 30 4
gpt4 key购买 nike

我的 C# 应用程序使用包装的 C++ 代码进行计算。

C++ header :

__declspec(dllexport) void SetVolume(BYTE* data, unsigned int width);

C++/CLI 包装器:

void SetVolume(array<Byte>^ data, UInt32 width) 
{
cli::pin_ptr<BYTE> pdata = &data[0];
pal->SetVolume(pdata, width);
}

C#:

public startCalc()
{
byte[] voxelArr = File.ReadAllBytes("Filtered.rec");
palw.SetVolume(voxelArr, 490);
//GC.KeepAlive(voxelArr); makes no sense
}

C++ SetVolume 函数启动异步 计算。 voxelArr 不再从托管端引用并且被垃圾收集。

在未将 voxelArr 声明为全局变量的情况下,如何在非托管代码完成工作之前阻止此引用的垃圾回收?创建数组的副本不是一种选择,因为确实有很多数据。在 startCalc() 中主动等待也不好。

最佳答案

您可以使用 GCHandle.Alloc (voxelArr, GCHandleType.Pinned ) 手动固定数组,这样 GC 就不会移动或清理它。

然后你必须Free当您知道该方法已完成时的句柄,这将需要某种形式的回调来完成。

关于c# - 防止对非托管代码中使用的托管引用进行垃圾回收,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14735520/

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