런타임에 어셈블리를로드하고 클래스 인스턴스를 만드는 방법은 무엇입니까?
-
05-07-2019 - |
문제
어셈블리가 있습니다. 이 어셈블리에는 클래스와 인터페이스가 있습니다. 런타임 에이 어셈블리를로드하고 클래스의 객체를 만들고 인터페이스를 사용하려고합니다.
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에있는 경우 유형 이름의 끝에서 어셈블리 이름을 사용하는 경우 Assembly.Load()
.
object obj = Activator.CreateInstance(Type.GetType("DALL.LoadClass, DALL", true));
다른 팁
개선을 위해 동적 방법을 사용해야합니다. 반사보다 빠릅니다 ..
다음은 동적 방법을 사용하여 객체 작성을위한 샘플 코드입니다.
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();
이 방법은 활성기가 1/10 시간 만 필요합니다.
체크 아웃 http://www.ozcandegirmenci.com/post/2008/02/create-object-instances-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;
프로젝트에 어셈블리를 추가하고 빌드 액션 속성을 "임베디드 리소스"로 변경하십시오.
제휴하지 않습니다 StackOverflow