문제

현재 C #의 프로그래밍에 관한 측면 중 일부를 이해하려고 노력합니다.이제 LateBinding를 배우고 있습니다.아래의 것과 같은 간단한 프로그램을 만드는 방법을 이해합니다.

class Program
{
    static void Main(string[] args)
    {
        Console.WriteLine("Try to do something with late bindings");
        Assembly a = null;
        try
        {
            a = Assembly.Load("CarLibrary");
            Console.WriteLine("1");
        }
        catch (FileNotFoundException ex)
        {
            Console.WriteLine(ex.Message);
        }
        if (a == null)
        {
            CreateUsingLateBinding(a);
        }
        Console.ReadLine();
    }

    private static void CreateUsingLateBinding(Assembly asm)
    {
        try
        {
            Type sportCar = asm.GetType("CarLibrary.SportCar");
            object obj = Activator.CreateInstance(sportCar);
            Console.WriteLine("Success");
            MethodInfo mi = sportCar.GetMethod("TurboBust");
            mi.Invoke(obj, null);
        }
        catch (Exception)
        { }
    }
.

i는 carlibrary.dll을 만들고 하나의 폴더에 넣습니다.Ildasm 스크린 샷

carlibrary ildasm

모두 잘 작동합니다.나는이 주제에 관한 에 관한 을 가지고있다

  • 이것을 사용하는 것이 유용 할 때?
  • 가파이드를 사용하는 경우, 내가 사용하고자하는 자원에 대해 알지 못하는 것으로 생각되거나 그것에 관한 모든 것을 알지 못합니다 (이 경우,이 자원의 클래스 및 방법)?아직도 나에게 혼란스러워 - 답변을 찾으려고 - 결과 만 사용하는 방법.
도움이 되었습니까?

해결책

잘 자녀 수업이 있다고 상상해보십시오

ex dll a

공개 수업 학생 : 사람 {}

DLL B

공개 클래스 교사 : 사람 {}

이 DLL과 응용 프로그램에서 참조하는 공통 어셈블리에있을 수 있으므로 가상 메소드 등의 구현이 다른 반사를 사용하여 클래스 사람을 상속하는 모든 클래스를 모두로드 할 수 있습니다.

public static IEnumerable<Type> GetSubclassesForType(Type baseClassType)
{
    List<Type> types = new List<Type>();
    foreach (Assembly ass in AppDomain.CurrentDomain.GetAssemblies())
    {
       types.AddRange(ass.GetTypes().Where(type => type.IsSubclassOf(baseClassType)));
    }
    return types;
}

public static IEnumerable<Type> GetSubclassesForType(Assembly assembly, Type baseClassType)
{
    return from type in assembly.GetTypes() 
                        where type.IsSubclassOf(baseClassType)    
                        select type;
}
.

늦은 바인딩의 또 다른 사용은 코드의 일부가 포함 된 DLL을 복사하여 응용 프로그램을 업데이트하려는 경우 사용할 수 있다는 것입니다.이것은 빠른 여러 클라이언트 응용 프로그램을 업데이트하려는 경우 실제로 도움이 될 수 있습니다. (참고 : 늦은 바인딩 후 성능을 향상시킨 후 리플렉션의 결과를 캐시해야 함)

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top