gpt4 book ai didi

c# - 开发 Excel 插件时释放 COM?

转载 作者:行者123 更新时间:2023-11-30 16:41:52 27 4
gpt4 key购买 nike

我明白在使用互操作时我应该释放 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]);
}

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

这可能是个愚蠢的问题,但如果 Marshal.ReleaseComObject 在 foreach 范围内不是必需的,即使它仍然存在也会造成伤害吗?

最佳答案

Marshal.ReleaseComObject 仅在您需要及时或按特定顺序控制 COM 对象的生命周期时使用。对于 COM 对象的随意使用,我不会建议您完全使用此方法。

检查 here

This method is used to explicitly control the lifetime of a COM object used from managed code. You should use this method to free the underlying COM object that holds references to resources in a timely manner or when objects must be freed in a specific order.

关于你的第二个问题

Since I am accessing sheets from workbook.Sheets, do I have to release of this object? If so where since I am returning a Worksheet? I can't release before I return?

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

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

关于c# - 开发 Excel 插件时释放 COM?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47926633/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com