2012-12-02 23 views
14

फ़ाइल या असेंबली लोड नहीं कर सकता मेरा प्रश्न this one के समान है, केवल इतना ही है कि उत्तर और कार्य-आसपास मेरे लिए काम नहीं कर रहे हैं। इसके अलावा मैं विजुअल स्टूडियो 2012 में हूं।वीएसआईएक्स - एक संदर्भित डीएल

मेरे पास एक VSPackage है जो किसी अन्य प्रोजेक्ट का संदर्भ दे रहा है, जो अन्य डीएलएस पर निर्भर है। हर बार जब मैं डीबग में अपना पैकेज चलाता हूं तो मुझे अपवाद मिलता है कि अन्य डीएलएस नहीं मिल सकते हैं। वे आउटपुट निर्देशिका में हैं, और वे हस्ताक्षरित हैं।

मैंने वीएसपीकेज प्रोजेक्ट द्वारा सीधे उन्हें संदर्भित करने का प्रयास नहीं किया।

विचार?

उत्तर

29

यह समस्या मौजूद है क्योंकि विजुअल स्टूडियो आपके एक्सटेंशन के फ़ोल्डर में असेंबली की तलाश नहीं कर रहा है यदि आपके एक्सटेंशन में इन असेंबली पर कोई स्पष्ट निर्भरता नहीं है। उदाहरण के लिए, कॉन्फ़िगरेशन फ़ाइल (आईओसी कॉन्फ़िगरेशन) या xaml कोड में सेट निर्भरताएं।

  1. आप GAC और दृश्य स्टूडियो में इन विधानसभाओं को तैनात उन्हें लोड होगा कर सकते हैं: मैं इस समस्या के तीन समाधान पता है। यह विधि अच्छी है यदि आप किसी तृतीय-पक्ष लाइब्रेरी का उपयोग करते हैं जो जीएसी (उदाहरण के लिए, एमएस एंटरप्राइज़ लाइब्रेरी) में उपयोग के लिए बनाया गया है। लेकिन VSIX Deployment Package जीएसी में असेंबली स्थापित करने की अनुमति नहीं देता है, तो आप एमएसआई इंस्टॉलर का उपयोग कर सकते हैं।

  2. विजुअल स्टूडियो 2010/2012 के लिए VSPackages के लिए आप ProvideBindingPath विशेषता का उपयोग कर सकते हैं। जिस मार्ग पर आपका एक्सटेंशन स्थित है, उस पथ में जोड़ा जाएगा जो विजुअल स्टूडियो निर्भर असेंबली खोजने के लिए उपयोग करता है। यदि आपके एक्सटेंशन में VSPackage शामिल नहीं है, तो आप इस विशेषता को किसी भी सार्वजनिक वर्ग (see here) में जोड़ सकते हैं।

    [ProvideBindingPath] 
    public class MyVsPackage : Package 
    { /* ... */ } 
    
  3. आप असेंबली नाम मैन्युअल रूप से हल कर सकते हैं। ऐसा करने के लिए, आपको असेंबली रिसोलव ईवेंट की सदस्यता लेने की आवश्यकता है और आपको एक हैंडलर से आवश्यक असेंबली वापस करने की आवश्यकता है। यह सबसे लचीला तरीका है, यदि आप पिछली विधियों का उपयोग नहीं कर सकते हैं, तो यह विशेष रूप से आपके लिए है।

    मेरी IntelliDebugger परियोजना में, मैं इसके लिए एक वर्ग ManualAssemblyResolver लिखा है:

using System; 
using System.Reflection; 

namespace IntelliEgg.Debugger.Utility 
{ 
    public class ManualAssemblyResolver : IDisposable 
    { 
     public ManualAssemblyResolver(Assembly assembly) 
     { 
      if (assembly == null) 
       throw new ArgumentNullException("assembly"); 

      _assemblies = new[] {assembly}; 
      AppDomain.CurrentDomain.AssemblyResolve += OnAssemblyResolve; 
     } 

     public ManualAssemblyResolver(params Assembly[] assemblies) 
     { 
      if (assemblies == null) 
       throw new ArgumentNullException("assemblies"); 

      if (assemblies.Length == 0) 
       throw new ArgumentException("Assemblies should be not empty.", "assemblies"); 

      _assemblies = assemblies; 
      AppDomain.CurrentDomain.AssemblyResolve += OnAssemblyResolve; 
     } 

     public void Dispose() 
     { 
      AppDomain.CurrentDomain.AssemblyResolve -= OnAssemblyResolve; 
     } 

     private Assembly OnAssemblyResolve(object sender, ResolveEventArgs args) 
     { 
      foreach (Assembly assembly in _assemblies) 
      { 
       if (args.Name == assembly.FullName) 
       { 
        return assembly; 
       } 
      } 

      return null; 
     } 

     private readonly Assembly[] _assemblies; 
    } 
} 

इस वर्ग समस्या विधानसभा (करने के लिए पहली कॉल करने से पहले बनाया जाना चाहिए जैसे, पैकेज में :: Initialize() विधि)

+0

बिल्कुल सही। बहुत धन्यवाद। – Adam

+0

आपने इस उपयोगिता वर्ग में प्रवेश करने के लिए असेंबली कैसे लोड की? इसके बजाय ... आप किस संदर्भ का उपयोग करते थे? 'Assembly.LoadFrom (फ़ाइल का नाम)'? मैं सोच रहा हूं कि किसी अन्य संदर्भ में किसी अन्य प्लगइन द्वारा लोड होने से आप असेंबली के उसी संस्करण की रक्षा कैसे करते हैं? –

+1

हां मैं प्रोजेक्ट में 'System.indows.Interactivity.dll'' के लिए 'असेंबली। लोडफ्रॉम()' या 'टाइपऑफ (क्लासफ्रॉमएमएअस्प्लोर्स) का उपयोग करता हूं। एस्प्लिब्स' और 'माईएस्प्लिब्स' का संदर्भ)। 'मैनुअलएस्प्लर रीसोलवर' का उपयोग करने का उद्देश्य विजुअल स्टूडियो को किसी भी फ़ोल्डर से सभी निर्भर असेंबली लोड करने और स्पष्ट रूप से इसे आपके कोड में निर्धारित करने की अनुमति देता है। मॉड्यूलरिटी का समर्थन करने के लिए मैं एमएस प्रिज्म का उपयोग करता हूं और 'बूटस्ट्रैपर' वर्ग में लोड मॉड्यूल को कॉन्फ़िगर करता हूं। –