繁体   English   中英

为什么 Excel 的实例在通过互操作打开时不关闭,即使 Word 应用程序关闭得很好?

[英]Why do instances of Excel not close when opened via interop, even though Word apps close just fine?

据我所知,这不是一个重复的问题,因为这里的问题是关于为什么看似重复的问题的公认答案在看似相同的情况下并没有解决我的问题。

几天来,我一直在为我的应用程序无法结束 Excel 的实例而苦苦挣扎,这些实例是使用互操作打开的。

我的应用程序可以很好地打开和关闭 Word 应用程序(即进程从任务管理器中消失),但不是Excel 应用程序。 Excel 在任务管理器中始终保持打开状态。 经过大量搜索 - 似乎是关于如何关闭 Excel 个实例的明确指南。 但是,如果我复制并粘贴确切的示例代码 - 并将其作为控制台应用程序运行,在 .NET Framework 或 .NET 6 - Excel 仍然无法关闭,完全按照我的应用程序的行为。

据推测,这一定是最新/更新版本的 Word 的问题?

完全彻底迷失在这个......

上述链接中的代码使 Excel 打开:

using System;
using System.Runtime.InteropServices;
using Microsoft.Office.Interop.Excel;

namespace TestCsCom
{
    class Program
    {
        static void Main(string[] args)
        {
            // NOTE: Don't call Excel objects in here... 
            //       Debugger would keep alive until end, preventing GC cleanup

            // Call a separate function that talks to Excel
            DoTheWork();

            // Now let the GC clean up (repeat, until no more)
            do
            {
                GC.Collect();
                GC.WaitForPendingFinalizers();
            }
            while (Marshal.AreComObjectsAvailableForCleanup());
        }

        static void DoTheWork()
        {
            Application app = new Application();
            Workbook book = app.Workbooks.Add();
            Worksheet worksheet = book.Worksheets["Sheet1"];
            app.Visible = true;
            for (int i = 1; i <= 10; i++) {
                worksheet.Cells.Range["A" + i].Value = "Hello";
            }
            book.Save();
            book.Close();
            app.Quit();

            // NOTE: No calls the Marshal.ReleaseComObject() are ever needed
        }
    }
}

Excel的当前版本似乎有点奇怪。这取决于控制台程序的运行方式。 如果我双击 Windows Explorer,它会像以前一样完美关闭。 但是,如果我从控制台 window 运行,那么 Excel 将保持打开状态,直到控制台 window 关闭。 同样,当我从调试器运行时,Excel 仅在调试 window 关闭时关闭,而不是在驱动进程终止时关闭。 如果你也能确认这一点就好了。 我怀疑 Excel 添加了一些防御代码以在特定情况下不关闭 - 可能会监视“父” window 关闭或类似的东西。

然后。 . . . 就像我在发布后再次尝试一样,Excel 每次都开始漂亮地关闭,但是我运行它。

好的,所以我偶然发现了解决方案。 解决方案实际上是一个不相关的问题。

我的 Excel 实例启用了Analysis Toolpak (包括拼写错误)。 从几个月前我正在做的一些工作中。 该插件位于File --> Options --> Add-ins --> Analysis ToolPak

我已经禁用了加载项,现在 Excel 个应用程序可以正常打开和关闭,正如预期的那样,仅使用显式垃圾收集。

我应该补充 - 行为仍然与 Word不同 关闭的 Word 文件在文档关闭时几乎立即杀死 Word,甚至在显式 GC 之前。 使用 Excel,我仍然关闭了打开工作簿的表单,然后调用显式 GC,有时需要几秒钟,有时需要 30 秒,有时需要一分钟 - 但禁用了加载项, Excel 最终会停止。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM