Wie kann ich Ruf-System.- Laufzeit.InteropServices.Marschall.ReleaseComObject aus innerhalb einer Excel 2007-VBA-Modul
Möchte ich nennen-System.- Laufzeit.InteropServices.Marschall.ReleaseComObject(obj) auf einige 3rd-party COM-Objekte, die ich habe, instanziiert in meinem VBA-code aus meiner Arbeitsmappe schließen-Ereignis, so etwas wie die folgenden:
Public Sub disconnect(obj As Variant)
Dim refs As Long
refs = 0
If Not obj Is Nothing Then
Do
refs = System.Runtime.InteropServices.Marshal.ReleaseComObject(obj)
Loop While (refs > 0)
End If
End Sub
Allerdings bekomme ich eine compile error: invalid qualifier
mit der System
markiert mit dem obigen code. Die Suche scheint nicht zurückgeben VBA-code, der Aufrufe von System.Runtime-Methoden aus einem VBA-makro - kann ich nur finden VB.Net automatisieren von Excel. Ich bin mir nicht sicher, ob es überhaupt noch möglich ist.
Ich versuche dieses Problem zu beheben: Excel 2007-Zombie-Prozess nicht die COM-Automatisierung, aber w/Verweise auf 3rd-party com-Objekte, indem Sie sicherstellen, dass diese 3rd-party COM-Objekte ordnungsgemäß entsorgt werden, bevor Excel beendet wird.
InformationsquelleAutor Pauli Price | 2012-11-27
Du musst angemeldet sein, um einen Kommentar abzugeben.
Habe ich nicht verwendet, VBA, aber ich glaube nicht, dass es eine .NET-Sprache, so natürlich Sie können nicht verwendet werden .NET Framework-Klassen wie System.- Laufzeit.InteropServices.Marschall in VBA.
Sind Sie sicher, dass Sie löschen Sie alle Verweise auf das COM-Objekt aus, wenn Sie möchten Excel beenden? Stellen Sie sicher, dass Sie durch die Platzierung von Zeilen wie die folgenden für jede Referenz, die Sie halten, um das COM-Objekt:
Wenn das nicht lösen, ist es auch möglich, dass das problem einer zirkulären Referenz. Funktioniert der COM-Objekt speichern refenrece zu einer VBA-Objekt von Ihnen, die wiederum einen Verweis auf das COM-Objekt? Wenn also ein Zirkulärer Verweis erstellt, und die Objekte werden nie veröffentlicht. Ich war auf der Suche nach etwas anderem und fand einen post sehr ähnlich zu verkaufen:
Zwingen Garbage Collection
Wenn das das problem ist, Sie wirklich brauchen einen Weg zum freigeben der COM-Objekt manuell (und das mehrere Male, bis der Referenzzähler null ist), ähnlich wie Marschall.ReleaseComObject, aber ich weiß nicht, wie Sie tun können, dass in VBA.
Ein paar andere ähnliche threads:
Wie die Freigabe inprocess-COM-Server-Objekt aus Excel VBA
Excel-Prozess geöffnet bleibt, nachdem interop; traditionelle Methode nicht funktioniert
Musste greifen, um das erstellen einer COM-wrapper. Ich habe meine Lösung und zog das 'akzeptiert' - flag.
InformationsquelleAutor user1610015
Ich nicht in der Lage war zu beheben, das zombie-problem mit den empfohlenen VBA einzige Methode, die auch nach sorgfältiger überprüfung und entfernen von Zirkelbezügen.
Weiteren Suche stellte sich einen Weg zu nennen, der
ReleaseCom
Methode Verwendung von code, wrapsSystem.- Laufzeit.InteropServices.Marschall.FinalReleaseComObject
zu erstellen Sie eine COM-sichtbare dll aufgerufen werden kann, VBADen tutorial "so erstellen Sie ein com-Objekt mit vs 2008 und konsumieren von vb6.0-client" und eine neu installierte Kopie von VS2010 Express, ich war in der Lage, erstellen Sie eine COM-sichtbare dll-callable von VBA.
Hier ist die leicht modifizierte wrapper und wie um die dll zu erstellen:
und die Schnittstelle:
Zu bauen, erstellen Sie eine neue Klasse Bibliothek-Projekt, fügen Sie Verweise auf
System.Runtime.InteropServices
undSystem.EnterpriseServices
aktivieren Sie "Zeichen der Montage' (im Menü unter Projekt /Eigenschaften /Signatur), und wählen Sie oder erstellen Sie eine Schlüssel-Datei. Fügen Sie die Klassen-und interface-code-Dateien. In der AssemblyInfo.cs-Datei (unter Eigenschaften) hinzufügenund
und zu bauen. Wenn alles gut geht, können Sie sich registrieren Sie die dll wie folgt:
In VBA, nach dem Sie eine Referenz hinzufügen, um Ihre neue COM-Bibliothek, verwenden Sie es wie folgt:
Frühe Tests zeigt, dass es funktioniert, d.h. Excel schließt sauber und nicht mehr schafft zombie-Prozesse.
Interessant, ich rannte über diesem Methode für die Verwendung der dll in VBA zimmerreserviereung, ohne das Sie es registrieren die ersten, die nützlich sein könnte, wenn Sie nicht haben Zugang zu der Registrierung auf dem client-Rechner.
InformationsquelleAutor Pauli Price