如何停止从 C# .Net 应用程序启动的 Excel 进程?
-
22-09-2019 - |
题
我正在从 C# .Net 应用程序运行 Excel,但无法关闭该进程。如何从我的 C# 程序中正确关闭 Excel 进程?
解决方案
尝试这种情况:
foreach (System.Diagnostics.Process process in System.Diagnostics.Process.GetProcessesByName("EXCEL"))
{
if (process.MainModule.ModuleName.ToUpper().Equals("EXCEL.EXE"))
{
process.Kill();
break;
}
}
其他提示
我大约 99% 确定您的问题是由悬挂的 COM 引用阻止 Excel 进程关闭引起的。Excel 特别容易出现这种情况,因为它倾向于透明地生成 COM 引用,而不为您提供获取其句柄并显式关闭它们的方法。
PIA 通过创建自己的一组对底层 COM 对象的引用来使这个问题变得更加复杂,除非您显式地让它们清理,否则它们不会清理这些引用。正是由于这个原因,通过 PIA 使用 Excel 非常繁琐。
Application.Quit()
(IIRC 这就是它的名字) 将要 如果引用全部正确清理,则关闭该进程。这意味着您必须仔细管理保存对 Excel 进程的 COM 引用的任何内容的生命周期,并确保正确清理所有 COM 引用。
Application app = new Application();
...
EndTask((IntPtr)app.Hwnd, true, true);
[DllImport("user32.dll")]
public static extern bool EndTask(IntPtr hwnd, bool shutdown, bool force);
根据您的需要,您可以考虑使用 用于 .NET 的 SpreadsheetGear 这为您提供了一个没有 COM Interop 的 Excel 兼容组件(没有挂起实例,性能更好,不必担心是否安装了 Excel 或安装了哪个版本的 Excel)。
您可以查看带有 C# 和 VB 源代码的实时 ASP.NET 示例 这里, ,了解有关 SpreadsheetGear 的 Windows 窗体控件和示例的更多信息 这里, ,并下载免费试用版 这里 如果你想自己尝试一下。
免责声明:我拥有 SpreadsheetGear LLC
不隶属于 StackOverflow