Excel不退出C#

Excel不退出C#,c#,excel,c#-4.0,vba,C#,Excel,C# 4.0,Vba,我正在用C#编写这段特殊代码,以写入excel文件 public partial class WriteExcelForm : Form { public WriteExcelForm() { InitializeComponent(); } private void writeExcelButton_Click(object sender, EventArgs e) { Microsoft.Office.Interop.

我正在用C#编写这段特殊代码,以写入excel文件

public partial class WriteExcelForm : Form
{
    public WriteExcelForm()
    {
        InitializeComponent();
    }

    private void writeExcelButton_Click(object sender, EventArgs e)
    {
        Microsoft.Office.Interop.Excel.Application xlApp = new Microsoft.Office.Interop.Excel.Application();
        if (xlApp == null)
        {
            MessageBox.Show("Excel is not installed!!!");
            return;
        }

        Excel.Workbooks xlWorkBooks = xlApp.Workbooks;
        Excel.Workbook xlWorkBook = xlWorkBooks.Add(Type.Missing);
        Excel.Worksheet xlWorkSheet = xlWorkBook.ActiveSheet;
        xlWorkSheet.Name = "sample";

        Excel.Range range1 = (Excel.Range)xlWorkSheet.Cells[1, 1];
        range1.Value = "dhiraj";

        Excel.Range range2 = xlWorkSheet.Range["A2"];
        range2.Value = "dhiraj";

        xlWorkBook.SaveAs("C:\\output.xlsx");

        //Properly closing the excel app
        GC.Collect();
        GC.WaitForPendingFinalizers();

        xlWorkBook.Close(false, Type.Missing, Type.Missing);
        xlApp.Quit();

        Marshal.FinalReleaseComObject(range1);
        Marshal.FinalReleaseComObject(range2);
        Marshal.FinalReleaseComObject(xlWorkSheet);
        Marshal.FinalReleaseComObject(xlWorkBook);
        Marshal.FinalReleaseComObject(xlWorkBooks);
        Marshal.FinalReleaseComObject(xlApp);
    }
}
如果我运行这段代码,excel.exe不会退出,而是继续在后台挂起

但是,如果我把这一行注释掉

        Excel.Range range1 = (Excel.Range)xlWorkSheet.Cells[1, 1];
        range1.Value = "dhiraj";
excel.exe优雅地退出

我错过了什么

编辑: 我已经解决了我的问题。发布我的发现作为答案

附言:不知道为什么我被否决了,我在发布这个问题之前做了很多研究。

找到下面的代码

protected void Button3_Click(object sender, EventArgs e)
    {
        int randomvalue = new Random().Next(10);
        try
        {
            filename = Server.MapPath("~/Reports/Tro_Reports" + randomvalue + ".xlsx");
            using (var getReportCollection = new DataSet1())
            {
                using (var tableCollection = getReportCollection.Tables["SheetNames"])
                {
                    var excelApplication = new Microsoft.Office.Interop.Excel.Application();

                    try
                    {
                        var wb = excelApplication.Workbooks.Add();

                        var collection = new Microsoft.Office.Interop.Excel.Worksheet[20];

                        for (var i = 0; i < tableCollection.Columns.Count; i++)
                        {
                            collection[i] = wb.Worksheets.Add();
                            collection[i].Name = tableCollection.Columns[i].ToString();
                        }
                        var thisWorksheet = collection[2];
                        var thisRange = thisWorksheet.Range["A1"];
                        thisRange.Value = "Event Summary Report";

                        wb.SaveAs(filename);
                        wb.Close();
                    }
                    finally
                    {
                        Marshal.ReleaseComObject(excelApplication);
                    }
                }
            }
        }
        catch (ExternalException ex)
        {

        }
    }
protectedvoid按钮3\u单击(对象发送者,事件参数e)
{
int randomvalue=new Random()。下一步(10);
尝试
{
filename=Server.MapPath(“~/Reports/Tro_Reports”+randomvalue+”.xlsx”);
使用(var getReportCollection=new DataSet1())
{
使用(var tableCollection=getReportCollection.Tables[“SheetNames”])
{
var excelApplication=new Microsoft.Office.Interop.Excel.Application();
尝试
{
var wb=excelApplication.Workbooks.Add();
var collection=new Microsoft.Office.Interop.Excel.Worksheet[20];
对于(var i=0;i

上面的代码片段可以很好地关闭您的excel工作表。

因此,我在问了这个问题后继续研究,发现了这个特殊的链接

现在在这个特殊的链接中,三个答案放在一起帮助我解决了问题

第一个答案就是这个 它说要避免使用“永远不要在COM对象上使用两点”

第二个答案是这个 这个答案指的是如何实际使用excel对象,遵循这一点非常重要,因为我不是唯一一个开发我的代码的开发人员

第三个答案 讨论在发布模式和调试模式下垃圾收集器行为的不同

这就是我的问题所在,当我在发布模式下运行粘贴在问题中的代码时,它工作正常,excel.exe优雅地退出


然而,为了使它在调试模式下工作,我采纳了上面第三个答案链接的建议,并创建了一个函数来实现excel的写作功能

@YowE3K:你是说没有显式类型转换?我确实试过了,但最终得到了相同的结果。检查此链接:-并消除双点。还建议您避免使用括号表示法进行类型转换。请参见:-获取计数器点。@RobinMackenzie:我已经浏览了这些链接,希望您在我共享的代码中没有看到任何“双点”。每个
[]
都是一个隐藏的句点。我怀疑行
xlWorkBook.Close(false,Type.Missing,Type.Missing)正在关闭工作簿。是。它可以关闭工作簿。在GC.Collect()之后需要关闭工作簿吗?调用
GC.Collect();GC.WaitForPendingFinalizers()实际上什么都不做。