2016-04-02 111 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