Hvordan kan jeg passere et argument til en C # plug-in som legges gjennom Assembly.CreateInstance?

stemmer
5

Det jeg har nå (som vellykket laster plug-in) er dette:

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

Dette fungerer bare for en klasse som har en konstruktør uten argumenter. Hvordan går jeg i et argument til en konstruktør?

Publisert på 25/09/2008 klokken 16:50
kilden bruker
På andre språk...                            


5 svar

stemmer
2

Du kan med Activator.CreateInstance

Svarte 25/09/2008 kl. 16:51
kilden bruker

stemmer
1

Activator.CreateInstance tar Type og hva du ønsker å sende til Typer konstruktøren.

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

Svarte 25/09/2008 kl. 16:53
kilden bruker

stemmer
3

anrop

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

i stedet. MSDN Dokumenter

EDIT: Hvis du kommer til å stemme dette ned, kan gi innsikt i hvorfor denne tilnærmingen er feil / eller ikke den beste måten.

Svarte 25/09/2008 kl. 16:54
kilden bruker

stemmer
12

Du kan ikke. I stedet bruker Activator.CreateInstance som vist i eksempelet nedenfor (merk at klienten navnerom er i en DLL og vert i en annen. Begge må finnes i samme katalog for koden til å fungere.)

Men hvis du ønsker å skape en virkelig pluggbart grensesnitt, foreslår jeg at du bruker en Initial metode som tar de gitte parameterne i grensesnittet, i stedet for å stole på konstruktører. På den måten kan du bare kreve at plugin klassen implementere grensesnittet, i stedet for "håper" at det godtar de aksepterte parametere i konstruktøren.

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());
            }
        }
    }
}
Svarte 25/09/2008 kl. 17:38
kilden bruker

stemmer
0

Du kan heller ikke bruke Activator.CreateInstance, noe som kan gi bedre resultater. Se nedenfor Stackoverflow spørsmålet.

Hvordan passere ctor args i Activator.CreateInstance eller bruke IL?

Svarte 17/06/2010 kl. 03:15
kilden bruker

Cookies help us deliver our services. By using our services, you agree to our use of cookies. Learn more