我有一个程序使用某种Ole连接来建立与Cam / cad软件Powershape的连接。它使用类变量与powershape建立连接,其属性包含有关模型打开的信息。
问题是此连接仅在类变量完成或超出范围时结束。
Dim powershapeRoot As New PSAutomation(Delcam.ProductInterface.InstanceReuse.UseExistingInstance)
这在Subs内部工作正常,因为它超出了范围,但是当你需要来自powershape的数据时,这个程序要求你多次这样做,并且每次重新建立连接可能需要一些时间。因此,您可以将其设为全局变量,因此您只需要连接一次。
Dim powershapeRoot As New PSAutomation(Delcam.ProductInterface.InstanceReuse.UseExistingInstance)
Powershapeglobal = powershapeRoot
但是现在一旦程序关闭,变量就会超出范围。我试着用:
Powershapeglobal.dispose
Powershapeglobal = nothing
这些没有帮助,连接似乎仍然存在,因为变量仍然存在?你如何破坏变量?
答案 0 :(得分:0)
在.NET中,当.NET变量超出范围时,不会销毁非托管资源。当垃圾收集器将它们从内存中删除时,它们就会被销毁,这就是垃圾收集器认为必要的时候。这称为“非确定性终结”,因为您,开发人员无法确定对象最终确定的确切时刻。
要确保在完成外部资源时清除它们,请调用相关对象的Dispose()方法:
Dim powershapeRoot As New PSAutomation(Delcam.ProductInterface.InstanceReuse.UseExistingInstance)
并且,当您想要释放连接时:
powershapeRoot.Dispose();
或者,要自动执行Dispose,请使用.NET“Using”语句:
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就足够了。