我正在从 C# .Net 应用程序运行 Excel,并且无法关闭进程。如何让 Excel 进程从我的 C# 程序中正确关闭?
4 回答
试试这个:
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);
根据您的需要,您可以考虑使用SpreadsheetGear for .NET,它为您提供了一个没有 COM 互操作的 Excel 兼容组件(没有挂起的实例,更好的性能,不必担心是否安装了 Excel 或安装了哪个版本的 Excel) .
您可以在此处查看带有 C# 和 VB 源代码的实时 ASP.NET 示例,在此处了解有关 SpreadsheetGear 的 Windows 窗体控件和示例的更多信息,如果您想自己尝试,请在此处下载免费试用版。
免责声明:我拥有 SpreadsheetGear LLC