2008-09-25 14 views
5

अब मेरे पास क्या है (जो प्लग-इन को सफलतापूर्वक लोड करता है) यह है:मैं विधानसभा के माध्यम से लोड होने वाले सी # प्लग-इन को तर्क कैसे दे सकता हूं। क्रिएट इंस्टेंस?

Assembly myDLL = Assembly.LoadFrom("my.dll"); 
IMyClass myPluginObject = myDLL.CreateInstance("MyCorp.IMyClass") as IMyClass; 

यह केवल उस वर्ग के लिए काम करता है जिसमें बिना किसी तर्क के निर्माता हैं। मैं एक कन्स्ट्रक्टर को तर्क में कैसे पास करूं?

उत्तर

12

आप नहीं कर सकते। इसके बजाय नीचे दिए गए उदाहरण में दिखाए गए अनुसार Activator.CreateInstance का उपयोग करें (ध्यान दें कि क्लाइंट नेमस्पेस एक डीएलएल में है और होस्ट दूसरे में है। दोनों को कोड के लिए कोड के लिए एक ही निर्देशिका में पाया जाना चाहिए।)

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

using System; 
using Host; 

namespace Client 
{ 
    public class MyClass : IMyInterface 
    { 
     public int _id; 
     public string _name; 

     public MyClass(int id, 
      string name) 
     { 
      _id = id; 
      _name = name; 
     } 

     public string GetOutput() 
     { 
      return String.Format("{0} - {1}", _id, _name); 
     } 
    } 
} 


namespace Host 
{ 
    public interface IMyInterface 
    { 
     string GetOutput(); 
    } 
} 


using System; 
using System.Reflection; 

namespace Host 
{ 
    internal class Program 
    { 
     private static void Main() 
     { 
      //These two would be read in some configuration 
      const string dllName = "Client.dll"; 
      const string className = "Client.MyClass"; 

      try 
      { 
       Assembly pluginAssembly = Assembly.LoadFrom(dllName); 
       Type classType = pluginAssembly.GetType(className); 

       var plugin = (IMyInterface) Activator.CreateInstance(classType, 
                    42, "Adams"); 

       if (plugin == null) 
        throw new ApplicationException("Plugin not correctly configured"); 

       Console.WriteLine(plugin.GetOutput()); 
      } 
      catch (Exception e) 
      { 
       Console.Error.WriteLine(e.ToString()); 
      } 
     } 
    } 
} 
2

कॉल

public object CreateInstance(string typeName, bool ignoreCase, BindingFlags bindingAttr, Binder binder, object[] args, CultureInfo culture, object[] activationAttributes) 

बजाय। MSDN Docs

संपादित करें: यदि आप इसे वोट देने जा रहे हैं, तो कृपया यह ध्यान दें कि यह दृष्टिकोण गलत क्यों है या नहीं।

+0

आप इस के साथ कुछ कोड पोस्ट कर सकते हैं? –

0

आप एक्टिवेटर का उपयोग भी नहीं कर सकते हैं। क्रिएट इंस्टेंस, जो बेहतर प्रदर्शन कर सकता है। StackOverflow प्रश्न नीचे देखें।

How to pass ctor args in Activator.CreateInstance or use IL?