在运行时加载汇编并创build类实例

我有一个集会。 在这个汇编中,我有一个类和接口。 我需要在运行时加载这个程序集,并且想创build这个类的一个对象,并且也想使用这个接口。

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

这是我的代码。 怎么能改进?

如果您的程序集位于GAC或bin中,请在types名称的末尾使用程序集名称而不是Assembly.Load()

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

您应该使用dynamic方法来改进。 它比反思更快

以下是使用dynamic方法创build对象的示例代码。

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

这个方法只需要Activator所需的1/10时间。

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

退房http://www.youtube.com/watch?v=x-KK7bmo1AM修改他的代码加载多个程序集使用;

 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; 

确保将您的程序集添加到您的项目中,并将生成操作属性更改为“Embedded Resource”。