我会建议在(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.移动“实例”从项目到各地通过序列化的这些列表/阵列的一些文本文件(如.ToString())
2.有直接项目控制过程(每个ExcelProcess都可以有它自己的IPC与外部进程通信,可以重定向流和处理流),这将由该对象处理
3. 弄糊涂当其他人关闭应用程序时当前链接到该对象。
扩展以上几点,假设用户不能关闭与ExcelProcess相关的应用程序。
您可以创建一个持有者对象/字段,然后就可以serialzed:
List 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
}
}