杀死由特定应用程序启动的excel进程

时间:2017-07-24 08:09:31

标签: c# excel-interop

我有一个控制台应用程序,我在其中打开许多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应用程序?

2 个答案:

答案 0 :(得分:2)

尝试使用()。

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

一旦超出范围,它将自动关闭该过程。这将是关闭Excel流程的最简单和最好的做法。

否则,您可以手动关闭/处置对象,而不是终止进程。

希望这会有所帮助。

答案 1 :(得分:1)

我建议在(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.移动&#34;实例&#34;通过将这些列表/数组序列化到某个文本文件(如.ToString()
,从项目到项目 2.直接控制流程(ExcelProcess中的每一个都可以让它自己的IPC与外部流程进行通信,您可以重定向来自流程和流程的流程)这将由此对象处理
3.当其他人关闭当前链接到该对象的应用程序时,感到困惑

扩展以上几点,我们假设用户不能关闭挂钩到ExcelProcess的应用程序。

您可以创建一个持有者对象/字段,然后可以序列化:

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
    }
}