C# 开发Excel加载项时是否释放COM?
我知道在使用互操作时应该释放COM对象。在开发和加载项(例如Excel)时,情况是否有所不同?这里有一个循环,我很想知道是否需要C# 开发Excel加载项时是否释放COM?,c#,vsto,excel-interop,excel-addins,C#,Vsto,Excel Interop,Excel Addins,我知道在使用互操作时应该释放COM对象。在开发和加载项(例如Excel)时,情况是否有所不同?这里有一个循环,我很想知道是否需要封送.ReleaseComObject foreach (var sheet in results.Sheets) { var newSheet = workbook.AddSheet(); newSheet.SetSheetTabColor(sheet.TabColor);
封送.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
访问工作表
,我必须释放此对象吗?如果是,我返回工作表后在哪里?在我回来之前我不能释放
这可能是一个愚蠢的问题,但是如果foreach作用域中不需要
封送.ReleaseComObject
,那么即使它仍然存在,也会有伤害吗?封送.ReleaseComObject
仅在需要及时或按特定顺序控制COM对象的生存期时才使用。对于随意使用COM对象,我不会建议您使用此方法
检查
此方法用于显式控制COM对象的生存期
从托管代码中使用。您应该使用此方法释放
及时保存对资源的引用的基础COM对象
必须按特定顺序释放对象的方式或时间
关于你的第二个问题
由于我正在从工作簿.工作表访问工作表,我必须释放吗
这个物体的形状?如果是,我返回工作表后在哪里?我不能
在我回来之前释放
NET中的COM实现使用引用计数机制来检测对象是否被使用,因此NO您不必显式发布任何内容。框架对此负责
注意:
使用适当的。
关闭
(对于工作簿)和。退出
(对于应用程序)方法来正确发布resurces。在应用程序对象上使用。Quit
()时,将关闭windows中的excel进程(因此这将释放所有资源),并在工作簿上使用。close
()释放文件锁。。在我的例子中,用户首先打开excel并在现有文件上运行加载项,但他们通常在需要时才关闭该文件,因此在这种情况下,我不必调用close或quit,对吗?对,在加载项场景中,这是不必要的。用户将关闭应用程序。