Wie kann ich ein Argument für eine C # Plug-in wird geladen durch Assembly.CreateInstance passieren?
-
02-07-2019 - |
Frage
Was habe ich jetzt (die erfolgreich das Plug-in lädt), ist dies:
Assembly myDLL = Assembly.LoadFrom("my.dll");
IMyClass myPluginObject = myDLL.CreateInstance("MyCorp.IMyClass") as IMyClass;
Das funktioniert aber nur für eine Klasse, die einen Konstruktor ohne Argumente hat. Wie gehe ich in ein Argument an einen Konstruktor?
Lösung
Sie können nicht. Verwenden Sie stattdessen Activator.CreateInstance wie im Beispiel unten gezeigt (beachten Sie, dass die Client-Namensraum ist in einer DLL und dem Host in einem anderen. Beide müssen im gleichen Verzeichnis zu finden für Code zu arbeiten.)
Wenn Sie jedoch eine wirklich steckbare Schnittstelle erstellen möchten, empfehle ich Ihnen eine Initialize-Methode verwenden, die die angegebenen Parameter in Ihrer Schnittstelle nehmen, anstatt auf Konstrukteure verlassen. Auf diese Weise kann man einfach verlangen, dass die Plugin-Klasse Ihre Schnittstelle implementieren, statt „die Hoffnung“, dass es die akzeptierten Parameter im Konstruktor akzeptiert.
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());
}
}
}
}
Andere Tipps
Anruf
public object CreateInstance(string typeName, bool ignoreCase, BindingFlags bindingAttr, Binder binder, object[] args, CultureInfo culture, object[] activationAttributes)
statt. MSDN Docs
EDIT:. Wenn Sie diese nach unten abstimmen werden, bitte geben Einblick, warum dieser Ansatz ist falsch / oder nicht die beste Art und Weise
Sie können mit Activator.CreateInstance
Activator.CreateInstance nimmt einen Typ und was auch immer Sie wollen den Typen Konstruktor übergeben.
http://msdn.microsoft.com/en -US / library / system.activator.createinstance.aspx
Sie können auch nicht verwenden Activator.CreateInstance, die besser durchführen können. Im folgenden sehen Sie Stackoverflow Frage.
Wie Ctor args in Activator.CreateInstance passieren oder IL verwenden?