【问题标题】:Guaranteed COM object release?保证 COM 对象释放?
【发布时间】:2010-06-01 13:55:46
【问题描述】:

假设 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,这是一个巨大的性能改进。

【问题讨论】:

标签: com c#-4.0


【解决方案1】:

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

是的,两者都可以使底层的 Excel 应用程序对象保持活动状态。

我如何确保这样做?

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

【讨论】:

    【解决方案2】:

    这是可行的解决方案,以防有人感兴趣:

    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;
        }
    }
    

    【讨论】:

      【解决方案3】:

      作为背景知识,Excel 倾向于在幕后生成隐藏引用,这是用于支持 VBA 的 COM 默认机制的功能。例如,您可以与“应用程序”对话,它会悄悄地设置一个您无法分离的 COM 引用。

      在编写 Excel 时,您仍然必须对 COM 引用非常谨慎。

      由于 PIA 也喜欢在幕后生成引用,并且在垃圾收集时他们没有正确整理这些引用,这使情况更加复杂。您必须明确关闭任何 COM 引用。

      【讨论】:

        【解决方案4】:

        如果您想处理办公文件,我建议您查看NPOI lib。这是用于 java 的 POI 库的点网络端口,它在处理办公文件时会徘徊。不需要凌乱的 COM,一切都在 CLR 代码中完成,一切都按预期工作。

        我已经用它来生成没有问题的 Excel 报告。试一试我相信你不会后悔的。比使用 COM 好多了

        【讨论】:

          【解决方案5】:

          在析构函数调用中

          xl.Quit();

          【讨论】:

            猜你喜欢
            • 2015-09-25
            • 2012-09-17
            • 2015-07-09
            • 1970-01-01
            • 2012-03-05
            • 2014-02-14
            • 1970-01-01
            • 2013-03-21
            相关资源
            最近更新 更多