it-swarm.com.de

Wie lade ich Assembly zur Laufzeit und erstelle eine Klasseninstanz?

Ich habe eine Versammlung. In dieser Assembly habe ich eine Klasse und Schnittstelle. Ich muss diese Assembly zur Laufzeit laden und möchte ein Objekt der Klasse erstellen und auch die Schnittstelle verwenden.

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

Das ist mein Code. Wie könnte es verbessert werden?

17
Pankaj

Wenn sich Ihre Assembly in GAC oder Ablage befindet, verwenden Sie den Assemblynamen am Ende des Typnamens anstelle von Assembly.Load().

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

Sie sollten Dynamic Method for for Improving verwenden. es ist schneller als Nachdenken ..

Hier ist ein Beispielcode zum Erstellen von Objekten mithilfe der dynamischen Methode.

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

Diese Methode benötigt nur einen Zehntel, den Activator benötigt.

Check out http://www.ozcandegirmenci.com/post/2008/02/Erstellen von Objektobjekten-Schneller-thanreflexion.aspx

12
Sasikumar D.R.

Check out http://www.youtube.com/watch?v=x-KK7bmo1AM Zum Ändern seines Codes zum Laden mehrerer Assemblys verwenden Sie

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