我有一个.NET应用程序,它使用一堆COM对象(ESRI ArcGIS)从一种格式转换文件中的某些数据,然后将其导出为另一种格式的文件。
我已经尝试过寻找一个解决这个问题的ArcGIS解决方案,但经过一天左右的研究后却没有成功,所以我还没有在这个问题上加入这个标签,因为它最终并不重要它们是哪些COM对象。
好的,问题是导出过程中出现异常。我捕获异常,向用户显示消息,并删除导出文件。
问题是File.Delete
调用抛出异常,因为与数据导出关联的COM对象仍然具有文件句柄,COM对象本身没有"关闭"方法,GC还没有回收那个记忆。
以下是代码:
try {
...
}
catch(Exception)
{
if (Directory.Exists(outputFolder) && File.Exists(pgdbPath))
{
// Release all references to com object holding a handle to the .mdb file.
int refs;
var targetWorkspaceName = GetWorkspaceName(pgdbPath, "esriDataSourcesGDB.AccessWorkspaceFactory");
// COM object w/ handle to file at 'pgdbPath'
var targetWorkspace = GetWorkspace(targetWorkspaceName);
do
{
refs = System.Runtime.InteropServices.Marshal.ReleaseComObject(targetWorkspace);
} while (refs > 0);
// Need to use GC to clean up the unmanaged memory pointed to by released references.
GC.Collect();
GC.WaitForPendingFinalizers();
GC.Collect();
GC.WaitForPendingFinalizers();
// would throw file access exception without GC.
File.Delete(pgdbPath);
}
throw;
}
我在.NET中使用COM对象比较新,但除了强制垃圾回收之外,没有其他方法可以释放引用并清理与对象关联的内存吗?我讨厌这样做。谢谢。