J'ai lu beaucoup d'articles sur le net sur la libération de RCW en toute sécurité, et il me semble que personne ne peut être d'accord sur exactement ce qui doit être fait dans quel ordre, donc je Je vous demande les gars pour vos opinions. Par exemple, on pourrait le faire:Libérer une référence d'objet COM en toute sécurité à partir de .NET
object target = null;
try {
// Instantiate and use the target object.
// Assume we know what we are doing: the contents of this try block
// do in fact represent the entire desired lifetime of the COM object,
// and we are releasing all RCWs in reverse order of acquisition.
} finally {
if(target != null) {
Marshal.FinalReleaseComObject(target);
target = null;
GC.Collect();
GC.WaitForPendingFinalizers();
}
}
Cependant, certaines personnes préconisent de faire la collecte des ordures avant Marshal.FinalReleaseComObject
, certains après, et d'autres pas du tout. Est-il vraiment nécessaire de GC manuellement chaque RCW, surtout après qu'il a déjà été détaché de son objet COM?
À mon avis, il serait plus simple et plus facile à détacher juste le RCW de l'objet COM et laisser le RCW expirer naturellement:
object target = null;
try {
// Same content as above.
} finally {
if(target != null) {
Marshal.FinalReleaseComObject(target);
}
}
Est-il suffisant pour le faire?
Excellente analyse détaillée, merci Tony! –
Downvote: ces gens recommandent tous le contraire en faveur de 'GC.Collect': [un Microsoft Distinguished Engineer] (http://blogs.msdn.com/b/cbrumme/archive/2003/04/16/51355. aspx), [l'équipe Visual Studio] (http://blogs.msdn.com/b/visualstudio/archive/2010/03/01/marshal-releasecomobject-considered-dangerous.aspx), et [un membre SO très bien classé ] (http://stackoverflow.com/a/17131389/1995977) –
@Steve: Merci pour les liens. J'ai mis à jour la réponse pour inclure une référence à vos avertissements. –