Ich habe ein Programm, das eine Art Ole-Verbindung verwendet, um Verbindung mit einer Cam/CAD-Software Powershape herzustellen. Es verwendet eine Klassenvariable, um eine Verbindung mit Powershape herzustellen, und seine Eigenschaften enthalten Informationen über die offenen Modelle.Wie man Klassenvariable finalisiert/zerstört
Das Problem besteht darin, dass diese Verbindung nur beendet wird, wenn die Klassenvariable abgeschlossen wird oder den Gültigkeitsbereich verlässt.
Dim powershapeRoot As New PSAutomation(Delcam.ProductInterface.InstanceReuse.UseExistingInstance)
Dies funktioniert innerhalb Subs in Ordnung, da es außerhalb des Gültigkeitsbereiches geht, aber dieses Programm erfordert, dass Sie dies mehrmals tun, wenn Sie Daten von Powershape benötigen und es kann wieder einige Zeit in Anspruch jedes Mal macht die Verbindung nehmen. Sie können also eine globale Variable erstellen, so dass Sie die Verbindung nur einmal benötigen.
Dim powershapeRoot As New PSAutomation(Delcam.ProductInterface.InstanceReuse.UseExistingInstance)
Powershapeglobal = powershapeRoot
Aber jetzt geht die Variable nur aus dem Geltungsbereich, wenn das Programm geschlossen ist. Ich habe versucht zu verwenden:
Powershapeglobal.dispose
Powershapeglobal = nothing
Diese haben nicht geholfen und die Verbindung scheint noch zu existieren, weil die Variable noch existiert? Wie zerstörst du die Variable für immer?
In VBA würden Sie „Set“ Schlüsselwort zu setzen, ein Objekt variabile auf „Nothing“ – user3598756
Neben korrekt Freigabe des COM-Objekts verwenden, so dass der Zeiger nicht mehr vorhanden ist, sollten Sie auch das Objekt für GC kostenlos registrieren . Andrew Whitechapel deckt das ziemlich gut in seinem Buch ab, dem relevanten Auszug im Abschnitt über das Freigeben von COM-Objekten: https://msdn.microsoft.com/en-us/library/office/aa679807(v=office.11).aspx –
Es klingt wie ein Fehler in der PSAutomation-Klasse, auf die Sie sich verlassen. Eine richtig entworfene und implementierte Klasse würde das IDisposable-Muster dafür verwenden. –