2009-08-20 48 views
27

是否有可能在C#中创建一个应用程序,以便在某些情况下可以删除它自己。在C#中的一个可执行文件中可自行删除的应用程序

我需要为我的应用程序编写更新程序,但是我不希望更新过程后可执行文件被保留。

有一个官方的.Net OneClick,但由于与我的HTTP服务器有一些不兼容以及OneClick自身的一些问题,我不得不自己创建一个。

George。

[编辑] 在更多的细节:

我: 应用程序的可执行文件,下载更新(“补丁”,但不完全)这个“补丁”更新应用程序可执行文件本身。

应用程序执行的folowed:

Application: Start -> Check Version -> Download new Updater -> Start Updater -> exit; 
Updater: Start -> do it's work -> start Application Executable -> self delete (this is where I get stuck); 
+1

您是否问过OneClick本身存在的问题?可能会解决这个问题。 – Christian13467 2009-08-20 11:14:36

+0

不是OneClick本身。我更新了问题并添加了应用程序的精确度。 – George 2009-08-20 11:28:47

回答

30

如果使用Process.Start,则可以传入Del参数和要删除的应用程序的路径。

ProcessStartInfo Info=new ProcessStartInfo(); 
Info.Arguments="/C choice /C Y /N /D Y /T 3 & Del "+ 
       Application.ExecutablePath; 
Info.WindowStyle=ProcessWindowStyle.Hidden; 
Info.CreateNoWindow=true; 
Info.FileName="cmd.exe"; 
Process.Start(Info); 

代码段从this article

+0

感谢您的文章。不知道为什么我无法找到它:S – George 2009-08-20 11:32:06

+2

如果应用程序将无法在3秒内关闭? – 2016-02-03 14:31:14

+0

@AlexZhukovskiy示例中的超时并不指示在尝试删除应用程序之前系统应该等待多长时间,超时只是触发默认值以强制关闭应用程序。你只是指示命令行的过程中存在后,运行[删除](https://www.microsoft.com/resources/documentation/windows/xp/all/proddocs/en-us/del.mspx? mfr = true)命令。 – James 2016-02-03 15:15:21

0

MHH所以让我得到这个直。你有一些application.exe和你的updater应用程序updater.exe?

因此,当您启动您的application.exe时,它会检查某个较新版本的网络服务器,然后启动updater.exe。你想updater.exe在完成更新后自行删除?或者你想删除下载的补丁(或类似的)?请更精确一点。

请注意,当您删除updater.exe时,您必须重新创建它才能进行下一个更新过程。

+0

我已经添加了精度的应用程序。 – George 2009-08-20 11:26:43

0

你的第二线可以

Updater: Star -> do it's work -> start Application Executable -> Updater Exits -> Application deletes your Updater.exe 
+0

我想到了这一点,但我需要更新删除自己。 – George 2009-08-20 11:31:31

+0

有趣。您正在为似乎无法解决的解决方案苦苦挣扎。问题是什么?为什么你要更新删除自己,为什么不是应用程序? – 2009-08-20 11:38:02

2

无法您只需在应用程序中删除更新?即:

应用程序:开始 - > [删除旧的更新如果存在] - >检查版本 - >下载新的更新 - >开始更新 - >退出;

更新程序:开始 - >执行更新 - >启动应用程序 - >退出;

5

这是没有引入的另一种方法(即你会再想要删除为好,毫无疑问)棘手> ... - 开始 - > [如果存在,删除旧的更新]:

应用。你的情况,你已经有2个进程 - updater.exe和application.exe。我可能只是应用程序删除updater.exe,当它从那里产生 - 你可以使用简单的命令行arg,或从updater.exe到application.exe的IPC调用来触发它。这不完全是一个自我删除EXE,但满足我认为的要求。

对于完整的治疗和其他选项,您应该阅读the definitive treatment of self deleting EXEs。代码示例在C(或ASM)中,但应该是p/invokable。

我可能会尝试与CreateFileFILE_FLAG_DELETE_ON_CLOSE喜欢的东西(伪代码)updater.exe:

var h = CreateFile(
      "updater.exe", 
      GENERIC_READ | GENERIC_WRITE, 
      FILE_SHARE_DELETE, 
      NULL, 
      CREATE_NEW, 
      FILE_ATTRIBUTE_NORMAL | FILE_FLAG_DELETE_ON_CLOSE 
     ); 

byte[] updaterBytes = GetUpdaterBytesFromWeb(); 
File.WriteAllBytes("updater.exe", updaterBytes); 

Process.Start("updater.exe"); 

一旦application.exe退出,updater.exe具有1的文件句柄时更新。 EXE退出,它下降到0,应该删除。

+3

不幸的是,似乎没有工作,因为过程必须与'FILE_SHARE_DELETE'启动 - 这过程。开始不行。然后,由于该文件仍处于打开状态(并且无法关闭,因为这会将其删除),因此无法启动该进程。 – urbanhusky 2014-04-01 09:27:55

8

我建议你使用批处理文件作为引导和有它自身删除和exe文件后

public static class Updater 
{ 
    public static void Main() 
    { 
     string path = @"updater.bat"; 

     if (!File.Exists(path)) 
     { 
      // Create a file to write to. 
      using (StreamWriter sw = File.CreateText(path)) 
      { 
       sw.WriteLine("updater.exe"); 
       sw.WriteLine("delete updater.exe /y"); 
       sw.WriteLine("delete updater.bat /y"); 
      } 

      System.Process.Start(path); 
     } 
     else 
     { 
      RunUpdateProcess(); 
     } 
    } 

    private void RunUpdateProcess() 
    { 
     ..... 
    } 
} 
+0

只是不是“删除.../y”,而是“del .../Q” – Boogier 2013-07-13 11:13:32

-1
public void uninstall() { 
    string app_name = Application.StartupPath + "\\" + Application.ProductName + ".exe"; 
    string bat_name = app_name + ".bat"; 

    string bat = "@echo off\n" 
     + ":loop\n" 
     + "del \"" + app_name + "\"\n" 
     + "if Exist \"" + app_name + "\" GOTO loop\n" 
     + "del %0"; 

    StreamWriter file = new StreamWriter(bat_name); 
    file.Write(bat); 
    file.Close(); 

    Process bat_call = new Process(); 
    bat_call.StartInfo.FileName = bat_name; 
    bat_call.StartInfo.WindowStyle = ProcessWindowStyle.Hidden; 
    bat_call.StartInfo.UseShellExecute = true; 
    bat_call.Start(); 

    Application.Exit(); 
} 

自由外部可执行文件“蝙蝠” Windows窗体应用程序中删除。

+0

看起来与早期的批处理文件方式非常相似,但可以在错误条件下无限循环,这看起来并不明智。 – 2017-03-17 00:56:40

相关问题