Question

J'ai une assemblée. Dans cette assemblée j'ai une classe et une interface. Je dois charger cet assemblage au moment de l'exécution et créer un objet de la classe tout en utilisant l'interface.

Assembly MyDALL = Assembly.Load("DALL"); // DALL is name of my dll
Type MyLoadClass = MyDALL.GetType("DALL.LoadClass"); // LoadClass is my class
object obj = Activator.CreateInstance(MyLoadClass);

Ceci est mon code. Comment pourrait-il être amélioré?

Était-ce utile?

La solution

Si votre assemblage est dans GAC ou bin, utilisez le nom de l'assembly à la fin du nom du type au lieu de Assembly.Load () .

object obj = Activator.CreateInstance(Type.GetType("DALL.LoadClass, DALL", true));

Autres conseils

Vous devriez utiliser la méthode dynamique avec pour améliorer. c'est plus rapide que la réflexion.

Voici un exemple de code permettant de créer un objet à l'aide de la méthode dynamique ..

public class ObjectCreateMethod
{
    delegate object MethodInvoker();
    MethodInvoker methodHandler = null;

    public ObjectCreateMethod(Type type)
    {
        CreateMethod(type.GetConstructor(Type.EmptyTypes));
    }

    public ObjectCreateMethod(ConstructorInfo target)
    {
        CreateMethod(target);
    }

    void CreateMethod(ConstructorInfo target)
    {
        DynamicMethod dynamic = new DynamicMethod(string.Empty,
                    typeof(object),
                    new Type[0],
                    target.DeclaringType);
        ILGenerator il = dynamic.GetILGenerator();
        il.DeclareLocal(target.DeclaringType);
        il.Emit(OpCodes.Newobj, target);
        il.Emit(OpCodes.Stloc_0);
        il.Emit(OpCodes.Ldloc_0);
        il.Emit(OpCodes.Ret);

        methodHandler = (MethodInvoker)dynamic.CreateDelegate(typeof(MethodInvoker));
    }

    public object CreateInstance()
    {
        return methodHandler();
    }
}

//Use Above class for Object Creation.
ObjectCreateMethod inv = new ObjectCreateMethod(type); //Specify Type
Object obj= inv.CreateInstance();

Cette méthode ne prend que 1/10 de la durée requise par Activator.

Découvrez http://www.ozcandegirmenci.com/ post / 2008/02 / Créer-instances-objets-Plus rapides que Reflection.aspx

Découvrez http://www.youtube.com/watch?v=x- KK7bmo1AM Pour modifier son code afin de charger plusieurs assemblys, utilisez

static Assembly CurrentDomain_AssemblyResolve(object sender, ResolveEventArgs args)
        {
            string assemblyName = args.Name.Split(',').First();
            using (var stream = Assembly.GetExecutingAssembly().GetManifestResourceStream("YourNamespace." + assemblyName + ".dll"))
            {
                byte[] assemblyData = new byte[stream.Length];
                stream.Read(assemblyData, 0, assemblyData.Length);
                return Assembly.Load(assemblyData);
            }
        }
Dans votre méthode principale mis
AppDomain.CurrentDomain.AssemblyResolve += CurrentDomain_AssemblyResolve;
Assurez-vous d’ajouter vos assemblys à votre projet et modifiez la propriété d’action de construction en "Ressource intégrée".

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