[英]Embedded Mono: Keeping references to C# objects in C++
我正在將mono嵌入到正在創建的應用程序中,但還沒有走得太遠,但是我似乎找不到的一件事是當我使用對象並完成操作時如何告訴mono。與一個對象。
我想保留對C#對象的引用以調用方法,直到它在C ++中的並行對象的生命周期結束為止,此時,我想告訴Mono,C#對象可以安全地收集。
如何完成的?
似乎我正在尋找的是mono_gchandle_new ,並握住了句柄,而不是MonoObject *,並在需要時使用mono_gchandle_get_target。
mono_gchandle_new允許您在創建句柄時進行鎖定,但是事實發生后是否有可能進行鎖定?
使用我遇到的mono_gchandle_new()時要記住的一件事..它將僅將您引用的C#對象保留在內存中,但是如果該對象分配其他對象,則這些對象仍將接受垃圾回收例程。 您擁有處理對象的對象可以將其子對象釋放給您的事實給我造成了很多麻煩。
我目前正在研究mono GC系統,看是否可以修復它,以便它將那些對象視為根對象。
如果對象不足(<4096),則可以使用mono_gc_register_root()...我們可以擁有數千個對象,因此這對我們的使用不利。
更新:所以我對此是不對的,我們陷入了單對象分配系統中,並且沒有將“ atomic”變量正確地傳遞給GC分配函數。 “原子”是指與GC不同的東西,它與並發訪問沒有任何關系,實際上是指分配的內存引用了其他對象(原子= 0)或沒有其他對象(原子= 1)。
使用System::GCHandle::Alloc
並在結果上調用ToIntPtr
以獲取令牌並保護該對象免於收集。 調用ToPointer()
並存儲為void*
。
需要將令牌映射到對象或釋放它時,請使用System::GCHandle::FromIntPtr
,以便再次有資格進行收集。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.