终止excel过程

在阅读了关于在引用excel com对象时不使用双点的许multithreading之后,我决定实现它。

直到我循环完成之后,它才开始工作。

这是我的循环。 请注意,如果我发表评论,它的作品:

for (int i = 1; i < dgv.Columns.Count + 1; i++) { excelWorkbook.Cells[1, i] = dgv.Columns[i - 1].HeaderText; var cell = excelWorkbook.Cells[1, i]; var fontSetter = cell.Font; fontSetter.Bold = true; //Bolds the header row // Garbage collecting GC.Collect(); GC.WaitForPendingFinalizers(); Marshal.FinalReleaseComObject(fontSetter); Marshal.FinalReleaseComObject(cell); } 

我的代码不应该正确处理它们的variables吗?

这是我的完整代码:

 [Code removed] 

我正在试图按照如何正确清理Excel互操作对象的步骤? (第二个答案)

要做到这一点并不容易。 但是,我惊讶以下甚至编译:

 excelWorkbook.Cells[1, i] = dgv.Columns[i - 1].HeaderText; var cell = excelWorkbook.Cells[1, i]; 

也许你的意思是:

 excelWorkbook.Cells[1, i].Value = dgv.Columns[i - 1].HeaderText; var cell = excelWorkbook.Cells[1, i]; 

应该用下面的语句代替:

 var cell = excelWorkbook.Cells[1, i]; cell.Value = dgv.Columns[i - 1].HeaderText; 

GC.CollectGC.WaitForPendingFinalizers调用中,我没有看到这一点,因为在cellfontSetter超出范围之前,您GC.WaitForPendingFinalizers调用了它们。

最后,对Marshal.FinalReleaseComObject的调用可能应该在finally块中,这样即使抛出exception也会执行它们。

我是通过按照nightcoder指定的方法做到的我如何正确清理Excel互操作对象? 。

你不需要引用任何东西,并且所有东西都是混乱的,它通过ID来closures进程。 希望这可以帮助一个谁来看看。