嵌入式Mono:在C+中保留对C#对象的引用+;

嵌入式Mono:在C+中保留对C#对象的引用+;,c#,c++,mono,C#,C++,Mono,我正在致力于将mono嵌入到我正在创建的应用程序中,我还没有做得很好,但我似乎找不到的一件事是,当我使用一个对象并处理完一个对象时,如何告诉mono 我想引用一个C对象来调用方法,直到C++中并行对象的生命周期结束,此时,我想告诉MNO,C对象是安全的。 这是如何实现的?看来我要找的是,抓住手柄,而不是MonoObject*,在需要时使用mono\u gchandle\u get\u目标 mono\u gchandle\u new允许您在创建句柄时锁定,但是否可以在创建句柄后锁定?使用mono\

我正在致力于将mono嵌入到我正在创建的应用程序中,我还没有做得很好,但我似乎找不到的一件事是,当我使用一个对象并处理完一个对象时,如何告诉mono

我想引用一个C对象来调用方法,直到C++中并行对象的生命周期结束,此时,我想告诉MNO,C对象是安全的。


这是如何实现的?

看来我要找的是,抓住手柄,而不是MonoObject*,在需要时使用mono\u gchandle\u get\u目标


mono\u gchandle\u new允许您在创建句柄时锁定,但是否可以在创建句柄后锁定?

使用mono\u gchandle\u new()时需要记住一件事。。它将只保留您在内存中引用的C#对象,但如果该对象分配了其他对象,则这些对象仍受垃圾收集例程的约束。一个对象有一个句柄,它的子对象可以释放给你,这给我带来了不少麻烦

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


如果对象不足(请使用
System::GCHandle::Alloc
并对结果调用
ToIntPtr
,以获取令牌并保护对象不被收集。调用
ToPointer()
并将其存储为
void*


当您需要将令牌映射到对象时,请使用
System::GCHandle::FromIntPtr
,或者释放它,使其再次符合收集条件。

我知道Microsoft的.NET实现中存在此问题,但我不确定Mono是否存在此问题。我怀疑此托管到本机接口是否可能是可移植的。我遇到了同样的问题,并解决了此问题它是通过在我分配对象的托管端有一个静态字段来实现的,这样它就永远不会被gc收集。你不能在事实发生后锁定,但你可以创建一个新的锁定gchandle。这…很奇怪。Microsoft的版本,
clr::gcroot
,是
System::gchandle
的薄薄包装作为一个根,它可以直接或间接地保护所有可直接访问的对象。如果它不起作用,也许只使用<代码>系统:GCHandle < /代码>的数值。是的,它很奇怪。我们可能试图以一种它以前没有使用过的方式使用单声道。我用C++对象包了C对象,并使用我们内部的ReFL。Office系统从C++访问单数据。我认为这是单系统中的GC系统混乱,所以我的评论上面有一点盐。