0

重複
の可能性: 相互運用アプリケーション プロセスの強制終了

Excel からデータを取得するために Microsoft.Office.Interop.Excel を使用しています。COM オブジェクトをクリアしても、EXEL.EXE のいくつかのインスタンスがバックグラウンドに残ります。以下のコードを確認してください。

finally
        {
            if (cells != null) Marshal.FinalReleaseComObject(cells);
            if (range != null) Marshal.FinalReleaseComObject(range);
            if (sheets != null) Marshal.FinalReleaseComObject(sheets);
            if (workSheet != null) Marshal.FinalReleaseComObject(workSheet);
            if (excelWorkBook != null)
            {
                excelWorkBook.Close(Type.Missing, Type.Missing, Type.Missing);
                Marshal.FinalReleaseComObject(excelWorkBook);
            }
            if (excelWorkbooks != null) Marshal.FinalReleaseComObject(excelWorkbooks);

            if (excel != null)
            {
                excel.Quit();
                Marshal.FinalReleaseComObject(excel);
            }
            cells = null;
            range = null;
            sheets = null;
            workSheet = null;
            excelWorkBook = null;
            excelWorkbooks = null;
            excel = null;

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

        }

どこが間違っているのか教えてください。

4

1 に答える 1

1

解放されない唯一の変数はsheets、次のように定義されます。

   sheets = excelWorkBook.Worksheets;

繰り返しになりますが、シートは使用されないため、ワークシートは次のように割り当てられるため、完全に省略できます。

   workSheet = (Worksheet)excelWorkBook.Worksheets["Sheet1"]; //doesn't use sheets, so sheets can be omitted

または、シートが必要な場合、それがリリースされた場合、私のテストでは、Excelプロセスが閉じていることが示されています(アプリケーションの終了前、アプリケーションの終了後、常に正常に閉じられました)

   Marshal.FinalReleaseComObject(sheets);
于 2012-06-22T08:12:57.040 に答える