Я прочитал много статей о сети о безопасном выпуске RCW, и мне кажется, что никто не может договориться о том, что нужно делать в каком порядке, поэтому я Я спрашиваю вас, ребята, за ваши мнения. Например, можно было бы сделать это:Освобождение ссылки на объект COM безопасно из .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();
}
}
Однако, некоторые люди выступают делают сбор мусора, прежде чем Marshal.FinalReleaseComObject
, некоторые после, и некоторые из них не совсем. Действительно ли необходимо GC каждый RCW вручную, особенно после того, как он уже отсоединен от своего объекта COM?
На мой взгляд, было бы проще и легче просто отделить RCW от объекта COM и оставить RCW истекает естественно:
object target = null;
try {
// Same content as above.
} finally {
if(target != null) {
Marshal.FinalReleaseComObject(target);
}
}
Достаточно ли сделать это?
Отличный и подробный анализ, спасибо Тони! –
Downvote: эти люди все рекомендуют обратное в пользу 'GC.Collect': [Microsoft Distinguished Engineer] (http://blogs.msdn.com/b/cbrumme/archive/2003/04/16/51355. aspx), [команда Visual Studio] (http://blogs.msdn.com/b/visualstudio/archive/2010/03/01/marshal-releasecomobject-considered-dangerous.aspx) и [высокопоставленный член SO ] (http://stackoverflow.com/a/17131389/1995977) –
@Steve: Спасибо за ссылки. Я обновил ответ, чтобы включить ссылку на ваши оговорки. –