web-dev-qa-db-fra.com

Comment charger Assembly au moment de l'exécution et créer une instance de classe?

J'ai une assemblée. Dans cette assemblée, j'ai une classe et une interface. Je dois charger cet assembly 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 cela pourrait-il être amélioré?

17
Pankaj

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

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

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 prend seulement 1/10ème de temps nécessaire par Activator.

Découvrez http://www.ozcandegirmenci.com/post/2008/02/Create-object-instances-Faster-than-Reflection.aspx

12
Sasikumar D.R.

Départ 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);
            }
        }
AppDomain.CurrentDomain.AssemblyResolve += CurrentDomain_AssemblyResolve;
0
reggaeguitar