He leído un montón de artículos en la red sobre la liberación de RCW de forma segura, y me parece que nadie puede ponerse de acuerdo sobre exactamente lo que hay que hacer y en qué orden, por lo que Les estoy pidiendo sus opiniones. Por ejemplo, se podría hacer esto:El lanzamiento de una referencia a un objeto COM con seguridad 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();
}
}
Sin embargo, algunas personas abogan por hacer la recolección de basura antes de Marshal.FinalReleaseComObject
, algunos después, y algunos no en todos. ¿Es realmente necesario GC cada RCW manualmente, especialmente después de que ya se haya separado de su objeto COM?
En mi opinión, sería más simple y más fácil simplemente separar la RCW desde el objeto COM y dejar el RCW expirar natural:
object target = null;
try {
// Same content as above.
} finally {
if(target != null) {
Marshal.FinalReleaseComObject(target);
}
}
¿Es suficiente para hacer eso?
Análisis excelente y detallado, gracias Tony! –
Downvote: todas estas personas recomiendan lo opuesto a favor de 'GC.Collect': [un distinguido ingeniero de Microsoft] (http://blogs.msdn.com/b/cbrumme/archive/2003/04/16/51355. aspx), [el equipo de Visual Studio] (http://blogs.msdn.com/b/visualstudio/archive/2010/03/01/marshal-releasecomobject-considered-dangerous.aspx), y [a SO miembro de alto rango ] (http://stackoverflow.com/a/17131389/1995977) –
@Steve: Gracias por los enlaces. He actualizado la respuesta para incluir una referencia a tus advertencias. –