C# ComWrapper类是否明智地包装互操作Com对象

C# ComWrapper类是否明智地包装互操作Com对象,c#,interop,dispose,finalize,C#,Interop,Dispose,Finalize,I使用互操作Com对象的应用程序。因此,我编写了一个包装器类,用于在dispose中进行释放,或者如果没有在终结器中进行释放的话。所以我可以使用using关键字来确保释放完成 使用这种模式是一种好方法吗?或者框架中是否有一个类为我这样做 class ComWrapper<T> : IDisposable { private readonly T comObject; private bool disposed = false;

I使用互操作Com对象的应用程序。因此,我编写了一个包装器类,用于在dispose中进行释放,或者如果没有在终结器中进行释放的话。所以我可以使用
using
关键字来确保释放完成

使用这种模式是一种好方法吗?或者框架中是否有一个类为我这样做

    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);
        }
    }
类ComWrapper:IDisposable
{
私有只读T对象;
私有布尔=假;
公共ComWrapper(T comObject)
{
this.comObject=comObject;
}
~ComWrapper()
{
本.处置(假);
}
公共对象
{
得到
{
返回此.com对象;
}
}
公共空间处置()
{
这个。处置(真实);
总干事(本);
}
公共无效处置(bool处置)
{
如果(本文件已处理)
{
返回;
}
Marshal.FinalReleaseComObject(此.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;
       }
    }

这是特定于Excel名称空间的,但是调整它应该很容易。

您的方法很好。框架中没有为您执行此操作的类。在处理com对象后,您忘记将
disposed
字段设置为true
Dispose(bool)
应该是受保护的和虚拟的(如果可以继承的话)。可能的重复:不,这是根本不正确的代码,它只能用于非常简单的COM对象模型。我有点厌倦了说服程序员们走出这个错误,仅仅是那些做了很多的人。我有一些简单的Com对象作为遗留系统的API。如果发生这种情况,API将在.NET中一步重写。
     ...
     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);
     }