Ich stecke mit .Net 1.1-Anwendung (d.h. ich kann nicht die Generika Goodies aus 2.0 für jetzt verwenden), und ich habe versucht, einige Teile des Codes zu optimieren. Da es viel mit Runtime Callable Wrappern zu tun hat, die freigegeben werden müssen, habe ich eine Utility-Methode erstellt, die in einer Schleife läuft, bis alle Referenzen freigegeben sind. Die Signatur der Methode ist:
void ReleaseObject(object comObject)
Nachdem ich alle comObjects freigegeben habe, rufe ich GC.Collect und GC.WaitForPendingFinalizers auf (fragen Sie nicht - jeder, der mit Office-Interop zu tun hat, weiß das).
Und ... wie üblich, treffe ich eine Ecke Fall - wenn ich nicht die entsprechenden verwalteten Verweis auf null vor dem GC.Collect-Aufruf zuweisen, es bereinigt nicht richtig.
Mein Code sieht also wie folgt aus:
ReleaseObject(myComObject);
myComObject = null;
GC.Collect()
...
Da es eine Reihe von xxx=null gibt, beschloss ich, dies in die util-Methode aufzunehmen, aber da es einen Unterschied zwischen der Übergabe per Referenz und der Übergabe eines Referenzparameters gibt, musste ich die Methode natürlich ändern:
void ReleaseObject(out object comObject)
{
//do release
comObject = null;
}
und bearbeiten Sie den Anrufer zu:
MyComClass myComObject = xxxx;
ReleaseObject(out myComObject);
Dies schlägt mit einer Meldung fehl: "Cannot convert from 'out MyComClass' to 'out object'"
Während ich denken kann, warum es ein Problem sein kann (d.h. die umgekehrte Besetzung von Objekt zu MyComClass ist nicht implizit, und es gibt keine Garantie, was die Methode tun wird), war ich wundern, wenn es eine Problemumgehung, oder ich muss mit meinen Hunderten Zuweisungen von Nullen bleiben.
Hinweis: Ich habe eine Reihe von verschiedenen COM-Objekttypen, deshalb brauche ich einen "Objekt"-Parameter und keinen typsicheren.