2010-02-14 12 views
33

Ich habe einige COM-Komponente, die ich von einigen C# dll aufrufen.COM-Objekt, das von seinem zugrunde liegenden RCW getrennt wurde, kann nicht verwendet werden

Ich habe auch eine Winforms App, die diese DLL verwendet.

Wenn ich die app schließen bekomme ich diese Ausnahme:

COM-Objekt, das vom zugrunde liegenden RCW getrennt wurde, kann nicht verwendet werden.

Der Stack-Trace zeigt, dass diese Ausnahme von einem Destruktor in der DLL stammt. Ich implementierte diesen Destruktor, um eine Bereinigungsmethode in der COM aufzurufen.

Warum passiert das? Wie ist es am besten, es zu lösen?

+5

lesen: http://jake.ginnivan.net/vsto-com-interop –

+0

Mögliches Duplikat [COM-Objekt, das vom zugrunde liegenden RCW getrennt wurde, kann nicht verwendet werden] (http://stackoverflow.com/questions/1567017/com-objekt-das-wurde-getrennt-von-seinem-zugrunde liegenden-rcw-kann nicht verwendet werden) – bluish

Antwort

30

Die Frage ist hier beschrieben:

Is it safe to call an RCW from a finalizer?

und hier:

Release Excel Object In My Destructor

Das Problem ist, dass nicht nur der Zeitpunkt, wann diese Objekte sind Müll wird ungewiss gesammelt, aber die Reihenfolge, in der die Finalisten aufgerufen werden, ist auch nichtdeterminiert istic. In diesem Fall hat ein Runtime Callable Wrapper auch einen Finalizer, der Marshal.FinalReleaseComObject auf sich selbst aufruft, was das Ergebnis von Dekrementieren des Referenzzählers auf der COM-Seite des Zauns hat, so dass dieses COM-Objekt freigegeben werden kann. Aber da die Reihenfolge, in der die Finalizer aufgerufen werden, unsicher ist, ist es sehr wahrscheinlich, dass die Finalizer für die COM-Objekte, die Ihr Objekt verweist, vor dem Finalizer für Ihr Objekt ausgelöst werden. So könnte der Code in Ihrem Finalizer manchmal funktionieren, aber die meisten der Zeit Runtime Callable Wrappers, die Ihre Objektreferenzen haben bereits ihre Finalizer aufgerufen und das zugrunde liegende COM-Objekt zuvor freigegeben wurden Ihr Finalizer kann seinen Code ausführen. diese

+73

Ich habe nichts verstanden! : x – nawfal

+7

Es ist ziemlich klar: der COM-Wrapper rund um das Objekt, das Sie instanziiert haben, könnte aufgeräumt werden, bevor Sie sich daran machen, es selbst zu säubern. Übersetzung: Wenn Ihr Dispose() versucht, Marshal.ReleaseCOMObject (x) aufzurufen, wenn das zugrundeliegende x bereits den Gültigkeitsbereich überschritten hat, schlägt Ihr Dispose() fehl. Muss diesen Bereich/Lebenszyklus überprüfen. Danke für die guten Links, @Ran. – JMD

+0

Danke für deinen Kommentar JMD, hat es für mich erledigt – Alex

Verwandte Themen