私は以下の方法を使用しています。このコードブロックが実行されると、Microsoft Excelがタスクマネージャーを確認してバックグラウンドで実行されていることがわかります。Excel Interopオブジェクトが公開されていません
編集:ちょうど Microsoft Excelのバックグラウンド・プロセスが生きたまま。 ExcelとInterop COMオブジェクトで初めて作業を開始したときに、時々プロセスが実行を終了したままになるため、これを追加するだけです。
現在の機能を実行した後、Excelがバックグラウンドで実行されないようにするにはどうすればよいですか?
いくつかの機能がそれらを必要と終わるので、私はグローバルスコープでこれらの変数を宣言します。
private Excel.Application xls = null;
private Excel.Workbooks workBooks = null;
private Excel.Workbook workBook = null;
private Excel.Sheets sheets = null;
private Excel.Worksheet workSheet = null;
この方法は、シートが与えられ、ブック内に存在するかどうかをチェックするためのものです:
private bool sheetExists(string searchString)
{
xls = new Excel.Application();
workBooks = xls.Workbooks;
workBook = workBooks.Open(workbookPath); // <- Where the workbook is saved
sheets = workBook.Sheets;
bool isFound = false;
foreach (Excel.Worksheet sheet in sheets)
{
// Check the name of the current sheet
if (sheet.Name == searchString)
{
Marshal.ReleaseComObject(sheet);
isFound = true;
break;
}
Marshal.ReleaseComObject(sheet);
}
cleanUp(true, xls, workBooks, workBook, sheets);
return isFound;
}
この関数は、COMオブジェクトを解放するための関数です。
private void cleanUp(bool saveTrueFalse, params object[] comObjects)
{
workBook.Close(saveTrueFalse);
xls.Application.Quit();
xls.Quit();
foreach (object o in comObjects)
{
Marshal.ReleaseComObject(o);
}
workSheet = null;
sheets = null;
workBook = null;
workBooks = null;
xls = null;
GC.Collect();
GC.WaitForPendingFinalizers();
GC.Collect();
GC.WaitForPendingFinalizers();
}
ガベージコレクタの仕組みを理解していない別のケース。ここで何度もカバーされています。[こちら](http://stackoverflow.com/questions/25134024/clean-up-excel-interop-objects-with-idisposable/25135685#25135685) –