博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
C#删除程序自身【总结】
阅读量:4476 次
发布时间:2019-06-08

本文共 2225 字,大约阅读时间需要 7 分钟。

  偶然看到一个可以自删除的程序,于是了解下如何实现。然后整理如下:

  思路:

  在.NET程序中,因为运行中的程序是受系统保护的,不能自己删除自身的,所以自删除的思路:

   在关闭本程序之前启动新的进程打开另一个程序,调用这个程序来删除原程序。然后再完成外部进程的销毁。

  操作:

方法一:程序中打开新的进程,删掉程序后,再销毁进程本身

  流程:首先生成一个BAT文件,然后让BAT执行删除动作,就是:

    1、生成删除的BAT
    2、运行BAT
    3、快速退出
    4、BAT开始删除EXE
    5、BAT删除BAT

///     /// 删除程序自身(本文地址:http://www.cnblogs.com/Interkey/p/DeleteItself.html)【推荐】    ///     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命令,删掉程序即可。

///     /// 删除程序自身(本文地址:http://www.cnblogs.com/Interkey/p/DeleteItself.html)    ///     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命令,所以在使用方面上推荐方法一

   本文地址: 

  扩展:

   突然想到“伴随进程”,也就是一个程序产生两个进程,定时检测另一个进程信号,如果其中一个进程被结束了,另一个进程就立刻重新启动被结束的进程,实现程序无法异常结束(特别是Windows结束任务)的效果!

  对于这种伴随进程(一个主要工作进程,一个伴随进程)结束的办法:快速结束两个进程,当然如果两个进程的检测定时足够短,这种方法就不一定有效了。但可以用另一个假的伴随进程来处理而达到结束两个进程的目的。

  欢迎加群:.NET反编译|破解 群号:183569712(请输入验证信息:博客园).  

  参考:

    

    

    

    

 

转载于:https://www.cnblogs.com/Interkey/p/DeleteItself.html

你可能感兴趣的文章
敏捷开发流程
查看>>
[leetCode]Linked List Cycle I+II
查看>>
leetcode中的python学习
查看>>
Zookeeper zkui-zookeeper图形化管理工具
查看>>
CenOS+宝塔(模拟)上线博客项目
查看>>
接口,lambda表达式与内部类(二)
查看>>
Phabricator是什么,代码审查工具
查看>>
DirectX:函数可以连接任意两个filter 分类: Direct...
查看>>
算法:求从1到n这n个整数的十进制表示中1出现的次数-- python 实现
查看>>
CSU 1160 把十进制整数转换为十六进制,格式为0x开头,10~15由大写字母A~F表示
查看>>
WinPE启动U盘的制作方法与软件下载(通用PE工具箱/老毛桃/大白菜WinPE)(转载)...
查看>>
PMP学习感想
查看>>
集合-强大的集合工具类:java.util.Collections中未包含的集合工具
查看>>
CSS清除浮动
查看>>
转:iphone 申请证书
查看>>
10个经典的C语言面试基础算法及代码
查看>>
普通的java Ftp客户端的文件上传
查看>>
视图系统
查看>>
Palindromes _easy version
查看>>
vue 小记
查看>>