C#程序有什么好的方法删除自身

cf_fairchild 2016-09-26 11:18:48
都2016.09.26了。。。搜索了下网上的方法,不外乎2种。

第一种,写bat删除自己,但是主要的问题就是不靠谱,因为你无法知晓你的应用程序进程要多久后才能退出(优化方案是在bat中利用ping设置延时等待一段时间后再执行删除,这能达到效果,但是总感觉不是很官方)。

第二种,利用WIN32 API函数MoveFileEx,他的问题是要重启电脑后才会执行删除自己的命令,不能即时删除。

不知道msdn有没有给出过官方的解决方案,我比较拙笨,没有搜索出来。

希望能学会一些比较官方的解决方法。
...全文
679 11 打赏 收藏 转发到动态 举报
写回复
用AI写文章
11 条回复
切换为时间正序
请发表友善的回复…
发表回复
摇撼大地 2016-09-27
  • 打赏
  • 举报
回复
用APPDomain可以实现加载程序集。删除程序集的。
俊哥V 2016-09-27
  • 打赏
  • 举报
回复
想起一个段子:某杀毒程序,安装启动后把自己识别为病毒,删掉了。。。
fuyu6457 2016-09-27
  • 打赏
  • 举报
回复
mark一下
cf_fairchild 2016-09-26
  • 打赏
  • 举报
回复
引用 2 楼 shingoscar 的回复:
原理:http://amxiaomao.blog.bokee.net/bloggermodule/blog_viewblog.do?id=165370 c#有个相似的 FileShare.Delete可以实现上面的方法
关于这个方法我试过,我用File.Create方法创建临时文件,并传入File.Options.CloseOnCreate这个参数,和WIN32 API中的FILE_FLAG_DELETE_ON_CLOSE应该是一样的。就是说将我们的复制品exe的标志设为FILE_FLAG_DELETE_ON_CLOSE。 但是不幸的是,因为这个复制品exe是在原进程里创建的,一旦原进程关闭,这个复制品EXE就会失去句柄直接被FILE_FLAG_DELETE_ON_CLOSE立即清除了。如果在原进程关闭前启动复制品EXE,又会提示正在被占用,无法启动。
cf_fairchild 2016-09-26
  • 打赏
  • 举报
回复
引用 4 楼 Libby1984 的回复:
[quote=引用 3 楼 Libby1984 的回复:] 你可以写一个删除的程序放在同一个目录下,比如叫delet.exe。当你需要删除自己的时候线自己关闭窗体或文件,然后在Closed事件中启动这个delet.exe。在delet.exe程序中先判断是否还存在你原来的程序,如果存在则强制关闭该程序的进程,然后在删除你自己,删除成功后关闭delet.exe。
给你一个关闭进程的例子

                Process[] process = Process.GetProcessesByName("进程名");
                foreach (Process p in process)
                {
                    if (!p.HasExited)  // 如果程序没有关闭,结束程序
                    {
                        WaitForCloseProcess(p);
                        break;
                    }
                }

// 后面是你的删除代码
..........

        /// <summary>
        /// 关闭进程,并等待其完成
        /// </summary>
        private static void WaitForCloseProcess(Process p)
        {
            try
            {
                p.Kill();
                p.WaitForExit();
            }
            catch (System.ComponentModel.Win32Exception e)
            {
                WriteLog("终止进程“" + p.ProcessName + "”异常", e.Message);
            }
            catch (NotSupportedException e)
            {
                WriteLog("终止进程“" + p.ProcessName + "”异常", e.Message);
            }
            catch (InvalidOperationException)
            {
                return;
            }
        }
[/quote] 这种方法我也见过,但是你新生成的delet.exe执行完后不也成了不需要的文件了吗。。。我是想模仿“”软件卸载程序“执行”的那种效果。
  • 打赏
  • 举报
回复
引用 3 楼 Libby1984 的回复:
你可以写一个删除的程序放在同一个目录下,比如叫delet.exe。当你需要删除自己的时候线自己关闭窗体或文件,然后在Closed事件中启动这个delet.exe。在delet.exe程序中先判断是否还存在你原来的程序,如果存在则强制关闭该程序的进程,然后在删除你自己,删除成功后关闭delet.exe。
给你一个关闭进程的例子

                Process[] process = Process.GetProcessesByName("进程名");
                foreach (Process p in process)
                {
                    if (!p.HasExited)  // 如果程序没有关闭,结束程序
                    {
                        WaitForCloseProcess(p);
                        break;
                    }
                }

// 后面是你的删除代码
..........

        /// <summary>
        /// 关闭进程,并等待其完成
        /// </summary>
        private static void WaitForCloseProcess(Process p)
        {
            try
            {
                p.Kill();
                p.WaitForExit();
            }
            catch (System.ComponentModel.Win32Exception e)
            {
                WriteLog("终止进程“" + p.ProcessName + "”异常", e.Message);
            }
            catch (NotSupportedException e)
            {
                WriteLog("终止进程“" + p.ProcessName + "”异常", e.Message);
            }
            catch (InvalidOperationException)
            {
                return;
            }
        }
  • 打赏
  • 举报
回复
你可以写一个删除的程序放在同一个目录下,比如叫delet.exe。当你需要删除自己的时候线自己关闭窗体或文件,然后在Closed事件中启动这个delet.exe。在delet.exe程序中先判断是否还存在你原来的程序,如果存在则强制关闭该程序的进程,然后在删除你自己,删除成功后关闭delet.exe。
Poopaye 2016-09-26
  • 打赏
  • 举报
回复
原理:http://amxiaomao.blog.bokee.net/bloggermodule/blog_viewblog.do?id=165370 c#有个相似的 FileShare.Delete可以实现上面的方法
WM_JAWIN 2016-09-26
  • 打赏
  • 举报
回复
直接删除就可以了
zbdzjx 2016-09-26
  • 打赏
  • 举报
回复
那就把delet.exe放到系统的temp文件夹中,反正这个文件夹都是放临时文件的。
引用 5 楼 cf_fairchild 的回复:
[quote=引用 4 楼 Libby1984 的回复:] [quote=引用 3 楼 Libby1984 的回复:] 你可以写一个删除的程序放在同一个目录下,比如叫delet.exe。当你需要删除自己的时候线自己关闭窗体或文件,然后在Closed事件中启动这个delet.exe。在delet.exe程序中先判断是否还存在你原来的程序,如果存在则强制关闭该程序的进程,然后在删除你自己,删除成功后关闭delet.exe。
给你一个关闭进程的例子

                Process[] process = Process.GetProcessesByName("进程名");
                foreach (Process p in process)
                {
                    if (!p.HasExited)  // 如果程序没有关闭,结束程序
                    {
                        WaitForCloseProcess(p);
                        break;
                    }
                }

// 后面是你的删除代码
..........

        /// <summary>
        /// 关闭进程,并等待其完成
        /// </summary>
        private static void WaitForCloseProcess(Process p)
        {
            try
            {
                p.Kill();
                p.WaitForExit();
            }
            catch (System.ComponentModel.Win32Exception e)
            {
                WriteLog("终止进程“" + p.ProcessName + "”异常", e.Message);
            }
            catch (NotSupportedException e)
            {
                WriteLog("终止进程“" + p.ProcessName + "”异常", e.Message);
            }
            catch (InvalidOperationException)
            {
                return;
            }
        }
[/quote] 这种方法我也见过,但是你新生成的delet.exe执行完后不也成了不需要的文件了吗。。。我是想模仿“”软件卸载程序“执行”的那种效果。[/quote]
crystal_lz 2016-09-26
  • 打赏
  • 举报
回复
有很多歪门邪道的方法可以搞定 目前反正我是不知道 如何自己把自己给删除掉 但是 让其他进程来干掉自己是可以的 复杂的做法我就不说了 因为我也不用 我用过的一个简单的方式就是 cmd 我要在干掉自己的时候 我创建一个process 来启动 cmd 然后用cmd 来干掉自己 当然我会给cmd 两个参数 一个是 我自己的进程id 还有就是我自己的文件路径 然后就可以有这样一条命令了 taskkill /f /pid xxx & delete filename 两条命令拼接执行 让cmd先强制结束自己 命令完成后 又马上删除自己 由于是两个进程了 所以不会有任何问题

110,531

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术 C#
社区管理员
  • C#
  • Web++
  • by_封爱
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

让您成为最强悍的C#开发者

试试用AI创作助手写篇文章吧