Wie kann ich ein Argument für eine C # Plug-in wird geladen durch Assembly.CreateInstance passieren?

StackOverflow https://stackoverflow.com/questions/134481

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?

War es hilfreich?

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

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?

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top