2009-02-20 12 views
6

मैं AppDomain.AssemblyResolve और AppDomain.ReflectionOnlyAssemblyResolve ईवेंट में हुकिंग के माध्यम से कुछ मॉड्यूल लोड करने का प्रयास कर रहा हूं। जबकि मैं पूर्व को काम करने के लिए मिला, मैं बाद में दुखी हो गया। मैं मेरी समस्या उबला हुआ गए हैं इस छोटे से कार्यक्रम के लिए नीचे:ReflectionOnlyAssembly क्यों असेंबली की कोशिश करते समय निष्पादित नहीं किया गया है। ReflectionOnlyLoad?

public static class AssemblyLoader 
{ 
    static void Main(string[] args) 
    { 
     AppDomain.CurrentDomain.ReflectionOnlyAssemblyResolve += 
      ReflectionOnlyAssemblyResolve; 

     // fails with FileNotFoundException 
     Assembly.ReflectionOnlyLoad("Foo"); 
    } 

    public static Assembly ReflectionOnlyAssemblyResolve(object sender, 
     ResolveEventArgs args) 
    { 
     Trace.TraceInformation(
      "Failed resolving Assembly {0} for reflection", args.Name); 

     return null; 
    } 
} 

इस कार्यक्रम चल रहा है एक FileNotFoundException के साथ विफल जब Assembly.ReflectionOnlyLoad की कोशिश कर रहा है, लेकिन यह ReflectionOnlyAssemblyResolve हैंडलर फोन नहीं करता है। मैं वहां बहुत सुंदर हूँ।

क्या किसी को पता है कि इसका मूल कारण क्या हो सकता है और इसे कैसे कामया जा सकता है?

धन्यवाद!

उत्तर

8

यह लगता है कि ReflectionOnlyAssemblyResolve घटना केवल निर्भरता, नहीं उच्च-स्तरीय विधानसभाओं को हल करने के लिए इस्तेमाल किया जाता है के रूप में यहाँ संकेत दिया:

http://codeidol.com/csharp/net-framework/Assemblies,-Loading,-and-Deployment/Assembly-Loading/

और यहाँ:

http://blogs.msdn.com/junfeng/archive/2004/08/24/219691.aspx

+0

क्या प्रतिबिंब-केवल-लोडिंग असेंबली में असफल प्रयास को रोकने का कोई तरीका है? – derabbink

+0

@derabbink यह एक अलग सवाल है, मैं कल्पना करता हूं। – casperOne

0

विस्तार CasperOne के जवाब पर।

यदि आप सीधे असेंबली संकल्प घटनाओं को रोकना चाहते हैं तो आपको AppDomain.AssemblyResolve ईवेंट में शामिल होना होगा। यह एक वैश्विक हुक है हालांकि यह अकेले आपके परिदृश्य में फिट नहीं होगा। हालांकि यदि आपका एप्लिकेशन सिंगल थ्रेडेड है तो आप विशिष्ट संकल्प घटनाओं को रोकने के लिए एक अल्पकालिक हुकअप कर सकते हैं।

static void LoadWithIntercept(string assemblyName) { 
    var domain = AppDomain.CurrentDomain; 
    domain.AssemblyResolve += MyInterceptMethod; 
    try { 
    Assembly.ReflectionOnlyLoad(assemblyName); 
    } finally { 
    domain.AssemblyResolve -= MyInterceptMethod; 
    } 
} 

private static Assembly MyInterceptMethod(object sender, ResolveEventArgs e) { 
// do custom code here 
} 
+0

ReflectionOnlyLoad() का उपयोग करते समय असेंबली रिसोलव ट्रिगर नहीं किया गया है। जैसा कि मुझे समझ में आया, यह डिजाइन द्वारा है, उन प्रतिबिंबों को लोड करने से बचने के लिए जो प्रतिबिंबऑनलीलोड() के उपयोगकर्ता द्वारा "वांछित" नहीं हैं। मुझे अभी तक यकीन नहीं है कि अगर मैं उस दृष्टिकोण के साथ पूरी तरह से सहमत हूं। –

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

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