终止由特定应用程序启动的 excel 个进程

Kill excel process which was started by a specific application

我有一个控制台应用程序,我在其中打开许多 excel 应用程序来进行一些处理。最后,我想终止此控制台应用程序打开的所有 Excel 进程。所以,我正在使用这样的代码:

System.Diagnostics.Process[] procs = System.Diagnostics.Process.GetProcesses();
for (int i = 0; i < procs.Length; i++)
{
    if (procs[i].ProcessName == "EXCEL")
    {
        procs[i].Kill();
    }
}

但是此代码会关闭我计算机中的所有 excel 应用程序,包括我的应用程序未打开的应用程序。 我的问题是,如何修改此代码以仅关闭由我的控制台应用程序打开的 excel 应用程序?

尝试使用()。

  using(var newExcelObject = ...){
               // your code here
  }
  // closes the object you intialised above

一旦超出范围,就会自动关闭进程。这将是关闭 excel 个进程的最简单和好的做法。

否则,您可以 close/dispose 手动删除对象,而不是终止进程。

希望这会有所帮助。

我建议在 (Excel) Process 上做一些包装,当你完成它时你可以在上面调用 Close

public class ExcelProcess
{
    Process m_Process;
    public ExcelProcess(/* parameters of your choice */)
    {
        // instantiate process and assign it to the m_Process variable
    }

    public ExcelProcess(int id)
    {
        // this will instantiate process object and hook to the process with specified process id
        m_Process = Process.GetProcessById(id);
    }

    public void Close()
    {
        m_Process.Kill();
    }

    public override ToString()
    {
        // this will return process id as a string value
        return m_Process.Id.ToString();
    }
}

拥有像上面这样的对象你可以:
1. 通过将其中的 list/array 序列化到某个文本文件(如 .ToString()
,将 "instances" 从一个项目移动到另一个项目 2. 直接控制进程(每个 ExcelProcess 都可以有自己的 IPC 来与外部进程通信,您可以将流从进程重定向到进程),这将由这个对象处理
3. 当其他人关闭当前链接到该对象的应用程序时,感到困惑

根据以上几点,我们假设用户无法 关闭挂接到ExcelProcess 的应用程序。

您可以创建一个 holder object/field 然后可以序列化:

List<ExcelProcess> m_ExcelProcesses;

向其中添加任何进程。

foreach(var process in Process.GetProcessesByName("excel"))
{
    m_ExcelProcesses.Add(new ExcelProcess(process.Id));
} 

现在假设您想在另一个应用程序中关闭它们:

byte[] nl = new byte[2] { 0x0D, 0x0A }; // new line
using (FileStream fs = File.Create("C:\SomeArbitrary\PathToFile.txt"))
{
    foreach(ExcelProcess proc in m_Processes)
    {  
        byte[] b = BitConverter.GetBytes(int.Parse(proc.ToString()));
        fs.Write(b, 0, b.Length);
        fs.Write(nl, 0, nl.Length);
    }
}

在那之后,在您负责关闭那些只读取所有值并重写文件(或删除它)的新进程中。

byte[] pidBytes = new byte[4]; // we stored int which is 4 bytes wide;
using (FileStream fs = File.OpenRead("C:\SomeArbitrary\PathToFile.txt"))
{
    while(fs.CanRead)
    {
        fs.Read(pidBytes, 0, sizeof(int));
        m_Processes.Add(new ExcelProcess(BitConverter.ToInt32(pidBytes, 0)));
        fs.ReadByte(); // CR - 0x0D
        fs.ReadByte(); // LF - 0x0A
    }
}