RCWを安全にリリースするために、ネット上で多くの記事を読んできましたが、何がどのような順序で行われる必要があるかについて誰も同意できないようです皆さんの意見を聞いています。いくつかの後、.NETから安全にCOMオブジェクトリファレンスを解放する
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
前にガベージコレクションを行うことを提唱し、いくつかのすべてではない:例えば、一つはこれを行うことができます。手動でRCWを手動でGCする必要がありますか?特にCOMオブジェクトから既に切り離されている場合は特に必要ですか?私の心に
、それだけでCOMオブジェクトからRCWを切り離し、自然に期限切れにRCWを残すために簡単かつ容易になる:
object target = null;
try {
// Same content as above.
} finally {
if(target != null) {
Marshal.FinalReleaseComObject(target);
}
}
それはそれを行うのに十分ですか?解放対象のCOMオブジェクトへのあなたの参照を持っている
優れた詳細な解析、ありがとうTony! –
Downvote:これらの人々はすべて、「GC.Collect」を好む反対者を推奨しています。 [Microsoft Distinguished Engineer](http://blogs.msdn.com/b/cbrumme/archive/2003/04/16/51355)。 aspx)、[Visual Studio Team](http://blogs.msdn.com/b/visualstudio/archive/2010/03/01/marshal-releasecomobject-considered-dangerous.aspx)、[上位のSOメンバー](http://stackoverflow.com/a/17131389/1995977) –
@スティーブ:リンクをありがとう。あなたの注意書きへの参照を含めるように答えを更新しました。 –