保证COM对象释放?

时间:2010-05-15 15:17:45

标签: com c#-4.0

我假设Excel会死于Monkey:

,我编写了以下代码
class ExcelMonkey
{
    private static Excel.Application xl = new Excel.Application();

    public static bool parse(string filename)
    {

        if (filename.Contains("foo"))
        { 
            var workbook = xl.Workbooks.Open(filename);
            var sheet = workbook.Worksheets.get_Item(1);

            // do stuff

            return true;

        }

        return false;
    }
}

我如何确定它呢?我是否需要单独发布workbooksheet

我希望在程序的生命周期内安装Excel,这是一项巨大的性能提升。

5 个答案:

答案 0 :(得分:2)

  

我是否需要单独发布工作簿和工作表?

是的,要么将基础Excel应用程序对象保持活动状态。

  

我如何确定它呢?

Marshal.ReleaseComObject会这样做,但请确保在此之后不要使用对象的引用。

答案 1 :(得分:1)

以下是工作解决方案,以防任何人感兴趣:

class ExcelMonkey
{
    private Excel.Application xl = new Excel.Application();

    ~ExcelMonkey()
    {
        xl.Quit();
        Dispose(false);
    }

    private bool isDisposed = false;


    protected void Dispose(bool disposing)
    {
        Marshal.ReleaseComObject(xl);
        isDisposed = true;
    }

    public bool parse(string filename)
    {
        if (filename.Contains("foo"))                  
        {
            var workbook = xl.Workbooks.Open(filename);
            var sheet = workbook.Worksheets.get_Item(1);

            try
            {
                // do stuff
            }
            finally
            {
                Marshal.ReleaseComObject(sheet);
                Marshal.ReleaseComObject(workbook);
            }
            return true;
        }
        return false;
    }
}

答案 2 :(得分:1)

作为一些背景知识,Excel倾向于在幕后生成隐藏引用,作为用于支持VBA的COM默认机制的函数。例如,您可以与“应用程序”交谈,它会安静地设置一个您无法分离的COM引用。

在编写Excel时,您仍然需要对COM引用非常细致。

事实上,PIA也喜欢在幕后生成引用,并且在收集垃圾时不能正确整理这些引用。您必须显式关闭任何COM引用。

答案 3 :(得分:1)

如果您想使用office文件,我建议您查看NPOI lib。这是一个用于java的POI lib的点网端口,它在使用office文件时可以工作。不需要凌乱的COM,所有都在CLR代码中完成,一切都按预期工作。

我用它来生成excel报告没有问题。试一试,我相信你不会后悔的。比使用COM

好多了

答案 4 :(得分:0)

在析构函数调用中

xl.Quit();