COM对象具有在GC

时间:2017-07-28 16:08:43

标签: c# memory-leaks com garbage-collection

我有一个.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对象比较新,但除了强制垃圾回收之外,没有其他方法可以释放引用并清理与对象关联的内存吗?我讨厌这样做。谢谢。

0 个答案:

没有答案