2016-04-02 73 views
0

我有一個程序使用某種Ole連接建立與Cam/cad軟件Powershape的連接。它使用類變量與powershape建立連接,並且其屬性包含有關打開模型的信息。如何最終化/銷燬類變量

問題是,只有當類變量完成或超出範圍時,此連接纔會結束。

Dim powershapeRoot As New PSAutomation(Delcam.ProductInterface.InstanceReuse.UseExistingInstance) 

這工作得很好內部替補,因爲它超出範圍,但這個方案需要你的時候,你需要從PowerSHAPE中的數據做了幾次,它可能需要一些時間,每次重新建立連接。所以你可以使它成爲全局變量,所以你只需要連接一次。

Dim powershapeRoot As New PSAutomation(Delcam.ProductInterface.InstanceReuse.UseExistingInstance) 
Powershapeglobal = powershapeRoot 

但是現在變量只在程序關閉後纔會超出範圍。我試圖使用:

Powershapeglobal.dispose 
Powershapeglobal = nothing 

這些都沒有幫助和連接似乎仍然存在,因爲變量仍然存在?你如何摧毀好的變量?

+0

在VBA中你可以使用「設置」關鍵字設置對象variabile的爲「無」 – user3598756

+0

除了正確地釋放COM對象,以使指針不再存在,你也應該騰出GC對象。 Andrew Whitechapel在他的書中詳細介紹了這一點,即關於發佈COM對象的相關節選:https://msdn.microsoft.com/en-us/library/office/aa679807(v=office.11​​).aspx –

+0

這聽起來像你依賴的PSAutomation類中的一個錯誤。一個正確設計和實現的類將使用IDisposable模式。 –

回答

0

在.NET中,當.NET變量超出範圍時,非託管資源不會被銷燬。當垃圾收集器將它們從內存中移除時,這些垃圾收集器會被銷燬,無論何時垃圾收集器都認爲這是必要的。這被稱爲「非確定性定稿」,因爲你,開發者不確定對象是否確定的確切時刻。

爲了確保外部資源的及時清理,當你與他們所做的,調用Dispose()有問題的對象的方法:

Dim powershapeRoot As New PSAutomation(Delcam.ProductInterface.InstanceReuse.UseExistingInstance) 

而且,當你想釋放連接:

powershapeRoot.Dispose(); 

或者,得到的Dispose自動發生,使用.NET 「使用」 的語句:

Using powershapeRoot As New PSAutomation(Delcam.ProductInterface.InstanceReuse.UseExistingInstance) 



End Using ' Dispose is called automatically here 

現在,隨着COM對象還有另外一個步驟的過程中,你必須顯式調用ReleaseComObject的()方法,像這樣:

System.Marshall.ReleaseComObject(powershapeRoot); 

然後調用Dispose()之後。但是,只有在明確引用COM組合件時才需要。使用OleDB連接,調用Dispose就足夠了。

https://msdn.microsoft.com/en-us/library/system.runtime.interopservices.marshal.releasecomobject(v=vs.110).aspx