2

ワークブック、ワークシート、Excel タスク用のアプリなどのオブジェクトを使用します。Excel を使い終わったら、以下のコードで解放してみます。結局、タスク マネージャーにはまだ EXCEL.EXE が表示されます。なぜ完全にリリースしないのですか?

Excelタスクの私のクラス:

Excel._Application app = new Excel.Application();
Excel._Workbook workbook = app.Workbooks.Add(Type.Missing);
Excel._Worksheet worksheet = null;
app.Visible = true;

worksheet.Cells[1, 1] = "test string";

workbook.SaveAs("C:\testfile.xlsx");

object misValue = System.Reflection.Missing.Value;
workbook.Close(true, misValue, misValue);
app.Quit();

releaseObject(worksheet2);
releaseObject(workbook);
releaseObject(app);

releaseObject クラス:

    private void releaseObject(object obj)
    {
        try
        {
            System.Runtime.InteropServices.Marshal.ReleaseComObject(obj);
            obj = null;
        }
        catch (Exception ex)
        {
            obj = null;
            MessageBox.Show("Unable to release the Object " + ex.ToString());
        }
        finally
        {
            GC.Collect();
        }
    } 

EXCEL.EXE はまだタスク マネージャーにあります。 ここに画像の説明を入力

4

5 に答える 5

4

すでに回答済み参照:

Excel相互運用オブジェクトを適切にクリーンアップするにはどうすればよいですか?

基本的に、COMオブジェクトはアンマネージオブジェクト(duh)であり、スコープ外になっても解放されません。System.Runtime.InteropServices.Marshal.ReleaseComObject()を使用して、(ガベージコレクターで)ファイナライズされる前にそれらを解放できますが、すべてのオブジェクトの参照を保持する必要があります:excelApp.Worksheets.Open() Open()メソッドで開かれたコレクション「Worksheets」と「Worksheet」の2つのオブジェクトを作成します。

于 2012-08-06T01:47:58.430 に答える
2

Process を使用して、タスク マネージャーから EXCEL オブジェクトを簡単に強制終了できます。以下を参照してお楽しみください。

//Kill the all EXCEL obj from the Task Manager(Process)
System.Diagnostics.Process[] objProcess = System.Diagnostics.Process.GetProcessesByName("EXCEL");

if (objProcess.Length > 0)
{
    System.Collections.Hashtable objHashtable = new System.Collections.Hashtable();

    // check to kill the right process
    foreach (System.Diagnostics.Process processInExcel in objProcess)
    {
        if (objHashtable.ContainsKey(processInExcel.Id) == false)
        {
             processInExcel.Kill();
        }
    }
    objProcess = null;
}

//In case of you want to quit what you have created the Excel object from your application //just use below condition in above,

    if(processInExcel.MainWindowTitle.ToString()== "")
于 2012-10-26T10:37:59.717 に答える
1

Office Interop を使ってからしばらく経ちました (実際には Outlook で使用していましたが、概念は同じはずです)。すべてを完全に解放できる唯一の方法は、これを行うことでした。

GC.Collect();
GC.WaitForPendingFinalizers();
GC.Collect();

試してみます....

于 2012-08-05T23:45:12.380 に答える
1

これは私が解決できなかった問題です。以前にこれらの回答をすべて見たことがあり、それらすべてを実装しましたが、まだExcelが閉じませんでした。私は力ずくで物事をしなければなりませんでした。私がしたことは、BAT ファイルを作成し、プログラムから実行することでした。ファイルの内容は次のとおりです。

Taskkill /F /IM excel.exe

これにより、実行中のすべてのExcelが呼び出されます。別の解決策が見つからない場合は、これを使用します。

于 2012-08-06T01:58:10.933 に答える
0

バックグラウンドでExcelプログラムを開くので、このようにしてExcelアプリケーションを閉じる必要があります....

app .Application.Quit();

次の方法で、上記の行コードをコードに追加します。

    object misValue = System.Reflection.Missing.Value;
    workbook.Close(true, misValue, misValue);
    app .Application.Quit();
    app.Quit();
于 2012-08-05T23:07:21.093 に答える