我的应用程序使用一个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/