Comment passer un argument à un plug-in C # en cours de chargement via Assembly.CreateInstance?

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

Question

Ce que j'ai maintenant (qui charge avec succès le plug-in) est ceci:

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

Ceci ne fonctionne que pour une classe ayant un constructeur sans argument. Comment passer un argument à un constructeur?

Était-ce utile?

La solution

Vous ne pouvez pas. Utilisez plutôt Activator.CreateInstance comme indiqué dans l'exemple ci-dessous (notez que le L'espace de noms du client se trouve dans une DLL et l'hôte dans une autre. Les deux doivent se trouver dans le même répertoire pour que le code fonctionne.)

Cependant, si vous voulez créer une interface vraiment plug-in, je vous suggère d'utiliser une méthode Initialize qui prend les paramètres donnés dans votre interface, au lieu de faire appel à des constructeurs. De cette façon, vous pouvez simplement exiger que la classe de plug-in implémente votre interface, au lieu de "espérer". qu'il accepte les paramètres acceptés dans le constructeur.

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

Autres conseils

appeler

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

à la place. Documents MSDN

EDIT: Si vous votez contre cette proposition, veuillez expliquer pourquoi cette approche est mauvaise / ou n’est pas la meilleure solution.

Vous pouvez utiliser Activator.CreateInstance

.

Activator.CreateInstance prend un type et tout ce que vous voulez transmettre au constructeur Types.

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

Vous ne pouvez pas non plus utiliser Activator.CreateInstance, qui pourrait mieux fonctionner. Voir ci-dessous la question StackOverflow.

Comment passer les arguments de ctor dans Activator.CreateInstance ou utiliser IL?

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top