2010-02-25 11 views
12

मेरे पास एक .exe असेंबली और संदर्भित असेंबली का एक सेट है जिसे मैं अद्यतन कोड को तैनात करने में सक्षम होना चाहता हूं। मुझे वास्तव में चलने वाले कोड को बदलने की आवश्यकता नहीं है, लेकिन अगली बार जब मैं निष्पादन योग्य लॉन्च करता हूं तो मैं इसे अद्यतन कोड चुनना चाहता हूं। वर्तमान में जब मैं चल रही फ़ाइल पर प्रतिलिपि बनाने का प्रयास करता हूं तो मुझे किसी अन्य प्रक्रिया द्वारा उपयोग किए जाने वाले .exe के बारे में एक त्रुटि मिलती है।चल रहे सी # प्रक्रिया (AKA हॉट तैनाती) के लिए असेंबली को कैसे अपडेट करें?

सारांशित करने के लिए; .exe उपयोग में होने पर मैं कोड को कैसे अपडेट कर सकता हूं?

+0

.NET के लिए हॉट परिनियोजन के उद्देश्य से कोडेप्लेक्स पर एक प्रोजेक्ट प्रतीत होता है। मैंने हालांकि कोशिश नहीं की है: http://hotdeploy.codeplex.com/ –

उत्तर

17

ऐसा करना आसान है। आप फ़ाइल का नाम बदल सकते हैं, विंडोज के पास हैंडल पर लॉक है, फाइल के लिए निर्देशिका प्रविष्टि नहीं। अब आप समस्याओं के बिना अद्यतन की प्रतिलिपि बना सकते हैं। जो कुछ भी करने के लिए बाकी है, वह आपके ऐप को फिर से शुरू होने के बाद नामित फ़ाइल से छुटकारा पाने के लिए है। यदि आवश्यक है।

+0

क्या आप अधिक जानकारी/कोड दे सकते हैं? – Jerry

+0

आपके उत्तर के अतिरिक्त, आप यह ध्यान रखना चाहेंगे कि फ़ाइल को नाम बदलने से पहले उपयोगकर्ता को डीबगिंग प्रक्रिया से अलग होना पड़ सकता है, अन्यथा आईडीई (यानी विजुअल स्टूडियो) स्रोत को संपादित करने की अनुमति नहीं देगा। –

+0

यह खराब समाधान है क्योंकि आपको नाम बदलने के बाद क्षतिग्रस्त शॉर्टकट मिलेंगे। आपको इसके बजाय सहायक आवेदन का उपयोग करना चाहिए। – l0pan

3

मुझे नहीं लगता कि यह संभव है। उदाहरण के लिए, जब शून्य डाउनटाइम के साथ एएसपीनेट अनुप्रयोगों को तैनात करते हैं, तो सबसे अच्छा अभ्यास लोड बैलेंसर होना है ताकि आप एक उदाहरण ले सकें, इसे अपडेट कर सकें, फिर अपडेट के लिए दूसरे को नीचे ले जाएं।

2

जब आप उपयोग में हैं तो आप असेंबली को अपडेट नहीं कर सकते हैं। इस प्रकार की स्थिति के लिए सबसे अच्छा विकल्प एक छोटा निष्पादन योग्य बनाना है जो आपकी असेंबली की छाया प्रतिलिपि बनाता है, और उन्हें एक नए स्थान से लॉन्च करता है।

इस तरह, जब उपयोगकर्ता प्रोग्राम लॉन्च करता है, तो आप तैनाती साइट से कॉपी (स्थानीय रूप से) छाया कर सकते हैं, जिसे हमेशा ओवरराइट किया जा सकता है।

2

ClickOnce आपको कुछ विकल्प देता है। "एप्लिकेशन स्टार्टअप के बाद अपडेट" का update strategy है।

अधिक जटिल परिदृश्यों के लिए, System.Deployment namespace है। उदाहरण के लिए, आप समय-समय पर अपने आवेदन में अपडेट के लिए मतदान कर सकते हैं।

1

क्या निम्नलिखित के बारे में:

  1. तैनात एक अद्यतन फ़ोल्डर में exe।
  2. जब भी ऐप शुरू होता है, तो यह अपडेट फ़ोल्डर की जांच करेगा।
  3. तो अपने खाली नहीं, एक प्रति कार्यक्रम
  4. प्रतिलिपि कार्यक्रम तो अद्यतन फ़ोल्डर में एक
  5. अद्यतन फ़ोल्डर में कुछ भी हटाएं
  6. फिर exe को पुन: लॉन्च के साथ मौजूदा exe की जगह लेंगे निष्पादित
1

सबसे अच्छा विचार पहले से सुझाए गए अन्य उत्तरों में से एक होगा ... जैसे एमईएफ और क्लिकऑन के साथ पुनर्मूल्यांकन का उपयोग करना। हालांकि, वे समाधान आपको "इस तैनाती" के लिए मदद नहीं करेंगे। उन्हें आपको exe में परिवर्तन करने और बूट पट्टा निष्पादन योग्य बनाने की आवश्यकता होती है, जो केवल अगली तैनाती के लिए आपकी सहायता करेगी।

के लिए यह तैनात यदि आप ऐसा करने की कोशिश कर सकते हैं (मैं इस से पहले कभी नहीं किया है, लेकिन सैद्धांतिक रूप से यह काम कर सकता था):

  1. अपने नए dll के कॉपी एक सबफ़ोल्डर के लिए कहीं न कहीं
  2. एक कमांड जोड़े subfolder से नए एक्सएल को अंतिम एक्सई फ़ोल्डर में कॉपी करने के लिए RunOnce registry key पर लाइन xcopy कमांड जहां आप इसे जाना चाहते हैं।
  3. रीबूट।

रनऑन्स कुंजी में कमांड लाइन कमांड होते हैं जो एक बार रीबूट पर चलाए जाते हैं, और फिर रजिस्ट्री से हटा दिए जाते हैं, इसलिए वे फिर से नहीं चलते हैं। इस प्रकार इंस्टालशिल्ड आपको कुछ अनुप्रयोगों द्वारा उपयोग किए जाने पर कुछ डीएल को ओवरराइट करने की अनुमति देता है।

0

इस वर्ग वर्तमान में चल रहे निष्पादन का नाम बदल देगा, अगर यह बिना किसी अपवाद के पूर्ण करता है, तो आप बस नई निष्पादन योग्य है, तो पुन: लॉन्च, जैसे लिख सकते हैं: पर्याप्त

Ourself.Rename(); 
// Download or copy new version 
File.Copy(newVersion, Ourself.FileName()); 
// Launch new version 
System.Diagnostics.Process.Start(Ourself.FileName()); 
// Close current version 
Close(); // Exit(); 

आसान?

class Ourself 
{ 
    public static string FileName() { 
     Assembly _objParentAssembly; 

     if (Assembly.GetEntryAssembly() == null) 
      _objParentAssembly = Assembly.GetCallingAssembly(); 
     else 
      _objParentAssembly = Assembly.GetEntryAssembly(); 

     if (_objParentAssembly.CodeBase.StartsWith("http://")) 
      throw new IOException("Deployed from URL"); 

     if (File.Exists(_objParentAssembly.Location)) 
      return _objParentAssembly.Location; 
     if (File.Exists(System.AppDomain.CurrentDomain.BaseDirectory + System.AppDomain.CurrentDomain.FriendlyName)) 
      return System.AppDomain.CurrentDomain.BaseDirectory + System.AppDomain.CurrentDomain.FriendlyName; 
     if (File.Exists(Assembly.GetExecutingAssembly().Location)) 
      return Assembly.GetExecutingAssembly().Location; 

     throw new IOException("Assembly not found"); 
    } 

    public static bool Rename() 
    { 
     string currentName = FileName(); 
     string newName = FileName() + ".ori"; 
     if (File.Exists(newName)) 
     { 
      File.Delete(newName); 
     } 
     File.Move(currentName, newName); 
     return true; 
    } 
} 
संबंधित मुद्दे