Probleme mit DOMDocument und Destruktor

01/03/2010 - 20:41 von Volker Alkemper | Report spam
Hallo,
ich habe eine zweite Frage zum gleichen Programm:
Ich möchte im Destruktor Daten abspeichern, die in einem DOMDocument
gespeichert sind.
Zuvor wurde im Projekt ein Verweis erstellt auf
Microsoft XML, v6.0 Typ COM
In der Basisklasse wurde das Objekt deklariert und verwendet:
Public Class BasisKlasse
Protected Shared myDOM As MSXML2.DOMDocument
Sub New()
myDOM = New MSXML2.DOMDocument
...
End Sub
...
End Class

Alle Verwendungen klappen gut, doch sobald ich es im Destruktor wieder
speichern will, tritt folgende Meldung auf:
"Ein COM-Objekt, das vom zugrunde liegenden RCW getrennt wurde, kann nicht
verwendet werden."
Ich weiß inzwischen, das RCW die Brücke zwischen .Net und COM bezeichnet.
Warum wird sie vor Beendigung des Destruktors abgebrochen und wie kann ich
sie überreden, bis zum Ende zu bleiben?
Liebe Grüße
Volker
 

Lesen sie die antworten

#1 Thorsten Doerfler
02/03/2010 - 08:01 | Warnen spam
Volker Alkemper schrieb:
Ich möchte im Destruktor Daten abspeichern



Daten speichert man üblicherweise explizit und überlàsst das nicht
irgendwelchen Zufàllen, die zeitlich nicht vorhersagbar sind. Zumal
Fehler auf dieser Ebene schwer debugbar, bis gar nicht ermittelbar sind.

Zuvor wurde im Projekt ein Verweis erstellt auf
Microsoft XML, v6.0 Typ COM
In der Basisklasse wurde das Objekt deklariert und verwendet:
Public Class BasisKlasse
Protected Shared myDOM As MSXML2.DOMDocument
Sub New()
myDOM = New MSXML2.DOMDocument
...
End Sub
...
End Class



Was erhoffst Du Dir von dieser Vermischung von Instanz und Shared?

Alle Verwendungen klappen gut, doch sobald ich es im Destruktor wieder
speichern will, tritt folgende Meldung auf:
"Ein COM-Objekt, das vom zugrunde liegenden RCW getrennt wurde, kann nicht
verwendet werden."
Ich weiß inzwischen, das RCW die Brücke zwischen .Net und COM bezeichnet.
Warum wird sie vor Beendigung des Destruktors abgebrochen und wie kann ich
sie überreden, bis zum Ende zu bleiben?



Das kannst Du in der MSDN nachlesen:
http://msdn.microsoft.com/en-us/lib...alize.aspx

"The finalizers of two objects are not guaranteed to run in any specific
order, even if one object refers to the other. That is, if Object A has
a reference to Object B and both have finalizers, Object B might have
already finalized when the finalizer of Object A starts."

Der RCW kann also vorher abgeràumt werden und ist damit für Deine
Instanz nicht mehr verfügbar.

Der saubere Weg wàre die Implementierung von IDisposable oder eben einer
anderen expliziten Methode zum Speichern der Daten. Zu diesem Zeitpunkt
kann man davon ausgehen, dass die Instanz einen konsistenten Zustand
hat. Bei der Finalize Methode kann man das nicht mehr, daher solltest Du
diesen Ansatz einfach vergessen.

Thorsten Dörfler
Microsoft MVP Visual Basic

vb-hellfire visual basic faq | vb-hellfire - einfach anders
http://vb-faq.de/ | http://www.vb-hellfire.de/

Ähnliche fragen