2009-03-05 11 views
1

Ich verstehe, dass für ein VB6 COM-Objekt, wenn es den Gültigkeitsbereich verlässt, Class_Terminate sofort auf das Objekt aufgerufen wird, damit es aufräumen kann..NET & COM - Class_Terminate/Disponieren eines Objekts, wenn es den Gültigkeitsbereich verlässt

Ist es möglich, dieselbe Funktionalität für ein .NET-Objekt zu haben, das von COM aufgerufen wird?

Der Hintergrund der Frage ist auf dem MSDN-Artikel basiert: http://msdn.microsoft.com/en-us/library/aa479313.aspx

das Session-Objekt in einer ASP-Seite mit einem benutzerdefinierten Objekt Dies ersetzt, der die Session Informationen zurück zu einer Datenbank, die von, sobald der Seite beendet serialisiert Verwenden von Class_Terminate.

Ich möchte das Objekt in .NET implementieren, aber da der GC den Finalizer nicht sofort aufrufen wird, ist es ein kleines Problem, da ich nicht warten muss, bis das Objekt bereinigt wird bevor sie wieder in die Datenbank serialisiert werden.

Ich könnte IDisposiable einfach implementieren und Dispose() manuell aufrufen, wenn Sie mit der Sitzung fertig sind, aber das würde erfordern, jede vorhandene ASP-Klassikerseite zu ändern, anstatt nur ein paar Zeilen in eine Standard-Include-Datei einfügen zu können.

Gibt es eine Möglichkeit, den Code automatisch aufzurufen, um die Arbeit auszuführen, die erforderlich ist, wenn die Seite fertig ist? :)

Antwort

3

Delegierung. Umschließen Sie die .NET COM-Klasse in einer VB6 Com-Klasse, die eine Shell ist, und im Class_Terminate-Ereignis des Wrapper-Aufrufs dispose.

Wenn Sie nicht über die gesamte Schnittstelle in der VB6 COM-Klasse neu zu implementieren möchten, dann können Sie etwas tun, wie

Public MyNETCOMObject as MyNETCOMObject 

Private Class_Initialize() 
    Set MyNETCOMObject = New MyNetCOMObject 
End Sub 

Private Class_Terminate() 
    If Not MyNETCOMObject = Nothing then MyNETCOMObject.Dispose 
    Set MyNETCOMObject = Nothing 
End Sub