C#删除程序自身【总结】
2014-02-25 16:47
387 查看
C#删除程序自身【总结】
偶然看到一个可以自删除的程序,于是了解下如何实现。然后整理如下:思路:
在.NET程序中,因为运行中的程序是受系统保护的,不能自己删除自身的,所以自删除的思路:
[b] 在关闭本程序之前启动新的进程打开另一个程序,调用这个程序来删除原程序。然后再完成外部进程的销毁。
操作:
方法一:程序中打开新的进程,删掉程序后,再销毁进程本身
流程:首先生成一个BAT文件,然后让BAT执行删除动作,就是:
1、生成删除的BAT
2、运行BAT
3、快速退出
4、BAT开始删除EXE
5、BAT删除BAT
/// <summary> /// 删除程序自身(本文地址:/article/7000425.html)【推荐】 /// </summary> 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命令,删掉程序即可。
/// <summary> /// 删除程序自身(本文地址:/article/7000425.html) /// </summary> 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> 删除可执行文件
可惜这种方法 由于xp不支持Choice命令,没有测试成功。但在Win8 x64位上成功删除自身。
总结:
方法一:使用bat文件删除程序+自身,但其有临时bat文件生成。
方法二:利用某些dos命令的延时效果,在程序退出之后自动删除程序自身思路非常巧妙。也避免了bat方式,循环删除的问题。当然这种方法从本质上应该和方法一差不多。
但由于xp不支持Choice命令,所以在使用方面上推荐方法一。
本文地址:/article/7000425.html
扩展:
突然想到“伴随进程”,也就是一个程序产生两个进程,定时检测另一个进程信号,如果其中一个进程被结束了,另一个进程就立刻重新启动被结束的进程,实现程序无法异常结束(特别是Windows结束任务)的效果!
对于这种伴随进程(一个主要工作进程,一个伴随进程)结束的办法:快速结束两个进程,当然如果两个进程的检测定时足够短,这种方法就不一定有效了。但可以用另一个假的伴随进程来处理而达到结束两个进程的目的。
参考:
程序快速删除自己
用C#写自己删除自己的程序
How To Make Your Application Delete Itself
Immediately
两个互相监控进程的方法
[/b]
相关文章推荐
- 10行代码在C#中获取页面元素布局信息
- {Reship}{C#}{GDI+}GDI+画笔,线,区域类型
- C#滚动字幕的实现
- c# Invoke和BeginInvoke 区别
- C# Dynamic 关键字学习
- C#统计文章中单词的重复次数,并且按照次数从高到低排序返回(无法处理中文)
- dll错误等笔记
- C# 7个读写Excel文件的类库
- 【WinForm】C# 采用POST登录京东
- C# 日期格式化(从别人处收藏,记下,方便自己使用)
- C# 正则表达式
- C#核心语法
- 示例 - 10行代码在C#中获取页面元素布局信息
- C# 的时间戳转换
- C#编程总结(十三)数据压缩
- c#显示当前在线人数示例
- [CLR via C#]15. 枚举类型和位标志
- C#.NET 大型通用信息化系统集成快速开发平台 4.1 版本 - SOA面向安全的服务调用接口
- 【C#】Unicode的流言终结者和编码大揭秘
- C#+AE 判断点是否在面内的方法