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