3

重複の可能性:
C# で Excel 相互運用オブジェクトを適切にクリーンアップする方法

C# 用の Office Interop ライブラリを使用するアプリケーションがあります。

このライブラリは、IIS7 でホストされている ASP.NET アプリケーションから呼び出されます。

関連するコード ビットは次のとおりです。

/// <summary>
/// Provides excel functions.
/// </summary>
public class ExcelStuff : IDisposable
{
    #region Excel Components

    // The following are pre-allocated Excel objects that must be explicitly disposed of.

    private Excel.Application xApp;
    private Excel.Workbooks xWorkbooks;
    private Excel.Workbook xWorkbook;
    private Excel.Sheets xWorksheets;
    private Excel.Worksheet xWorksheet;
    private Excel.ChartObjects xCharts;
    private Excel.ChartObject xMyChart;
    private Excel.Chart xGraph;
    private Excel.SeriesCollection xSeriesColl;
    private Excel.Series xSeries;

    #endregion

    /// <summary>
    /// Initializes a new instance of the <see cref="ExcelStuff" /> class.
    /// </summary>
    public ExcelStuff()
    {
    }

    /// <summary>
    /// Does some work.
    /// </summary>
    public void DoWork()
    {
        byte[] data = new byte[0];

        worker = new Thread(() =>
        {
            // Do some work.
        });

        worker.Start();
        worker.Join();

        worker.Abort();
        worker = null;

        Dispose();
    }

    /// <summary>
    /// Disposes the current object and cleans up any resources.
    /// </summary>
    public void Dispose()
    {
        // Cleanup
        xWorkbook.Close(false);
        xApp.Quit();

        // Manual disposal because of COM
        xApp = null;
        xWorkbook = null;
        xWorksheets = null;
        xWorksheet = null;
        xCharts = null;
        xMyChart = null;
        xGraph = null;
        xSeriesColl = null;
        xSeries = null;

        GC.Collect();
    }
}

コードに多くの冗長性があることに気付くでしょう。これは、この問題を解決するための私の必死の試みです。ですから、呼び出すのが非効率的だGC.Collect()とかDispose()、クラス内から呼び出すのは良くないとか言わないでください - 私はこれらのことをすでに知っています。

私が知りたいのは、EXCEL.exeできるだけ多くのオブジェクトをクリーンアップするために最善を尽くしているときに、このコードが孤立したプロセスをサーバー上で実行し続ける理由です。

4

1 に答える 1

3

誰かがコメントで述べたように、Marshal.ReleaseComObject は、私が Excel オブジェクトをクリーンアップするために使用するものです。これが私のコードのサンプルです:

        wb.Close(false, System.Reflection.Missing.Value, System.Reflection.Missing.Value);

        while (System.Runtime.InteropServices.Marshal.ReleaseComObject(wb) != 0)
        { }

        excelApp.Quit();

        while (System.Runtime.InteropServices.Marshal.ReleaseComObject(excelApp) != 0)
        { }

これは私にはうまくいくようです。幸運を!

編集:申し訳ありませんが、これが重複しているとは思いませんでした。Modはこれで何でもできます...

于 2012-06-27T14:07:04.793 に答える