代码之家  ›  专栏  ›  技术社区  ›  György Andrasek

保证COM对象释放?

  •  0
  • György Andrasek  · 技术社区  · 15 年前

    我编写了以下代码,假设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;
        }
    }
    

    我怎样才能确定它是真的?我需要释放吗 workbook sheet

    5 回复  |  直到 15 年前
        1
  •  2
  •   Richard    15 年前

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

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

    我怎样才能确定它是真的?

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

        2
  •  1
  •   György Andrasek    15 年前

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

    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
  •  1
  •   ConcernedOfTunbridgeWells    15 年前

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

    事实上,PIA也喜欢在幕后生成引用,而且当垃圾被收集时,它们不会正确地整理这些引用。必须显式关闭任何COM引用。

        4
  •  1
  •   void    15 年前

    NPOI lib . 这是POI lib for java的一个dot-net端口,它在处理office文件时工作。没有凌乱的COM需要,所有的CLR代码完成,一切工作如预期。

        5
  •  0
  •   OlimilOops    15 年前

    在析构函数调用中

    xl.Quit();

    推荐文章