保证COM对象发布?

保证COM对象发布?,com,c#-4.0,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 =

我在假设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;
    }
}
我怎样才能确保它是真的?我是否需要分别发布
工作簿
工作表

我希望在程序的整个生命周期中都有Excel,这是一个巨大的性能改进

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

是,两者都将使基础Excel应用程序对象保持活动状态

我怎样才能确保它是真的

将执行此操作,但请确保在此之后不使用对对象的引用

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

是,两者都将使基础Excel应用程序对象保持活动状态

我怎样才能确保它是真的

将执行此操作,但请确保在此之后不使用对对象的引用。

在析构函数调用中

xl.Quit()

在析构函数调用中


xl.Quit()

如果有人感兴趣,以下是可行的解决方案:

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

如果有人感兴趣,以下是可行的解决方案:

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

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

在编写Excel时,您仍然必须非常仔细地处理COM引用


事实上,PIA也喜欢在幕后生成引用,而当垃圾被收集时,他们不会正确地整理这些引用,这使得情况更加复杂。您必须显式关闭任何COM引用。

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

在编写Excel时,您仍然必须非常仔细地处理COM引用


事实上,PIA也喜欢在幕后生成引用,而当垃圾被收集时,他们不会正确地整理这些引用,这使得情况更加复杂。您必须明确关闭任何COM引用。

如果要使用office文件,建议您查看。这是用于java的POI库的一个点网络端口,它在处理office文件时会出现漂移。不需要凌乱的COM,全部用CLR代码完成,一切正常


我已经使用它生成excel报告,没有任何问题。试试看,我相信你不会后悔的。如果您想使用office文件,我建议您查看一下。这是用于java的POI库的一个点网络端口,它在处理office文件时会出现漂移。不需要凌乱的COM,全部用CLR代码完成,一切正常


我已经使用它生成excel报告,没有任何问题。试试看,我相信你不会后悔的。这实际上是一个复制品,比使用COM要好得多。看,这实际上是一个复制品。看见