2009-03-05 7 views
1

Je comprends que pour un objet COM VB6 lorsqu'il est hors de portée, Class_Terminate est immédiatement appelé sur l'objet pour le nettoyer..NET & COM - Class_Terminate/Mise au rebut d'un objet hors champ

Est-il possible d'avoir la même fonctionnalité pour un objet .NET qui est appelé par COM?

Le contexte de la question est fondée sur l'article MSDN: http://msdn.microsoft.com/en-us/library/aa479313.aspx

Cela remplace l'objet de session dans une page ASP avec un objet personnalisé qui sérialise les informations de session retour à une base de données dès que les finitions de la page par en utilisant Class_Terminate.

Je veux implémenter l'objet dans .NET, cependant comme le GC n'appellera pas le finaliseur immédiatement c'est un peu un problème, car je ne veux pas attendre que l'objet soit nettoyé avant d'être sérialisé dans la base de données. Je pourrais simplement implémenter IDisposiable et appeler manuellement Dispose() une fois terminé avec la Session, mais cela nécessiterait de modifier chaque page ASP classique existante plutôt que de simplement inclure quelques lignes dans un fichier include standard.

Alors, existe-t-il un moyen d'appeler automatiquement le code pour effectuer le travail requis lorsque la page est terminée? :)

Répondre

3

Délégation. Envelopper la classe COM .NET dans une classe VB6 Com qui est un shell et dans l'événement Class_Terminate de l'appel wrapper disposer.

Si vous ne voulez pas ré-écrire toute l'interface dans la classe VB6 COM alors vous pourriez faire quelque chose comme

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