Ich baue eine Klasse, die sich von Stream
um einen COM IStream zu verpacken. Allerdings bin ich auf ein Problem gestoßen, bei dem ich den COM-IStream deteministisch freigeben muss.
Ok, das ist ganz einfach: Verwenden Sie Marshal.ReleaseComObject
im Dispose
Methode. Ich bin mir jedoch nicht sicher, ob es so einfach ist. Die Stream
Basisklasse hat bereits eine geschützte virtuelle Methode Dispose(boolean)
. Hier ist meine erste Idee:-
~ComStreamWrapper()
{
if (!_Disposed)
{
iop.Marshal.FreeCoTaskMem(_Int64Ptr);
iop.Marshal.ReleaseComObject(_IStream);
}
}
protected override void Dispose(bool disposing)
{
base.Dispose(disposing);
if (!_Disposed)
{
if (disposing)
{
iop.Marshal.FreeCoTaskMem(_Int64Ptr);
iop.Marshal.ReleaseComObject(_IStream);
}
_Disposed = true;
}
}
Sie werden feststellen, dass es keine Implementierung von Dispose()
selbst. Ich gehe derzeit davon aus, dass die bestehende Implementierung auf Stream
tut, was ich brauche. Das ist der Aufruf Diposing(true)
y GC.SuppressFinalize
. Ist diese Annahme fehlerhaft?
Habe ich etwas verpasst? Gibt es einen besseren Ansatz? Sie sehen mehr von der Grundklasse in dieser répondre auf eine frühere Frage.