c#程序删除自身代码示例分享
在.net程序中,因为运行中的程序是受系统保护的,不能自己删除自身的,所以自删除的思路:
在关闭本程序之前启动新的进程打开另一个程序,调用这个程序来删除原程序。然后再完成外部进程的销毁。
方法一:程序中打开新的进程,删掉程序后,再销毁进程本身
流程:首先生成一个bat文件,然后让bat执行删除动作,就是:
1、生成删除的bat
2、运行bat
3、快速退出
4、bat开始删除exe
5、bat删除bat
private static void deleteitself()
{
string vbatfile = path.getdirectoryname(application.executablepath) + "\\deleteitself.bat";
using (streamwriter vstreamwriter = new streamwriter(vbatfile, false, encoding.default))
{
vstreamwriter.write(string.format(
":del\r\n" +
" del \"{0}\"\r\n" +
"if exist \"{0}\" goto del\r\n" +
"del %0\r\n", application.executablepath));
}
//************ 执行批处理
winexec(vbatfile, 0);
//************ 结束退出
application.exit();
}
[system.runtime.interopservices.dllimport("kernel32.dll")]
public static extern uint winexec(string lpcmdline, uint ucmdshow);
方法二:程序中打开新的进程,调用cmd命令,删掉程序即可。
private static void deleteitselfbycmd()
{
processstartinfo psi = new processstartinfo("cmd.exe", "/c ping 1.1.1.1 -n 1 -w 1000 > nul & del " + application.executablepath);
psi.windowstyle = processwindowstyle.hidden;
psi.createnowindow = true;
process.start(psi);
application.exit();
}
下面解释命令的意思:
cmd /c 调用命令窗口执行dos指令
ping 1.1.1.1 -n 1 -w 1000 > nul 利用 ping命令的 –w 参数指定延时1秒执行
& 连接下一个命令(用于一行执行多个命令)
del <application.executablepath> 删除可执行文件
方法一:使用bat文件删除程序+自身,但其有临时bat文件生成。
方法二:利用某些dos命令的延时效果,在程序退出之后自动删除程序自身思路非常巧妙。也避免了bat方式,循环删除的问题。当然这种方法从本质上应该和方法一差不多。
突然想到“伴随进程”,也就是一个程序产生两个进程,定时检测另一个进程信号,如果其中一个进程被结束了,另一个进程就立刻重新启动被结束的进程,实现程序无法异常结束(特别是windows结束任务)的效果!
对于这种伴随进程(一个主要工作进程,一个伴随进程)结束的办法:快速结束两个进程,当然如果两个进程的检测定时足够短,这种方法就不一定有效了。但可以用另一个假的伴随进程来处理而达到结束两个进程的目的。