Come posso passare un argomento a un plug-in C # caricato tramite Assembly.CreateInstance?

Quello che ho ora (che carica con successo il plug-in) è questo:

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

Funziona solo per una class che ha un costruttore senza argomenti. Come posso passare un argomento a un costruttore?

Non puoi. Utilizzare invece Activator.CreateInstance come mostrato nell’esempio seguente (si noti che lo spazio dei nomi del client si trova in una DLL e l’host in un’altra. Entrambi devono essere trovati nella stessa directory in cui il codice funziona).

Tuttavia, se si desidera creare un’interfaccia veramente collegabile, suggerisco di utilizzare un metodo di inizializzazione che prenda i parametri specificati nell’interfaccia, invece di fare affidamento sui costruttori. In questo modo puoi solo richiedere che la class plugin implementa la tua interfaccia, invece di “sperare” che accetti i parametri accettati nel costruttore.

 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()); } } } } 

chiamata

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

anziché. Documenti MSDN

EDIT: Se voterai per favore, ti preghiamo di capire perché questo approccio è sbagliato / o no nel modo migliore.

È ansible con Activator.CreateInstance

Activator.CreateInstance accetta un Type e qualsiasi cosa tu voglia passare al costruttore di Tipi.

http://msdn.microsoft.com/en-us/library/system.activator.createinstance.aspx

Non è inoltre ansible utilizzare Activator.CreateInstance, che potrebbe funzionare meglio. Vedi sotto la domanda StackOverflow.

Come passare arg argent in Activator.CreateInstance o utilizzare IL?