2012-04-03 11 views
5

मैं एक डब्ल्यूसीएफ एप्लीकेशन CoreApplication चला रहा हूं जिसका वीएस प्रोजेक्ट AncillaryProject का संदर्भ है। CoreApplicationAncillaryProject से Provider कक्षा का उपयोग करता है; हालांकि, इसे स्पष्ट रूप से संदर्भित नहीं किया जाता है - इसे प्रतिबिंब के माध्यम से बुलाया जाता है।संदर्भित असेंबली नहीं मिली - समाधान में शामिल सभी डीएलएल कैसे प्राप्त करें

मेरे समस्या यह है कि कभी कभी CoreApplicationProvider क्योंकि AncillaryProject खोजने के लिए GetAssemblies() करने के लिए कॉल में नहीं आता है विफल रहता है। कभी-कभी यह ठीक काम करता है, लेकिन कभी-कभी (मुझे लगता है कि यह एक जेआईटी के बाद हो सकता है) यह विफल रहता है।

यहाँ मेरी मूल कोड है:

var providers = from d in AppDomain.CurrentDomain.GetAssemblies() 
       from c in d.GetTypes() 
       where typeof(BaseProvider).IsAssignableFrom(c) 
       select c; 

this question को देखने के बाद, मैं GetReferencedAssemblies() उपयोग करने की कोशिश:

var allAssemblies = AppDomain.CurrentDomain.GetAssemblies(); 
foreach (var a in AppDomain.CurrentDomain.GetAssemblies()) 
{ 
    allAssemblies = allAssemblies.Union(
          a.GetReferencedAssemblies() 
          .Select(b => System.Reflection.Assembly.Load(b))); 
} 
var providers = from d in allAssemblies 
       from c in d.GetTypes() 
       where typeof(BaseProvider).IsAssignableFrom(c) 
       select c; 

मुझे लगता है कि सवाल मैं संदर्भित गतिशील रूप में सभी dll फ़ाइलें लोड के माध्यम से समस्या का हल बिन निर्देशिका, लेकिन यह मेरे लिए विशेष रूप से अच्छा नहीं लगता है। क्या यह करने का कोई बेहतर तरीका है, या .NET बस अन्य असेंबली को लोड नहीं कर रहा है? यह हुड के तहत कैसे काम करता है, और क्या मैं इसके बारे में कुछ भी कर सकता हूं?

+1

पर एक चर्चा यह पूरी तरह से आपके प्रश्न का उत्तर नहीं होगा पाया है, लेकिन वहाँ इस सवाल का मेरा उत्तर में कुछ प्रासंगिक जानकारी है: http://stackoverflow.com/questions/9947882/ get-assemblies-without-instantiating-them/9948404 # comment12730056_9948404 विज़ुअलस्टूडियो में "संदर्भित" असेंबली को नोटटाइम करने के अलावा, रनटाइम पर अधिक मतलब नहीं है, फ़्यूज़न लॉगर का उपयोग करने के बारे में नीचे दिया गया जवाब भी एक अच्छी मदद है। जब भी फ़्यूज़न असेंबली की तलाश में है, तो आपको केवल AncillaryProject.dll की प्रतिलिपि बनाने में सक्षम होना चाहिए, लेकिन यह कुछ जवाब प्रदान कर सकता है कि यह कहां देख रहा है। – CodingWithSpike

+0

अहह - जो मुझे वह जानकारी देता है जो मुझे जानने की ज़रूरत है। – eouw0o83hf

+0

इस प्रश्न को ढूंढने वाले किसी भी व्यक्ति के लिए अनुवर्ती: पूछने के बाद के मध्य वर्षों में, मुझे एहसास हुआ कि मैं इस बारे में पूरी तरह से गलत तरीके से जा रहा था। कभी-कभी कम जादुई और स्पष्ट रूप से 'टाइप' की सूची को सूचीबद्ध करना बहुत दूर है। यह उन स्थितियों में से एक है। – eouw0o83hf

उत्तर

9

माइक्रोसॉफ्ट प्रलेखन AppDomain.CurrentDomain.GetAssemblies() के अनुसार इस एप्लिकेशन डोमेन के निष्पादन संदर्भ में लोड की गई असेंबली मिलती है। About AppDomain.CurrentDomain.GetAssemblies()

ऐसा लगता है कि आपको अपने एप्लिकेशन फ़ोल्डर में डीएलएस की तलाश करने के लिए एपडोमेन का उपयोग करने से आवश्यक असेंबली लोड करने की रणनीति बदलने की जरूरत है।

मैं एक ऐसी ही समस्या here

+0

हाँ, यह पूरी तरह से वर्णन करता है। धन्यवाद। – eouw0o83hf

3

आप नेट विकास जाएं, और जो FuslogVw.exe (संलयन लॉग दर्शक) तक शुरू कर देना चाहिए में AssemblyResolve घटना और लोड AncillaryProject.dll संभाल कर सकते हैं। यह सीएलआर आवेदन पर रिपोर्ट करेगा .NET निर्भरताओं को हल करने की कोशिश कर रहा है। यह दिखाएगा कि आप देख रहे थे और यह उन स्थानों पर स्थित उम्मीदवारों का मूल्यांकन कैसे करता है।

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