2014-04-12 7 views
5

मेरा सी # आवेदन server.exe मेरे व्यावसायिक संचालन के लिए महत्वपूर्ण है और आदर्श रूप से बिना रुकावट के चलने की आवश्यकता है 24/7। कोड रॉक ठोस है लेकिन एक चीज जो मेरे नियंत्रण से बाहर है, वह तीसरे पक्ष द्वारा उत्पन्न इनबाउंड डेटा फ़ीड्स की खराब गुणवत्ता है। मैं कभी कभी डेटा फीड कि विसंगतियों जो मामले मैं चाहिए में शामिल प्राप्त करेंगे:ऐप पुनरारंभ किए बिना गतिशील रूप से लोड करने के लिए मैं अपने सी # ऐप का एक हिस्सा कैसे प्राप्त कर सकता हूं?

  • अद्यतन server.exe भीतर फ़ीड प्रोसेसिंग कोड विसंगति
  • recompile
  • पुनः आरंभ server.exe समायोजित करने के लिए नए कोड का उपयोग कर और वाक्य रचना की अनुमति देते हैं त्रुटिपूर्ण फ़ीड संसाधित करने के लिए

पूरी प्रक्रिया आम तौर पर कुछ मिनटों के लेकिन server.exe को फिर से प्रारंभ से कम समय लगता कुछ गैर महत्वपूर्ण राज्य सूचना के रीसेट का कारण बनता है और बदतर, बाहरी प्रक्रियाओं है कि server.exe.

मेरा लक्ष्य पर निर्भर के विघटन का कारण बनता: ​​एक अलग DLL जिनकी सामग्री server.exe को पुन: प्रारंभ बिना अद्यतन किया जा सकता में फ़ीड प्रोसेसिंग कोड को अलग। मैं यह कैसे कर सकता हूं?

अनुमति दें मुझे समझाने के लिए मैं अब तक इस मंच पोस्ट लिख करने से पहले क्या किया है:

फ़ीड प्रोसेसर इंटरफ़ेस common.dll नामक एक नई विधानसभा के लिए ले जाया गया है।

public interface IFeedProcessor{ 
    bool ProcessFeed(String filePath); //returns false on failure, true on success 
} 

Server.exe अब संदर्भ देता common.dll: इंटरफेस कुछ इस तरह लग रहा है।

फ़ीड प्रोसेसर को feedProcessors.dll नामक एक नई असेंबली में स्थानांतरित कर दिया गया है।

internal class FeedProcessor1:IFeedProcessor{ 
    public FeedProcessor1(){} 
    bool ProcessFeed(String filePath){/*implementation*/return true;} 
} 

internal class FeedProcessor2:IFeedProcessor{ 
    public FeedProcessor2(){} 
    public bool ProcessFeed(String filePath){/*implementation*/return true;} 
} 

[... and so on...] 

feedProcessors.dll ने भी प्रथम श्रेणी FeedProcessorUtils नामित कि कुछ विन्यास इनपुट के आधार पर एक विशिष्ट फ़ीड प्रोसेसर बनाने के लिए उपयोग की जाती है: कार्यान्वयन कुछ इस तरह दिखाई। ऐसा कुछ दिखता है:

public class FeedProcessorUtils{ 
    public static void CreateFeedProcessor(int feedType /*and other configuration params*/){ 
     switch(feedType){ 
      case 1:return new FeedProcessor1(); 
      case 2:return new FeedProcessor2(); 
      default: throw new ApplicationException("Unhandled feedType: "+feedType); 
     } 
    } 
} 

सब कुछ पहले जैसा काम करता है लेकिन निश्चित रूप से यह मेरी गतिशील लोडिंग समस्या को हल नहीं करता है; यदि मैंने feedProcessors.dll को नए कोड के साथ अपडेट किया है और इसे उत्पादन सर्वर पर कॉपी किया है, तो मैं ऐसा करने में असमर्थ हूं क्योंकि फ़ाइल उपयोग में है। वहां कोई आश्चर्य नहीं है। तो समाधान क्या है?

आदर्श रूप से मैं एक अद्यतन feedProcessors.dll को उत्पादन सर्वर में फ़ाइल-इन-यूज त्रुटि के बिना और server.exe को पुनरारंभ किए बिना कॉपी करने में सक्षम होना चाहता हूं। फिर, अगली बार server.exe FeedProcessorUtils.CreateFeedProcessor() को कॉल करता है, यह पुराने 0 की बजाय संशोधित DLL से निष्पादित होगा।

मैं कहां से शुरू करूं?

+1

आप [MEF] (http://msdn.microsoft.com/en-us/library/dd460648 (v = vs.110) .aspx) –

उत्तर

3

आप गतिशील रूप से लोड DLL http://msdn.microsoft.com/en-us/library/ms404279(v=vs.110).aspx

+0

दिलचस्प खोज रहे हैं। धन्यवाद। तो आइए मान लें कि मैं विधानसभा का उपयोग करता हूं। लोड (बाइट []) गतिशील रूप से मेरी असेंबली लोड करने के लिए। मैं अन्य एसओ पदों से प्राप्त हूं कि एक बार जब मैं इसे लोड करता हूं, तो मैं पूरे ऐपडोमेन को मारने के बिना इसे अनलोड नहीं कर सकता, जो मेरे मामले में काम करने योग्य नहीं है। तो क्या आप यह कह रहे हैं कि यदि मेरा प्रोग्राम निर्धारित करता है कि 'feedProcessor.dll' पुराना है कि मैं ** बाद में ** विधानसभा में कॉल कर सकता हूं। लोड()? पहले लोड किए गए संस्करण के बारे में मैं क्या करूँ? क्या मैं इसके संदर्भ को मिटा देता हूं? कोई निपटान() फ़ंक्शन नहीं है। क्या मैं एक स्मृति रिसाव बना रहा हूँ? –

1

के लिए छाया प्रतिलिपि विधानसभाओं का उपयोग करना चाहते एक क्लासिक जगह MEF उपयोग करने के लिए की तरह लगता है: http://msdn.microsoft.com/en-us/library/dd460648(v=vs.110).aspx

मैं सुझाव है कि आप इस पर गौर और सवाल पूछने के रूप में आप आगे बढ़ें।

1

छाया प्रतिलिपि विकल्प के अलावा, आपको एक ऐपडोमेन बनाना चाहिए और डोमेन और reload the dll को पुनरारंभ करने के लिए अपना डीएल बदलना चाहिए, तो आप इसे FileSystemWatcher के साथ देख सकते हैं।

not directly referencing your classes between AppDomains का ख्याल रखना, या आपकी पुरानी असेंबली कभी भी अनलोड नहीं की जाएगी।

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

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