我知道在使用互操作时应该释放 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
from workbook.Sheets
,我必须释放这个对象吗?如果是这样,我在哪里退回工作表?回来之前不能释放吗?
这可能是一个愚蠢的问题,但如果Marshal.ReleaseComObject
在 foreach 作用域中不是必需的,即使它仍然存在也会有伤害吗?
Marshal.ReleaseComObject
仅当您需要及时或按特定顺序控制 COM 对象的生命周期时才使用。对于 COM 对象的随意使用 i不会建议您完全使用此方法。
Check here https://msdn.microsoft.com/en-us/library/system.runtime.interopservices.marshal.releasecomobject(v=vs.110).aspx
该方法用于显式控制 COM 对象的生命周期
从托管代码中使用。您应该使用此方法来释放
及时保存对资源的引用的底层 COM 对象
方式或必须以特定顺序释放对象时。
关于你的第二个问题
由于我正在访问工作簿中的工作表。Sheets,我是否必须释放
这个物体的?如果是这样,我在哪里退回工作表?我不能
在我回来之前释放?
.NET中的COM实现是使用引用计数机制来检测对象是否被使用,所以NO您不必明确发布任何内容。框架负责这个。
NOTE:使用适当的 .Close
(for Workbook), .Quit
(for 应用)正确释放资源的方法。当你使用 .Quit
() 在应用程序对象上,您将关闭 Windows 中的 Excel 进程(因此这将释放所有资源),并且 .Close
() 在工作簿上释放文件锁..等在特定的 Excel 文件上。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)