我知道在使用互操作时我应该释放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范围内没有必要,即使它仍然存在,它是否会受到伤害?
答案 0 :(得分:2)
Marshal.ReleaseComObject
。对于COM对象的随意使用,不会建议您完全使用此方法。
检查here
此方法用于显式控制COM对象的生命周期 从托管代码中使用。您应该使用此方法来释放 基础COM对象,及时保存对资源的引用 方式或必须按特定顺序释放对象时。
关于你的第二个问题
由于我从workbook.Sheets访问工作表,我是否必须发布 这个对象?如果是这样,因为我返回工作表?我不能 在我回来之前释放?
.NET中的COM实现使用引用计数机制来检测是否使用了对象,因此否您不必明确释放任何内容。该框架对此负有责任。
注意:强>
使用适当的。Close
(适用于工作簿),。Quit
(适用于应用程序)方法来正确释放resurces。当您在应用程序对象上使用。Quit
()时,您将在Windows中关闭excel进程(这将释放所有资源),并在工作簿上使用。Close
()来释放文件锁。等特定的excel文件。