2009-08-20 16 views
27

में सी # में स्वयं हटाने योग्य एप्लिकेशन सी # में एक आवेदन करना संभव है जो कुछ शर्त में खुद को हटाने में सक्षम हो जाएगा।एक निष्पादन योग्य

मुझे अपने आवेदन के लिए एक अद्यतनकर्ता लिखना होगा, लेकिन मैं नहीं चाहता कि निष्पादन योग्य अद्यतन प्रक्रिया के बाद छोड़ा जाए।

एक अधिकारी है .Net OneClick लेकिन मेरे HTTP सर्वर के साथ कुछ असंगतताओं और OneClick की कुछ समस्याओं के कारण मुझे स्वयं को एक बनाने के लिए मजबूर किया गया है।

जॉर्ज।

[संपादित करें] अधिक जानकारी के लिए:

मेरे पास है: आवेदन निष्पादन जो अपडेटर ("पैच", लेकिन वास्तव में नहीं) इस "पैच" आवेदन ही निष्पादन अद्यतन डाउनलोड करता है।

आवेदन निष्पादित करता है के रूप में 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

क्या आपने वनक्लिक के साथ समस्याओं के बारे में पूछा था? हो सकता है कि यह सवाल हल करे। – Christian13467

+0

वनक्लिक स्वयं नहीं। मैंने परिशुद्धता के लिए प्रश्न और अतिरिक्त आवेदन दिनचर्या अद्यतन की। – George

उत्तर

30

यदि आप प्रक्रिया का उपयोग करते हैं। स्टार्ट आप 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

लेख के लिए धन्यवाद। डुनो क्यों मुझे यह नहीं मिला: एस – George

+2

क्या होगा यदि एप्लिकेशन 3 सेकंड में बंद नहीं होगा? –

+0

@AlexZhukovskiy उदाहरण में टाइमआउट यह निर्धारित नहीं करता है कि एप्लिकेशन को हटाने के प्रयास से पहले सिस्टम को कितना समय इंतजार करना चाहिए, टाइमआउट बस एप्लिकेशन को बंद करने के लिए मजबूर करने के लिए डिफ़ॉल्ट मान को ट्रिगर करता है। आप बस कमांड लाइन को इंगित कर रहे हैं कि प्रक्रिया मौजूद होने के बाद, [del] (https://www.microsoft.com/resources/documentation/windows/xp/all/proddocs/en-us/del.mspx चलाएं? mfr = true) कमांड। – James

0

mhh इसलिए मुझे इस सीधे मिलता है। आपको कुछ application.exe और आपके अपडेटर एप्लिकेशन updater.exe मिला है?

तो जब आप अपना आवेदन शुरू करते हैं। EXE यह किसी नए संस्करण के लिए कुछ वेबसर्वर की जांच करता है और फिर updater.exe प्रारंभ करता है। और आप updater.exe को अपडेट करना समाप्त करने के बाद खुद को हटाने के लिए चाहते हैं? या आप डाउनलोड किए गए पैच (या इसी तरह) को हटाना चाहते हैं? थोड़ा और सटीक बनें।

ध्यान दें कि जब आप updater.exe को हटा रहे हैं तो आपको इसे अगली अद्यतन प्रक्रिया के लिए पुन: बनाना होगा।

+0

मैंने परिशुद्धता के लिए एप्लिकेशन दिनचर्या जोड़ा है। – George

0

अपने दूसरी पंक्ति से लिया स्निपेट

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

मैंने इसके बारे में सोचा, लेकिन मुझे खुद को हटाने के लिए अद्यतनकर्ता की आवश्यकता है। – George

+0

दिलचस्प। आप उस समाधान के साथ संघर्ष कर रहे हैं जो काम नहीं कर रहा है। समस्या क्या है? आप खुद को हटाने के लिए अद्यतनकर्ता क्यों चाहते हैं और आवेदन क्यों नहीं? –

2

आप बस आवेदन के भीतर से अपडेटर हटाया नहीं जा सका हो सकता है? i.e .:

आवेदन: प्रारंभ करें -> [मौजूदा अद्यतनकर्ता को हटाएं यदि मौजूद है -> संस्करण देखें -> नया अद्यतनकर्ता डाउनलोड करें -> अद्यतनकर्ता प्रारंभ करें -> बाहर निकलें;

अद्यतनकर्ता: प्रारंभ करें -> अद्यतन करें -> एप्लिकेशन प्रारंभ करें -> बाहर निकलें;

आवेदन: प्रारंभ -> [वर्तमान अगर पुराने अपडेटर हटाएँ] -> ...

5

यह अभी तक एक और प्रक्रिया (है कि आप तो साथ ही इसमें कोई शक नहीं हटाने के लिए, चाहते हैं) शुरू करने के बिना मुश्किल है। आपके मामले में, आपके पास पहले से 2 प्रक्रियाएं हैं - updater.exe और application.exe। मैं शायद एप्लिकेशन को updater.exe को वहां से उत्पन्न होने पर हटा दूंगा - आप इसे सरल करने के लिए application.exe से updater.exe से एक साधारण कमांड लाइन तर्क या आईपीसी कॉल का उपयोग कर सकते हैं। यह बिल्कुल स्वयं को हटाने वाला नहीं है, लेकिन मुझे लगता है कि आवश्यकताओं को पूरा करता है।

पूर्ण उपचार के लिए, और अन्य विकल्पों को आपको the definitive treatment of self deleting EXEs पढ़ना चाहिए। कोड नमूने सी (या एएसएम) में हैं, लेकिन पी/invokable होना चाहिए।

मैं शायद (छद्म कोड) की तरह कुछ के साथ updater.exe के लिए FILE_FLAG_DELETE_ON_CLOSE साथ CreateFile कोशिश करेंगे:

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

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

-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(); 
} 

स्वयं खिड़कियों प्रपत्र अनुप्रयोगों के लिए एक बाहरी निष्पादन योग्य फ़ाइल ".bat" द्वारा हटाना हटाना है।

+0

पहले बैच फ़ाइल दृष्टिकोण के समान दिखता है, लेकिन त्रुटि की स्थिति में असीम रूप से लूप कर सकता है, जो समझदार नहीं लगता है। –

संबंधित मुद्दे