c#程序删除自身代码示例分享

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

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

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

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

代码如下:

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命令,删掉程序即可。

代码如下:

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> 删除可执行文件

方法一:使用bat文件删除程序+自身,但其有临时bat文件生成。

方法二:利用某些dos命令的延时效果,在程序退出之后自动删除程序自身思路非常巧妙。也避免了bat方式,循环删除的问题。当然这种方法从本质上应该和方法一差不多。

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

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

(0)

相关推荐

  • c#删除代码中的单行注释行示例

    复制代码 代码如下: using System.IO; using System.Collections; static string deleteComments(string s) //去掉以//开始的注释 { if (s == null) return s; int pos = s.IndexOf("//"); if (pos < 0) return s; return s.Substring(0, pos); }if (Directory.Exists("Tem

  • C#删除字符串中重复字符的方法

    本文实例讲述了C#删除字符串中重复字符的方法.分享给大家供大家参考.具体实现方法如下: 复制代码 代码如下: #region 删除重复字符  string s = "sdfffffsrlkjesgljfdg03940864e5=_0R9DTGR98YUI\\|||'\\???fdf///";  Response.Write("<br/>String:" + s + "<br/>Result:");  IEnumerable

  • C#中DataTable删除行的方法分析

    本文实例讲述了C#中DataTable删除行的方法,分享给大家供大家参考之用.具体实现方法如下: 自己的删除例子(drTemp是表,gvSummary是dev 的gridview.单击右键点击grid删除): 1.dtTemp.Rows.RemoveAt(gvSummary.FocusedRowHandle); 2.dtTemp.Rows[gvSummary.FocusedRowHandle].Delete();  dtTemp.AcceptChanges(); 在C#中,如果要删除DataTa

  • C#删除最后一个结尾逗号的方法

    本文实例讲述了C#删除最后一个结尾逗号的方法.分享给大家供大家参考.具体实现方法如下: C#开发过程中经常会用逗号将数组或者列表中的字符串进行连接,这样往往最后会多一个逗号,这个函数用于去除最后的那个逗号,很简单. /// <summary> /// 删除最后结尾的一个逗号 /// </summary> public static string DelLastComma(string str) { return str.Substring(0, str.LastIndexOf(&q

  • C#遍历List并删除某个元素的方法

    本文实例分析了C#遍历List并删除某个元素的方法.分享给大家供大家参考.具体如下: 1.我们选择用for循环: for(int i=0;i<list.count;i++) { if(list[i]) { list.RemoveAt(i); } } 如果这样循环,肯定不对, {A B C D E F G H}  假设当前遍历到D(i=3),移除,接着遍历i=4(F), 此时跳过了E(i=3) 2.我们使用倒序遍历,这个问题就解决了 for(int i=list.Count-1;i>=0;i--

  • C#实现彻底删除文件的方法

    本文实例讲述了C#实现彻底删除文件的方法.分享给大家供大家参考.具体实现方法如下: 经常用360的文件粉碎,删除隐私文件貌似还不错的.不过C#也可以实现彻底删除文件.试了下用360文件恢复恢复不了源文件了. 主要代码如下: 复制代码 代码如下: public class AbsoluteFile  {         public event EventHandler FinishDeleteFileEvent = null;         public event EventHandler

  • c#数据绑定之删除datatable数据示例

    c#数据绑定之将datatabel的data添加listView中,简要的通过代码应用了DataTable,DataTableColumns,DataTableRow类,通过UI界面的Textbox向DataTable中添加数据然后响应到ListView控件中.在本实例中主要针对如何删除DataTable的纪录,并同步到ListView中. 首先,对UI做一些改动,最终界面如下图所示.主要是在ListView 中添加了CheckBox控件. 在ListView中添加CheckBox 的XAML

  • C#下实现创建和删除目录的实例代码

    本文所述代码是从一个C#程序中摘录出来的,主要实现C#创建目录.删除文件夹及文件的功能,包括所引用的名称空间等,特别是对C#不熟悉的初学者,会有一定的参考借鉴价值.下面把创建和删除文件夹的完整代码帖上来供大家参考借鉴. 代码入下所示: using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.IO; using System.Collections; nam

  • c#程序删除自身代码示例分享

    在.NET程序中,因为运行中的程序是受系统保护的,不能自己删除自身的,所以自删除的思路: 在关闭本程序之前启动新的进程打开另一个程序,调用这个程序来删除原程序.然后再完成外部进程的销毁. 方法一:程序中打开新的进程,删掉程序后,再销毁进程本身 流程:首先生成一个BAT文件,然后让BAT执行删除动作,就是:1.生成删除的BAT2.运行BAT3.快速退出4.BAT开始删除EXE5.BAT删除BAT 复制代码 代码如下: private static void DeleteItself(){strin

  • Windows系统中C#读写ini配置文件的程序代码示例分享

    最近接触到INI配置文件的读写,虽然很久以前微软就推荐使用注册表来代替INI配置文件,现在在Visual Studio上也有专门的.Net配置文件格式,但是看来看去还是INI配置文件顺眼.事实上.Net的XML格式配置文件在功能上更加强大,我也更推荐大家使用这种类型的配置文件来进行.Net软件的开发,我之所以使用INI配置文件,无非是想尝一下鲜和个人习惯而已. C#本身没有提供访问INI配置文件的方法,但是我们可以使用WinAPI提供的方法来处理INI文件的读写,代码很简单!网上有大量现成的代码

  • 使用Python的Twisted框架编写非阻塞程序的代码示例

    先来看一段代码: # ~*~ Twisted - A Python tale ~*~ from time import sleep # Hello, I'm a developer and I mainly setup Wordpress. def install_wordpress(customer): # Our hosting company Threads Ltd. is bad. I start installation and... print "Start installation

  • python使用PyV8执行javascript代码示例分享

    安装相应的库,我使用的是PyV8 需要注意的是里面写的function函数需要用()括起来 复制代码 代码如下: import PyV8 class Test(): def js(self): ctxt = PyV8.JSContext() ctxt.enter() func = ctxt.eval('''(function(){return '###'})''') print func() print '213' if __name__ == '__main__': crawler = Tes

  • JavaScript实现图片滑动切换的代码示例分享

    假设我们这里有1到5五张bmp图片,那么控制图片切换显示的核心代码可以为: <script> var i=1; var img = new Array(); img[0] = "1.bmp"; img[1] = "2.bmp"; img[2] = "3.bmp"; img[3] = "4.bmp"; img[4] = "5.bmp"; function playImg(){ i=i+1; var

  • c#测试本机sql运算速度的代码示例分享

    复制代码 代码如下: using System;using System.Collections.Generic;using System.Text;using System.Data.SqlClient; namespace ConsoleApplication2{    class Program    {        static void Main(string[] args)        {            SqlConnection conn = new SqlConnec

  • C#连接mariadb(MYSQL分支)代码示例分享

    首先配置好你的MariaDb,创建test数据库,在test里创建MyTable表,脚本如下(通过HeidiSQL导出的脚本): 复制代码 代码如下: -- ---------------------------------------------------------- 主机:                           172.16.40.153-- 服务器版本:                        5.5.5-10.0.4-MariaDB-1~wheezy-log -

  • 用C#写的ADSL拨号程序的代码示例

    <!--StartFragment-->ADSL自动拨号类,前提是在系统中已经有了一个宽带拨号连接 调用代码: RASDisplay ras = new RASDisplay(); ras.Disconnect();//断线 ras.Connect("adsl");//拨号 复制代码 代码如下: using System;  using System.Runtime.InteropServices;  public struct RASCONN  {      public

  • 说明Java的传递与回调机制的代码示例分享

    java传值还是传引用 1.原始类型参数传递 public void badSwap(int var1, int var2) { int temp = var1; var1 = var2; var2 = temp; } 2.引用类型参数传递 public void tricky(Point arg1, Point arg2) { arg1.x = 100; arg1.y = 100; Point temp = arg1; arg1 = arg2; arg2 = temp; } public st

  • android计算器代码示例分享

    复制代码 代码如下: <?xml version="1.0" encoding="utf-8"?><EditText    android:id="@+id/editText1"    android:layout_width="match_parent"    android:layout_height="wrap_content"    android:ems="10&quo

随机推荐