终止由特定应用程序启动的 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
}
}
我有一个控制台应用程序,我在其中打开许多 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
}
}