एमईएफ रनटाइम प्लगइन अपडेट इश्यू
अंक
मेरा एमईएफ कोड किसी निर्देशिकासूची से जुड़े फ़ोल्डर से रनटाइम के दौरान असेंबली अपडेट नहीं कर रहा है। प्लगइन रन-टाइम पर सफलतापूर्वक लोड होते हैं, लेकिन जब मैं डीएलएल अपडेट करता हूं और डायरेक्टरी कैटलॉग पर रीफ्रेश करता हूं, तो असेंबली अपडेट नहीं हो रही हैं।पृष्ठभूमि
मैं एक डीएलएल बना रहा हूं जिसमें एक एमईएफ कंटेनर है, और एक स्थानीय प्लगइन फ़ोल्डर खोजने के लिए निर्देशिकासूची का उपयोग करता है। मैं वर्तमान में एक सरल 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.Refresh जाएगा
DirectoryCatalog विधानसभाओं, केवल जोड़े या निकाले अपडेट नहीं करता अद्यतन assebmlies का पता नहीं है। केवल नए या हटाए गए। कामकाज और सुझावों के लिए इस उत्तर पर एक नज़र डालें: http://stackoverflow.com/a/14842417/850119 –
मेरे डीएलएस लोड होने पर बंद हो जाते हैं इसलिए मैं उन्हें नए डीएलएस के साथ ओवरराइड नहीं कर सकता। क्या आपको यह समस्या नहीं थी? क्या आपने ऐसा कुछ किया जो उन्हें अद्यतन करने योग्य बना देता है। –
हाँ, मेरे पास यह समस्या थी। गुजरने में मैंने जो कदम उठाए उनमें से एक था, "छाया प्रतिलिपि" को सक्षम करना। छाया प्रतिलिपि एक प्रोग्राम को डीएलएल असेंबली की स्थानीय प्रतियां खींचने की अनुमति देती है, और उन्हें डीएलएस लॉक करने के बजाय स्थानीय कैश में जोड़ती है। इसे रनटाइम के दौरान आपको "हॉट स्वैप" डीएलएस की अनुमति देने के लिए सक्षम होना चाहिए, अन्यथा आपको प्रोग्राम को रोकने, डीएलएस बदलने, और फिर इसे पुनरारंभ करने की आवश्यकता है। मुझे लगता है कि यह उदाहरण मैंने देखा है, लेकिन अगर यह आपके लिए काम नहीं करता है तो Google MEF और छाया प्रतिलिपि, http://stackoverflow.com/questions/12593308/mef-and-shadowcopying-dlls-so-that-i -कैन-ओवरराइट-इन-रन-रनटाइम – Madullah