Excel 相互運用アプリでいくつかの COM オブジェクトを解放する次のコードがあります。
. . .
}
Marshal.ReleaseComObject(_xlSheet);
Marshal.ReleaseComObject(_xlSheets);
_xlBook.Close(false, null, null);
Marshal.ReleaseComObject(_xlBook);
_xlApp.DisplayAlerts = false;
_xlApp.Quit();
OnChanged(EventArgs.Empty);
} // foreach (DataRowView drv in selectedUnits)
Marshal.ReleaseComObject(_xlApp);
別の場所で、そこで使用されているシートもリリースします。
Marshal.ReleaseComObject(_xlSheetDelPerf);
これはすべて正常に機能しますが、Resharper Inspect > Code Issues in Solution は、Excel.Worksheet オブジェクトへの 2 回の ReleaseComObject() 呼び出しで「「NotNull」属性でマークされたエンティティへの「null」割り当ての可能性」を発見します (シートへの呼び出しではありません)。 、ワークブック、またはアプリケーション オブジェクト)。それらは次のように定義されます。
using Excel = Microsoft.Office.Interop.Excel;
. . .
private Excel.Application _xlApp;
private Excel.Workbook _xlBook;
private Excel.Sheets _xlSheets;
private Excel.Worksheet _xlSheet;
private Excel.Worksheet _xlSheetDelPerf;
Worksheet がそれほど [非] 特別な理由は何ですか? さらに重要なことに、それらの ReleaseComObject() コードを削除する必要がありますか? そして、それらを解放する代わりに何か他のものを使用しますか?
注:ここのVVS による「Excel 相互運用オブジェクトを適切にクリーンアップする方法」という質問に対する受け入れられた回答は、474 の賛成票で、シートがこのようにリリースされていることを示しています...?!?
アップデート
さて、私は MethodMan のアドバイスに従いました (そのようなモニカで誰がそうしないでしょうか?) そして今、私は:
// Free up resources
Marshal.ReleaseComObject(_xlSheet);
Marshal.ReleaseComObject(_xlSheets);
_xlBook.Close(false, null, null);
Marshal.ReleaseComObject(_xlBook);
_xlApp.DisplayAlerts = false;
_xlApp.Quit();
_xlSheet = null;
_xlSheets = null;
_xlBook = null;
} //if (_xlSheet != null)
OnChanged(EventArgs.Empty);
} // foreach (DataRowView drvu in selectedUnits)
Marshal.ReleaseComObject(_xlApp);
_xlApp = null;
} // try
finally
{
GC.Collect();
}