Como carregar o Assembly em tempo de execução e criar uma instância de class?

Eu tenho uma assembly. Nesta assembly eu tenho uma class e interface. Eu preciso carregar este assembly em tempo de execução e deseja criar um object da class e também deseja usar a 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); 

Este é o meu código. Como poderia ser melhorado?

Se o seu assembly estiver no GAC ou no bin, use o nome do assembly no final do nome do tipo em vez de Assembly.Load() .

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

Você deve usar o método dynamic com para melhorar. é mais rápido que a reflection ..

Aqui está um exemplo de código para criar objects usando o método dynamic.

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

Esse método leva apenas 1/10 da hora necessária pelo ativador.

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

Confira http://www.youtube.com/watch?v=x-KK7bmo1AM Para modificar seu código para carregar vários conjuntos de uso

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

Em seu método principal, coloque

 AppDomain.CurrentDomain.AssemblyResolve += CurrentDomain_AssemblyResolve; 

Certifique-se de adicionar seus assemblies ao seu projeto e altere a propriedade de ação de construção para “Recurso incorporado”.