예제 - c# 클래스 배열



런타임시 어셈블리를로드하고 클래스 인스턴스를 만드는 방법은 무엇입니까? (2)

개선을 위해 동적 방법을 사용해야합니다. 반사보다 빠릅니다.

다음은 동적 메서드를 사용하여 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 확인하십시오 http://www.ozcandegirmenci.com/post/2008/02/Create-object-instances-Faster-than-Reflection.aspx

나는 의회가있다. 이 어셈블리에는 클래스와 인터페이스가 있습니다. 런타임에이 어셈블리를로드해야하며 클래스의 객체를 만들고 인터페이스를 사용하려고합니다.

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() 대신 name 형식 끝에 어셈블리 이름을 사용하십시오.

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




assemblies