दिलचस्प पोस्ट
विशिष्ट आईडी मूल्यों के आधार पर MySQL आदेश मटप्ललिब में सतह के भूखंड एक HTML फार्म में एकाधिक सबमिट बटन ओपनएक्सएमएल एसडीके: एक्सेल पुनर्गणना फार्मूला बनाओ मैं Windows कमांड लाइन से एप्लिकेशन निकास कोड कैसे प्राप्त करूं? कुछ डॉलर मूल्य दिए जाने पर सिक्कों के सभी संयोजन कैसे प्राप्त करें अपलोड करें प्लगइन जावा सर्वलेट को कॉल नहीं करता है क्यों नहीं कर सकते DateTime.ParseExact () "9/1/2009" "एम / डी / yyyy" का उपयोग करके पार्स करें ElementFormDefault एक्सएसडी में क्या करता है? प्रत्येक श्रेणी के लिए शीर्ष 10 रिकॉर्ड चुनें कोष्ठकों के साथ या बिना एक वर्ग को इंस्टाइएट करें? सी ++ / सीएलआई में चार * और सिस्टम :: स्ट्रिंग के बीच कन्वर्ट करने का सबसे अच्छा तरीका क्या है? आर में मर्ज करने / डेटा में शामिल होने का सबसे तेज़ तरीका क्या है? एसएपी। नेट एमवीसी 2 के साथ काम करने के लिए एसक्यूएल सर्वर कॉम्पैक्ट 3.5 / 4 नहीं मिल सकता है कस्टम निर्देश के अंदर मूल्यांकन किए गए गुणों को कैसे प्राप्त करें

क्या सभी संदर्भित विधानसभाओं को एप डोमेन में लोड करने के लिए एक तरीका है?

मेरी परियोजनाएं इस तरह स्थापित की जाती हैं:

  • परियोजना की परिभाषा"
  • परियोजना कार्यान्वयन"
  • परियोजना "उपभोक्ता"

प्रोजेक्ट "उपभोक्ता" दोनों "परिभाषा" और "कार्यान्वयन" का संदर्भ देता है, लेकिन "कार्यान्वयन" में किसी भी प्रकार का स्थायी रूप से संदर्भ नहीं करता है।

जब अनुप्रयोग शुरू होता है, तो परियोजना "उपभोक्ता" एक स्थिर विधि को "परिभाषा" कहते हैं, जिसे "कार्यान्वयन" में प्रकार खोजने की आवश्यकता होती है

क्या कोई तरीका है कि मैं किसी भी संदर्भित विधानसभा को पथ या नाम के बिना ऐप डोमेन में लोड किए जाने और मजबूती से पूर्ण आईओसी फ्रेमवर्क का इस्तेमाल करने के लिए मजबूर कर सकता हूं?

वेब के समाधान से एकत्रित समाधान "क्या सभी संदर्भित विधानसभाओं को एप डोमेन में लोड करने के लिए एक तरीका है?"

यह चाल करना था:

var loadedAssemblies = AppDomain.CurrentDomain.GetAssemblies().ToList(); var loadedPaths = loadedAssemblies.Select(a => a.Location).ToArray(); var referencedPaths = Directory.GetFiles(AppDomain.CurrentDomain.BaseDirectory, "*.dll"); var toLoad = referencedPaths.Where(r => !loadedPaths.Contains(r, StringComparer.InvariantCultureIgnoreCase)).ToList(); toLoad.ForEach(path => loadedAssemblies.Add(AppDomain.CurrentDomain.Load(AssemblyName.GetAssemblyName(path)))); 

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


अद्यतन: एनएटी 4 में शामिल प्रबंधित एक्सटेंसिबिलिटी फ़्रेमवर्क (सिस्टम.कंपनेन्टमोडेल) में इस तरह की चीजों को पूरा करने के लिए बेहतर सुविधाएं हैं।

आप Assembly.GetReferencedAssemblies का उपयोग Assembly.GetReferencedAssemblies का नाम AssemblyName[] प्राप्त करने के लिए कर सकते हैं, और फिर उनमें से प्रत्येक पर Assembly.Load(AssemblyName) को कॉल करें। आप को अवश्य अवश्य पढ़ना होगा – परन्तु अधिमान्य तरीके से आपके द्वारा पहले से लोड किए गए विधानसभाओं का ट्रैक रखना है 🙂

सिर्फ एक पुनरावर्ती उदाहरण साझा करना चाहता था मैं LoadReferencedAssembly विधि को इस तरह से मेरी स्टार्टअप रूटीन में बुला रहा हूँ:

 foreach (Assembly assembly in AppDomain.CurrentDomain.GetAssemblies()) { this.LoadReferencedAssembly(assembly); } 

यह पुनरावर्ती विधि है:

 private void LoadReferencedAssembly(Assembly assembly) { foreach (AssemblyName name in assembly.GetReferencedAssemblies()) { if (!AppDomain.CurrentDomain.GetAssemblies().Any(a => a.FullName == name.FullName)) { this.LoadReferencedAssembly(Assembly.Load(name)); } } } 

यदि आप फोडी का प्रयोग करते हैं। कोस्टारा, या कोई अन्य विलय मर्जिंग समाधान, तो स्वीकृत उत्तर काम नहीं करेगा

वर्तमान में भरी हुई विधानसभा की संदर्भित असेंब्ली निम्न लोड करता है। पुनरावर्ती आपके पास रह गया है

 var loadedAssemblies = AppDomain.CurrentDomain.GetAssemblies().ToList(); loadedAssemblies .SelectMany(x => x.GetReferencedAssemblies()) .Distinct() .Where(y => loadedAssemblies.Any((a) => a.FullName == y.FullName) == false) .ToList() .ForEach(x => loadedAssemblies.Add(AppDomain.CurrentDomain.Load(x))); 

जैसा कि मुझे विधानसभा को लोड करना पड़ा + एक विशेष पथ से निर्भरताएं आज मैं इसे करने के लिए इस वर्ग को लिखा था।

 public static class AssemblyLoader { private static readonly ConcurrentDictionary<string, bool> AssemblyDirectories = new ConcurrentDictionary<string, bool>(); static AssemblyLoader() { AssemblyDirectories[GetExecutingAssemblyDirectory()] = true; AppDomain.CurrentDomain.AssemblyResolve += ResolveAssembly; } public static Assembly LoadWithDependencies(string assemblyPath) { AssemblyDirectories[Path.GetDirectoryName(assemblyPath)] = true; return Assembly.LoadFile(assemblyPath); } private static Assembly ResolveAssembly(object sender, ResolveEventArgs args) { string dependentAssemblyName = args.Name.Split(’,’)[0] + ".dll"; List<string> directoriesToScan = AssemblyDirectories.Keys.ToList(); foreach (string directoryToScan in directoriesToScan) { string dependentAssemblyPath = Path.Combine(directoryToScan, dependentAssemblyName); if (File.Exists(dependentAssemblyPath)) return LoadWithDependencies(dependentAssemblyPath); } return null; } private static string GetExecutingAssemblyDirectory() { string codeBase = Assembly.GetExecutingAssembly().CodeBase; var uri = new UriBuilder(codeBase); string path = Uri.UnescapeDataString(uri.Path); return Path.GetDirectoryName(path); } }