Excel流程未关闭

use*_*719 8 c# excel winforms

我有这个C#程序永远不会关闭Excel进程.基本上,它查找字符串在Excel中的范围中出现的实例数.我尝试了各种各样的东西,但它没有用.有一个Form调用此方法,但这不应该更改进程未关闭的原因.我看看Hans Passant的建议,但都没有.

编辑:我尝试了提到的东西,它仍然不会关闭.这是我更新的代码.编辑:尝试整个Process.Kill(),它的工作原理,但它似乎是一个应该工作的东西的黑客攻击.

public class CompareHelper
{
    // Define Variables
    Excel.Application excelApp = null;
    Excel.Workbooks wkbks = null;
    Excel.Workbook wkbk = null;
    Excel.Worksheet wksht = null;
    Dictionary<String, int> map = new Dictionary<String, int>();

    // Compare columns
    public void GetCounts(string startrow, string endrow, string columnsin, System.Windows.Forms.TextBox results, string excelFile)
    {
        results.Text = "";

        try
        {
            // Create an instance of Microsoft Excel and make it invisible
            excelApp = new Excel.Application();
            excelApp.Visible = false;

            // open a Workbook and get the active Worksheet
            wkbks = excelApp.Workbooks;
            wkbk = wkbks.Open(excelFile, Type.Missing, true);
            wksht = wkbk.ActiveSheet;
            ...

        }
        catch
        {
            throw;
        }
        finally
        {
            GC.Collect();
            GC.WaitForPendingFinalizers();

            if (wksht != null)
            {
                //wksht.Delete();
                Marshal.FinalReleaseComObject(wksht);
                wksht = null;
            }

            if (wkbks != null)
            {
                //wkbks.Close();
                Marshal.FinalReleaseComObject(wkbks);
                wkbks = null;
            }

            if (wkbk != null)
            {
                excelApp.DisplayAlerts = false;
                wkbk.Close(false, Type.Missing, Type.Missing);
                Marshal.FinalReleaseComObject(wkbk);
                wkbk = null;
            }

            if (excelApp != null)
            {
                excelApp.Quit();
                Marshal.FinalReleaseComObject(excelApp);
                excelApp = null;
            }

            GC.Collect();
            GC.WaitForPendingFinalizers();
            GC.Collect();
            GC.WaitForPendingFinalizers();

            /*
            Process[] processes = Process.GetProcessesByName("EXCEL");
            foreach (Process p in processes)
            {
                p.Kill();
            }
            */
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

Jer*_*Net 5

这是一个有趣的知识库,涉及 .NET 应用程序与 Office 应用程序断开连接后保持打开状态的主题。

从 Visual Studio .NET 客户端自动化后,Office 应用程序不会退出

代码示例都在链接中(vb.net 抱歉)。基本上,它向您展示如何正确设置和拆卸 Office 应用程序,以便在您完成使用后将其关闭。

System.Runtime.InteropServices.Marshal.FinalReleaseComObject这就是魔法发生的地方。

编辑:您需要为您创建的每个 Excel 对象调用 FinalReleaseComObject。

if (excelWorkSheet1 != null)
{
    Marshal.FinalReleaseComObject(excelWorkSheet1);
    excelWorkSheet1 = null;
}
if (excelWorkbook != null)
{
    Marshal.FinalReleaseComObject(excelWorkbook);
    excelWorkbook = null;
}
if (excelApp != null)
{
    Marshal.FinalReleaseComObject(excelApp);
    excelApp = null;
}
Run Code Online (Sandbox Code Playgroud)