在开发Excel Addin时释放COM?

时间:2017-12-21 14:04:28

标签: c# vsto excel-interop excel-addins

我知道在使用互操作时我应该释放COM对象。在开发和加载项时,例如Excel会有所不同吗?这是一个循环,我很想知道Marshal.ReleaseComObject是否必要?

 foreach (var sheet in results.Sheets)
            {
                var newSheet = workbook.AddSheet();

                newSheet.SetSheetTabColor(sheet.TabColor);
                newSheet.SetSheetName(sheet.TabName);
                newSheet.Cells.SetFont("Calibri", 8);
                newSheet.FreezeRow(1);

                var endRow = sheet.Data.GetUpperBound(0) + 1;
                var endColumn = sheet.Data.GetUpperBound(1) + 1;

                var writeRange = newSheet.SetWriteRange(1, 1, endRow, endColumn);



                writeRange.Value2 = sheet.Data;

                newSheet.AutoFitColumns();
                newSheet.RemoveColumn(1);

                Marshal.ReleaseComObject(newSheet);

            }

另外,我创建了一个带扩展方法的库。一个例子是workbook.AddSheet() AddSheet,如下所示:

public static Worksheet AddSheet(this Microsoft.Office.Interop.Excel.Workbook workbook)
        {
            var sheets = workbook.Sheets;

            return sheets.Add(After: sheets[sheets.Count]);
        }

由于我从sheets访问workbook.Sheets,我是否必须发布此对象?如果是这样,因为我返回工作表?我回来之前无法释放?

这可能是一个愚蠢的问题,但是如果Marshal.ReleaseComObject在foreach范围内没有必要,即使它仍然存在,它是否会受到伤害?

1 个答案:

答案 0 :(得分:2)

仅当您需要及时或按特定顺序控制COM对象的生命周期时,才使用

Marshal.ReleaseComObject。对于COM对象的随意使用,不会建议您完全使用此方法。

检查here

  

此方法用于显式控制COM对象的生命周期   从托管代码中使用。您应该使用此方法来释放   基础COM对象,及时保存对资源的引用   方式或必须按特定顺序释放对象时。

关于你的第二个问题

  

由于我从workbook.Sheets访问工作表,我是否必须发布   这个对象?如果是这样,因为我返回工作表?我不能   在我回来之前释放?

.NET中的COM实现使用引用计数机制来检测是否使用了对象,因此您不必明确释放任何内容。该框架对此负有责任。

注意: 使用适当的。Close(适用于工作簿),。Quit(适用于应用程序)方法来正确释放resurces。当您在应用程序对象上使用。Quit()时,您将在Windows中关闭excel进程(这将释放所有资源),并在工作簿上使用。Close()来释放文件锁。等特定的excel文件。