嵌入式Mono:在c++中保持对c#对象的引用

本文关键字:对象 引用 Mono c++ 嵌入式 | 更新日期: 2023-09-27 18:16:30

我正在努力将mono嵌入到我正在创建的应用程序中,我还没有得到超级远,但我似乎找不到的一件事是如何告诉mono当我使用一个对象并完成一个对象。

我想保留一个c#对象的引用来调用方法,直到它在c++中的并行对象的生命周期结束,在这一点上,我想告诉mono c#对象可以安全收集。

这是如何完成的?

嵌入式Mono:在c++中保持对c#对象的引用

看来,我正在寻找的是mono_gchandle_new,并抓住句柄,而不是MonoObject*,并使用mono_gchandle_get_target当我需要它。

mono_gchandle_new允许您在创建句柄时固定,但是有可能在事实之后固定吗?

在结果上使用System::GCHandle::Alloc并调用ToIntPtr以获得令牌并保护对象不被收集。调用ToPointer(),存储为void*

当您需要将令牌映射到对象时,使用System::GCHandle::FromIntPtr,或者释放它,以便它再次有资格被收集。

在使用mono_gchandle_new()时要记住的一件事。它只会在内存中保留你引用的c#对象,但如果该对象分配了其他对象,这些对象仍然受制于垃圾收集例程。一个对象的句柄可以释放它的子对象,这给我带来了不少麻烦。

我目前正在挖掘单GC系统,看看是否可以修复它,以便它将这些对象视为根对象。

如果你有足够的对象(<4096),你可以使用mono_gc_register_root()…我们可以有成千上万的对象,所以这对我们的用途没有好处。

UPDATE:所以我错了,我们已经连接到单对象分配系统,我们没有通过"原子"变量正确地传递到GC分配函数。"原子的"意味着与GC不同的东西,它与并发访问无关,它实际上意味着被分配的内存引用了其他对象(Atomic =0)或不引用(Atomic =1)。