Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/django/19.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 开发Excel加载项时是否释放COM?_C#_Vsto_Excel Interop_Excel Addins - Fatal编程技术网

C# 开发Excel加载项时是否释放COM?

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);

我知道在使用互操作时应该释放COM对象。在开发和加载项(例如Excel)时,情况是否有所不同?这里有一个循环,我很想知道是否需要
封送.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,对吗?对,在加载项场景中,这是不必要的。用户将关闭应用程序。