zoukankan      html  css  js  c++  java
  • C#删除程序自身【总结】

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

      思路:

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

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

      操作:

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

      流程:首先生成一个BAT文件,然后让BAT执行删除动作,就是:
        1、生成删除的BAT
        2、运行BAT
        3、快速退出
        4、BAT开始删除EXE
        5、BAT删除BAT

        /// <summary>
        /// 删除程序自身(本文地址:http://www.cnblogs.com/Interkey/p/DeleteItself.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
    " +
                    " del "{0}"
    " +
                    "if exist "{0}" goto del
    " +
                    "del %0
    ", Application.ExecutablePath));
            }
    
            //************ 执行批处理
            WinExec(vBatFile, 0);
            //************ 结束退出
            Application.Exit();
        }

       [System.Runtime.InteropServices.DllImport("kernel32.dll")]
        public static extern uint WinExec(string lpCmdLine, uint uCmdShow);

    方法二:程序中打开新的进程,调用cmd命令,删掉程序即可。

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

       本文地址:http://www.cnblogs.com/Interkey/p/DeleteItself.html 

      扩展:

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

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

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

      参考:

        程序快速删除自己

        用C#写自己删除自己的程序

        How To Make Your Application Delete Itself Immediately

        两个互相监控进程的方法

  • 相关阅读:
    使用jedis连接redis
    布隆过滤器redis缓存
    SQL与NOSQL
    Charles 移动端抓包工具,使用方法以及注意事项
    安装npm包的时候报错rollbackFailedOptional: verb npm-session
    You may need an appropriate loader to handle this file type.
    数组去重
    判断两个数组是否相等(包括数组里边的键值对是否相等)
    数组里的字符串转为数字
    背景色铺满整个屏幕
  • 原文地址:https://www.cnblogs.com/Interkey/p/DeleteItself.html
Copyright © 2011-2022 走看看