2013-04-22 5 views
10

एमईएफ रनटाइम प्लगइन अपडेट इश्यू

अंक

मेरा एमईएफ कोड किसी निर्देशिकासूची से जुड़े फ़ोल्डर से रनटाइम के दौरान असेंबली अपडेट नहीं कर रहा है। प्लगइन रन-टाइम पर सफलतापूर्वक लोड होते हैं, लेकिन जब मैं डीएलएल अपडेट करता हूं और डायरेक्टरी कैटलॉग पर रीफ्रेश करता हूं, तो असेंबली अपडेट नहीं हो रही हैं।

पृष्ठभूमि

मैं एक डीएलएल बना रहा हूं जिसमें एक एमईएफ कंटेनर है, और एक स्थानीय प्लगइन फ़ोल्डर खोजने के लिए निर्देशिकासूची का उपयोग करता है। मैं वर्तमान में एक सरल WinForm से इस डीएल को कॉल करता हूं, जो शैडोकॉपी का उपयोग करने के लिए एक अलग परियोजना के साथ सेटअप है ताकि मैं अपने प्लगइन फ़ोल्डर में डीएलएस को ओवरराइट कर सकूं। इस फ़ोल्डर को अद्यतन करने के लिए फ़ाइलवॉचर का उपयोग करने के बजाय, मैं एक सार्वजनिक विधि का खुलासा कर रहा हूं जो डायरेक्टरी कैटलॉग पर रीफ्रेश करता है, इसलिए मैं स्वचालित रूप से असेंबली को असेंबली अपडेट कर सकता हूं।

कोड

आधार वर्ग MEF कैटलॉग और कंटेनर को दर्शाता है, और निर्देशात्मक पहुँच के लिए वर्ग चर के रूप में उन्हें बचाता है बाद में

public class FieldProcessor 
{ 
    private CompositionContainer _container; 
    private DirectoryCatalog dirCatalog; 

    public FieldProcessor() 
    { 
     var catalog = new AggregateCatalog(); 
     //Adds all the parts found in the same assembly as the TestPlugin class 
     catalog.Catalogs.Add(new AssemblyCatalog(typeof(TestPlugin).Assembly)); 
     dirCatalog = new DirectoryCatalog(AppDomain.CurrentDomain.BaseDirectory + "Plugin\\"); 
     catalog.Catalogs.Add(dirCatalog); 

     //Create the CompositionContainer with the parts in the catalog 
     _container = new CompositionContainer(catalog); 
    } 

    public void refreshCatalog() 
    { 
     dirCatalog.Refresh(); 
    } 

} ... 

यहाँ मैं अधिलेखित करने के लिए कोशिश कर रहा हूँ प्लगइन है। अपडेट करने का मेरा परीक्षण यह है कि लौटे हुए स्टिंग एक टेक्स्ट बॉक्स में आउटपुट होते हैं, मैं स्ट्रिंग्स को बदलता हूं, प्लगइन लौट रहा है, पुनर्निर्माण कर रहा है, और प्लगइन फ़ोल्डर में कॉपी कर रहा हूं। लेकिन जब तक मैं ऐप को बंद और पुनरारंभ नहीं करता तब तक यह चल रहे ऐप के लिए अपडेट नहीं होता है।

[Export(typeof(IPlugin))] 
[ExportMetadata("PluginName", "TestPlugin2")] 
public class TestPlugin2 : IPlugin 
{ 
    public IEnumerable<IField> GetFields(ContextObject contextObject, params string[] parameters) 
    { 
     List<IField> retList = new List<IField>(); 
     //Do Work Return Wrok Results 
     retList.Add(new Field("plugin.TestPlugin2", "TestPluginReturnValue2")); 
     return retList; 
    } 
} 

संपादित

आयात वक्तव्य

[ImportMany(AllowRecomposition=true)] 
    IEnumerable<Lazy<IPlugin, IPluginData>> plugins; 

रिसर्च

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

अनुरोध

क्या किसी ने इस समस्या को देखा है, या पता है कि असेंबली के साथ मेरी समस्याएं क्या हो सकती हैं जो रनटाइम के दौरान अपडेट नहीं हो रही हैं? किसी भी अतिरिक्त जानकारी या अंतर्दृष्टि की सराहना की जाएगी।

संकल्प

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

+1

DirectoryCatalog.Refresh जाएगा

DirectoryCatalog विधानसभाओं, केवल जोड़े या निकाले अपडेट नहीं करता अद्यतन assebmlies का पता नहीं है। केवल नए या हटाए गए। कामकाज और सुझावों के लिए इस उत्तर पर एक नज़र डालें: http://stackoverflow.com/a/14842417/850119 –

+0

मेरे डीएलएस लोड होने पर बंद हो जाते हैं इसलिए मैं उन्हें नए डीएलएस के साथ ओवरराइड नहीं कर सकता। क्या आपको यह समस्या नहीं थी? क्या आपने ऐसा कुछ किया जो उन्हें अद्यतन करने योग्य बना देता है। –

+0

हाँ, मेरे पास यह समस्या थी। गुजरने में मैंने जो कदम उठाए उनमें से एक था, "छाया प्रतिलिपि" को सक्षम करना। छाया प्रतिलिपि एक प्रोग्राम को डीएलएल असेंबली की स्थानीय प्रतियां खींचने की अनुमति देती है, और उन्हें डीएलएस लॉक करने के बजाय स्थानीय कैश में जोड़ती है। इसे रनटाइम के दौरान आपको "हॉट स्वैप" डीएलएस की अनुमति देने के लिए सक्षम होना चाहिए, अन्यथा आपको प्रोग्राम को रोकने, डीएलएस बदलने, और फिर इसे पुनरारंभ करने की आवश्यकता है। मुझे लगता है कि यह उदाहरण मैंने देखा है, लेकिन अगर यह आपके लिए काम नहीं करता है तो Google MEF और छाया प्रतिलिपि, http://stackoverflow.com/questions/12593308/mef-and-shadowcopying-dlls-so-that-i -कैन-ओवरराइट-इन-रन-रनटाइम – Madullah

उत्तर

3

क्या आपने अपने आयात विशेषता के लिए AllowRecomposition पैरामीटर सेट किया था?

AllowRecomposition 
Gets or sets a value that indicates whether the property or field will be recomposed when exports with a matching contract have changed in the container. 

http://msdn.microsoft.com/en-us/library/system.componentmodel.composition.importattribute(v=vs.95).aspx

संपादित करें: http://msdn.microsoft.com/en-us/library/system.componentmodel.composition.hosting.directorycatalog.refresh.aspx

के चारों ओर एक काम के लिए

: https://stackoverflow.com/a/14842417/2215320

+0

मैंने किया, खेद है कि मैंने मूल रूप से आयात कथन कोड पोस्ट नहीं किया है, मैंने अपने आयात विवरण को प्रतिबिंबित करने के लिए प्रश्न अपडेट किया है। – Madullah

+0

और आपका रीफ्रेश कोड? मुझे लगता है कि समस्या अंदर है। आपने FileSystemWatcher का उपयोग नहीं करने के बारे में कहा, आप अपनी असेंबली का पता लगाने और पुनः लोड कैसे करते हैं? – Niels

+0

मैं ऊपर देखे गए रीफ्रेशसूची विधि के माध्यम से इसे उजागर कर रहा हूं। मैं WinForm पर एक बटन क्लिक घटना से उस विधि को बुला रहा हूँ। – Madullah

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