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

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

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

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

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

希望能学会一些比较官方的解决方法。
...全文
685 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先强制结束自己 命令完成后 又马上删除自己 由于是两个进程了 所以不会有任何问题
NET程序员的开发利器.NET Reflector 一、 简介   程序集,作为.NET时代的动态链接库,蕴藏了太多的软件秘密。为此,Visual Studio内置的ILDASM成为最初挖掘程序集的上佳工具。但自从Reflector出现后,ILDASM相形见拙。因为,Reflector能提供更多的程序集信息,而且是免费的工具。   如今,在Visual Studio.NET中编译源代码(无论是VB还是C#)时,编译器都会将高级源代码翻译成MSIL,即“微软中间语言”,而不是特定的机器指令。具有更多安全性、版本控制、共享能力与其它相关元数据的中间语言(IL),是包在一个或多个DLL或可执行文件中的。   基于ILDASM检查程序集中的IL有时很有用,但它要求我们熟悉MSIL。通常,比起IL,大多数开发人员对像C#或Visual Basic这样的高级程序设计语言更为熟悉。   Reflector的出现使.NET程序员眼前豁然开朗,因为这个免费工具可以将.NET程序集中的中间语言反编译成C#或者Visual Basic代码。除了能将IL转换为C#或Visual Basic以外,Reflector还能够提供程序集中类及其成员的概要信息、提供查看程序集中IL的能力以及提供对第三方插件的支持。   二、 下载与运行Reflector   Reflector是由微软员工Lutz Roeder编写的免费程序。这个软件经常更新,你可以在http://www.aisto.com/roeder/dotnet下载最新的版本。在本文成文之时,Reflector的最新版本为5.0.35.0,仅有1M大小。只要双击下载后的Reflector.exe文件即可运行Reflector。   默认情况下,Reflector会打开一组公共程序集(mscorlib、System、System.Data、System.Drawing等等)。每个打开的程序集都列在Reflector的主窗口中。单击程序集旁边的+图标可以展开树结构并展示程序集的命名空间。每个命名空间旁边都有一个相关的+图标,单击这个图标将显示这个命名空间内的类。除此以外,还可以展开每个类,显示类的成员:事件、字段、方法与属性。   要想查看其它程序集(包括我们自己创建的程序集)的细节,你可以使用菜单命令“File→Open”。然后,浏览到想要查看的程序集。只要选择了有效的.NET程序集,这个程序集就可以在Reflector的主窗口中与其它默认程序集共同显示。要想从Reflector的主窗口中删除程序集,只需右击程序集并选择“Close”。   三、 使用Reflector反汇编程序集   提供基本的程序集是Reflector唾手可得的功能,然而,Reflector真正的威力体现在它的反汇编能力。只要浏览到类级的成员,就可以通过Tools菜单中的Disassembler项(或在该项上单击右键)反汇编此成员。这将打开第二个窗格,以C#、Visual Basic、Delphi或者IL显示反汇编后的内容。图2以C#语言展示了对SmtpClient类中Abort方法的反汇编结果。   有了Reflector的反编译功能,要研究.NET框架基类库就容易多了。我们完全可以在没有源代码的情况下研究我们所创建或者正在使用的程序集相应源代码。   不用太担心,你自己的.NET应用程序还有其它受保护措施。但是,想阻止别人查看.NET程序集的IL(继而反编译成C#或者Visual Basic)是不可能的,但你可以使用“混淆”技术使IL变得混乱。目前,市场上有许多.NET混淆产品,比如:PreEmptive Solution的Dotfuscator、WiseOwl的Dmeanor以及Remotesoft的.NET Obfuscator等。   四、 Reflecator的其它功能   除了作为对象浏览器与反汇编器之外,Reflector还可以显示类与其成员的调用与被调用图、提供单键访问Google或MSDN搜索的能力并提供了允许第三方开发人员为Reflector创建插件的框架。   要查看调用或被调用图,只需要在树视图中选择一个成员,访问Tools菜单,选择Call Graph或Callee Graph选项即可。Call Graph会列出所选项所调用的成员,而Callee Graph列出调用所选项的成员。   通过使用插件,Reflector的功能可以得到进一步扩展。目前有能显示程序集依赖图、自动加载当前运行中的程序集、输出整个程序集的反汇编内容以及在Visual Studio中作为Reflector的宿主等的插件。还有更多插件都列在http://www.codeplex.com/reflectoraddins中。在此,我极力推荐有兴趣的读者前去一看。   不出乎所料,的确存在一个Reflector.VisualStudio插件。有了这个插件,就可以让Reflector集成在Visual Studio环境中,进而取代以前那个有些“拙漏”的对象浏览器。   首先,我们需要在机器上准备Reflector的最新版,然后从http://www.testdriven.NET/reflector下载最新版本的Reflector.VisualStudio插件。据说安装了此插件之后,Reflector能够与Visual Studio完美融合。但遗憾的是,本人试下载此软件并安装(仅能得到TestDriven.NET-2.8.2130 RTM个人测试版本,时间7/30/2007,大小3.3M)后,没有大发现—仅是在VS2005中添加“Go to Reflector”和一个帮助菜单项。点击“Go to Reflector”菜单项仅是从VS2005内部启动Reflector而已。   有了Reflector.VisualStudio插件(正版,下面是根据在线资料介绍),Reflector可以寄在Visual Studio中Reflector不仅是一个对象浏览器、反汇编器,包裹在同一个程序中的所有功能还可以寄于Visual Studio中。   五、 小结   还记得Spy++吗?在Win32时代,这个软件对于我们分析一个陌生软件的设计思路可谓立下汗马功劳。在如今的.NET时代,Reflector又成为每个严肃的.NET开发人员工具箱中必不可少的精髓工具之一。怎么样,请赶紧试锋吧。

110,567

社区成员

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

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

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