2016-07-06 14 views
3

私は以下の方法を使用しています。このコードブロックが実行されると、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(); 
} 
+0

ガベージコレクタの仕組みを理解していない別のケース。ここで何度もカバーされています。[こちら](http://stackoverflow.com/questions/25134024/clean-up-excel-interop-objects-with-idisposable/25135685#25135685) –

答えて

-1

私は適切な解決策を見たいと思いますが、このハックが私にそれを働かせる唯一の方法でした。 interopライブラリは、教えられたときにプロセスをシャットダウンする際に、まったくうまくいかないようです。スレッドで実行している場合は、スレッドごとにプロセスが開始されます。私はプロセスIDを追跡し、プロセスを名前でスキャンし、新しいプロセスを追跡することから始めました。私はサーバー上でこれをやっていたので、すべてのプロセスが相互運用を開始し、実際のユーザーによって起動されていないことが分かっていました。私はロジックを完了した後、毎分プロセスを終了しようとするタイマーを起動します。最終的にそれはそれを止めるでしょう。また、アプリケーションが最後に実行されたときに正しく殺されなかった場合に備えて、起動時にExcelプロセスを強制終了するコードがいくつかありました。

名前またはIDでプロセスを強制終了するサンプルコードが必要な場合はお知らせください。私はそれをすぐに利用することはできません、または迅速なSOの検索は、いくつかの良いサンプルをもたらす必要があります。

+0

ダウン投票者を説明してください。これは理想的な解決策ではないかもしれませんが、うまくいきます。私は理想的な解決策を知りたいとも言いました。 – ManOVision

関連する問題