我有一个集会。在这个程序集中,我有一个类和接口。我需要在运行时加载这个程序集,并希望创建该类的对象,并且还想使用该接口。
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);
这是我的代码。怎么可以改进?
答案 0 :(得分:19)
如果您的程序集在GAC或bin中,请使用类型名称末尾的程序集名称而不是Assembly.Load()
。
object obj = Activator.CreateInstance(Type.GetType("DALL.LoadClass, DALL", true));
答案 1 :(得分:12)
您应该使用动态方法进行改进。它比反射更快..
以下是使用Dynamic Method创建Object的示例代码。
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
答案 2 :(得分:0)
结帐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;
确保将程序集添加到项目中,并将构建操作属性更改为“嵌入式资源”。