我的应用程序使用一个Interop Com对象。因此,我编写了一个包装器类,以进行处置中的释放,或者如果未在终结器中完成,则进行释放。因此,我可以使用using关键字来确保完成释放。

使用这种模式是一种好方法吗?还是在Framework中甚至有一个为我做这件事的类?

    class ComWrapper<T> : IDisposable
    {
        private readonly T comObject;

        private bool disposed = false;

        public ComWrapper(T comObject)
        {
            this.comObject = comObject;
        }

        ~ComWrapper()
        {
            this.Dispose(false);
        }

        public T ComObject
        {
            get
            {
                return this.comObject;
            }
        }

        public void Dispose()
        {
            this.Dispose(true);
            GC.SuppressFinalize(this);
        }

        public void Dispose(bool disposing)
        {
            if (this.disposed)
            {
                return;
            }

            Marshal.FinalReleaseComObject(this.comObject);
        }
    }

最佳答案

我个人不建议这样做,因为它似乎毫无意义。但是,我建议使用此方法创建一个名为Utility的静态类:

    public static void disposeComObject<T>(ref T comObject)
    {
       if(Marshal.IsComObject(comObject) && comObject != null)
       {
           //You need to save the object
           if(typeof(T) == typeof(Microsoft.Office.Interop.Excel.Workbook))
           {
                ((Microsoft.Office.Interop.Excel.Workbook))comObject.Save();
                ((Microsoft.Office.Interop.Excel.Workbook))comObject.Close();
           }

           //You need to save the object
           if(typeof(T) == typeof(Microsoft.Office.Interop.Excel.Application))
           {
                ((Microsoft.Office.Interop.Excel.Application))comObject.Quit();
           }

           Marshal.ReleaseComObject(comObject);
           comObject = null;
       }
    }


现在从代码中,您可以这样称呼它

     ...
     Microsoft.Office.Interop.Excel comObject = null;
     try{
        //Open comObject
        //Here I would call some functions, and have nested exceptions
     }
     catch(nestedException err)
     {
          //Handle at your discretion
     }
     finally{
          Utility.disposeComObject(ref comObject);
     }


这特定于Excel命名空间,但是对其进行调整应该足够容易。

关于c# - 是ComWrapper类的明智之选,以包装Interop Com对象,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/30013615/

10-10 19:35