0

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();
}
4

0 に答える 0