¿Cómo cargar ensamblado en tiempo de ejecución y crear una instancia de clase?
-
05-07-2019 - |
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?
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 " ;.