2013-09-22 6 views
6

डोडी प्रश्न के लिए माफ़ी - अगर किसी के पास बेहतर सुझाव है तो पुन: प्रयास करने में खुशी होगी।मैं एक असेंबली को गतिशील रूप से संदर्भित कैसे कर सकता हूं जो किसी अन्य असेंबली की तलाश में है?

मैं गतिशील एक विधानसभा अन्य अनुप्रयोग से संबंधित लागू द्वारा एक वस्तु बनाने के लिए कोशिश कर रहा हूँ।

निम्नलिखित PowerShell कोड मेरे लिए अच्छी तरह से काम कर रहा है:

[Reflection.Assembly]::LoadFrom("C:\Program Files\Vendor\Product\ProductAPI.dll") 
$bobject = new-object ProductAPI.BasicObject  
$bobject.AddName("Some Name") 

मैं सी # में एक ही बात करने के लिए संघर्ष कर रहा हूँ।

System.Reflection.Assembly myDllAssembly = 
System.Reflection.Assembly.LoadFile("C:\\Program Files\\Vendor\\Product\\ProductAPI.dll"); 

System.Type BasicObjectType = myDllAssembly.GetType("ProductAPI.BasicObject"); 

var basicObjectInstance = Activator.CreateInstance(BasicObjectType); 

एक TargetInvocationException में अंतिम पंक्ति के परिणाम: मैं इस समय इस राशि StackOverflow पर अन्य पदों के आधार पर।

{ "फ़ाइल या विधानसभा लोड नहीं कर सका AnotherObject, संस्करण = 1.2.345.0, संस्कृति = तटस्थ, PublicKeyToken = अशक्त 'या अपनी निर्भरता में से एक। प्रणाली निर्दिष्ट फ़ाइल नहीं मिल सकता है।"

ऐसा लगता है कि BasicObject निर्माता (एक ही फ़ोल्डर में AnotherObject.dll से) AnotherObject आह्वान करने के लिए कोशिश कर रहा है, लेकिन यह नहीं मिल रहा।

इस बारे में कोई सुझाव कैसे प्राप्त करें?

+0

मुझे लगता है कि DLL आप लोड कर रहे हैं काम करने के लिए एक और DLL की आवश्यकता है: dll संदर्भ NewtonSoft.Json.dll) और इसके अलावा आप क्या निर्भरता यह नहीं मिल सकता है के बारे में जानकारी दे देंगे। आप इस उपकरण का उपयोग कर डीएलएल की निर्भरताओं का पता लगा सकते हैं। http://www.dependencywalker.com/ – cgTag

+0

जब आपको अनुपलब्ध DLL लगता है। या तो इसे अपने रिलीज फ़ोल्डर में कॉपी करें या इसे शामिल करने के लिए विंडोज़ पाथ को संशोधित करें। – cgTag

+0

वर्थ जांच रहा है कि ['FUSLOGVW.exe'] (http://msdn.microsoft.com/en-us/library/e74a18c4.aspx) (* असेंबली बाइंडिंग लॉग व्यूअर *) के साथ लोड करने में असफल रहा है (जो कि आपको दिखाएगा कि क्या है लोड होने में विफल (और जहां .NET लोडर दिख रहा है)। – Richard

उत्तर

7

यह the usual places में एक आश्रित विधानसभा नहीं मिल रहा है, तो आप उन्हें मैन्युअल रूप से लगाने के लिए कैसे निर्दिष्ट करने के लिए की आवश्यकता होगी।

दो सबसे आसान तरीकों में मैं ऐसा करने के लिए के बारे में पता कर रहा हूँ:

  1. मैन्युअल Assembly.Load के साथ पहले से निर्भर विधानसभाओं लोड।

  2. अतिरिक्त असेंबली निर्भरताओं के साथ असेंबली लोड करने वाले डोमेन के लिए असेंबली रीसोल्व ईवेंट को संभाल लें।

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

यदि आप पहले विकल्प के साथ जाते हैं, तो यह एक पूर्ण लोड और reflection-only Load के बीच अंतर को देखने में भी उपयोगी होगा।

आप बल्कि (जो मैं सलाह देते हैं) 2 साथ जाना होगा, तो आप इस जो नेस्टेड निर्भरता चेन के साथ काम करने के अतिरिक्त लाभ है की तरह कुछ कोशिश कर सकते हैं (उदाहरण के लिए MyLib.dll संदर्भ LocalStorage.dll संदर्भ Raven.Client।

AppDomain.CurrentDomain.AssemblyResolve += (sender,args) => { 

    // Change this to wherever the additional dependencies are located  
    var dllPath = @"C:\Program Files\Vendor\Product\lib"; 

    var assemblyPath = Path.Combine(dllPath,args.Name.Split(',').First() + ".dll"); 

    if(!File.Exists(assemblyPath)) 
     throw new ReflectionTypeLoadException(new[] {args.GetType()}, 
      new[] {new FileNotFoundException(assemblyPath) }); 

    return Assembly.LoadFrom(assemblyPath); 
}; 
+1

बहुत बढ़िया! मुझे लगता है कि 'पथ' के लिए आपके अंतिम दो संदर्भ 'असेंबलीपाथ' होना चाहिए, है ना? – gf131072

+0

हाँ धन्यवाद, अभी तय किया गया है। – nathanchere

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