2016-04-02 5 views
0

У меня есть программа, которая использует какое-то соединение 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

В VBA вы будете использовать «Set» ключевое слово, чтобы установить объект variabile на «Ничего» – user3598756

+0

Помимо правильно рилизинг объект COM, так что указатель больше не существует, то вы должны также освободить объект для GC , Эндрю Уайтчепел достаточно хорошо описывает в своей книге соответствующий отрывок в разделе о выпуске 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

Смежные вопросы