Frage

Ich habe eine Montage. In dieser Versammlung habe ich eine Klasse und Schnittstelle. Ich brauche diese Anordnung zur Laufzeit laden und wollen ein Objekt der Klasse erstellen und will 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?

War es hilfreich?

Lösung

Wenn Ihre Assembly in GAC oder sind den Namen der Assembly statt Assembly.Load() am Ende der Typenbezeichnung verwenden.

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

Andere Tipps

Sie sollten dynamische Methode verwenden, mit zur Verbesserung. sein schneller als Reflexion ..

Hier ist ein Beispielcode Objekt mit Dynamic Verfahren zum Erstellen von ..

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

Dieses Verfahren dauert nur 1 / 10tel benötigte Zeit durch Activator.

Schauen Sie sich http://www.ozcandegirmenci.com/ Post / 2008/02 / Create-Objekt-Instanzen-Faster-than-Reflection.aspx

Schauen Sie sich http://www.youtube.com/watch?v=x- KK7bmo1AM So ändern Sie den Code mehrere Baugruppen zu laden verwenden

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);
            }
        }
In der Hauptmechanismus Put-
AppDomain.CurrentDomain.AssemblyResolve += CurrentDomain_AssemblyResolve;
Seien Sie sicher, dass Ihre Baugruppen zu einem Projekt hinzuzufügen und die Action Eigenschaft ändern, um „Embedded Resource“.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top