Pregunta

Tengo una asamblea. En esta asamblea tengo una clase y una interfaz. Necesito cargar este ensamblaje en tiempo de ejecución y quiero crear un objeto de la clase y también quiero usar la interfaz.

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

Este es mi código. ¿Cómo podría mejorarse?

¿Fue útil?

Solución

Si su ensamblaje está en GAC o bin, use el nombre del ensamblaje al final del nombre del tipo en lugar de Assembly.Load () .

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

Otros consejos

Debes usar el método dinámico para mejorar. es más rápido que la reflexión ..

Aquí hay un código de muestra para crear objetos usando el método dinámico ...

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

Este método solo requiere 1/10 de tiempo requerido por Activator.

Echa un vistazo a http://www.ozcandegirmenci.com/ post / 2008/02 / Create-object-instancia-Faster-than-Reflection.aspx

Consulte http://www.youtube.com/watch?v=x- KK7bmo1AM Para modificar su código para cargar múltiples montajes use.

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);
            }
        }
En tu método principal pon
AppDomain.CurrentDomain.AssemblyResolve += CurrentDomain_AssemblyResolve;
Asegúrese de agregar sus ensamblajes a su proyecto y cambiar la propiedad de acción de compilación a " Recurso incrustado " ;.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top