2015-10-05 68 views
1

所以我想讓我的C++代碼決定何時銷燬託管對象。 (因爲它們被傳遞給它作爲委託在C++端事件上被調用)。如何保持活動託管代碼對象作爲SWIG shared_ptr的傳遞給非託管代碼?

我有一個簡單的對象結構:EventGenerator + Delegates。

在我的託管方面,我有一個EventGenerator的包裝器和Delegates接口的包裝器,從中創建託管代理器(使用%feature("director"))。在我的C++代碼中,我使用shared_pointers來保持代表活着。我使用SWIG功能shared_ptr

只要EventGenerator處於活動狀態,我需要我的託管代表處於活動狀態。然而,GC不知道EventGenerator和Delegates之間的anu連接。我不想知道什麼時候對象在C#端被破壞 - 我想讓C++端來控制(使用shared_ptr的)。

那麼SWIG共享指針應該怎樣做才能在事物的託管方面維持自己?

我發現的唯一解決方案是在C#端擴展EventGenerator對象,以便向它添加委託會將該委託添加到列表中。它的作品,但我希望有一個解決方案。

有什麼辦法使SWIG帳戶使用共享指針ref計數器這樣的事情? (所以只有在C++主機死後代理纔會被託管代碼銷燬?)

回答

1

我相信你最好的選擇是使用GCHandle.Alloc(obj,GCHandleType.Normal)創建一個GCHandle到託管對象。只要該句柄存在,該對象就會存活(直到您調用.Free())。你也可以固定對象,但除非你直接從C++訪問對象指針,這是不必要的,它可以防止堆對象在堆壓縮等過程中被移動。

我強烈建議在執行.NET時使用C++/CLI與C++互操作。如果你正在做C++/CLI簡單地創建一個私有的參考場:

private: MyManagedClass^ fieldName;

這將存儲的對象,這將阻止垃圾收集的引用。

+0

mono/linux是否支持C++/CLI? – DuckQueen

+0

不,混合模式程序集自然具有爲Win32/Win64編譯的非託管C/C++代碼,並且包括通過CRT函數調用OS函數,因此儘管Mono支持託管代碼,但它不能在Linux上運行。 –

相關問題