문제
현재 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 스크린 샷
모두 잘 작동합니다.나는이 주제에 관한 에 관한 을 가지고있다
- 이것을 사용하는 것이 유용 할 때?
- 가파이드를 사용하는 경우, 내가 사용하고자하는 자원에 대해 알지 못하는 것으로 생각되거나 그것에 관한 모든 것을 알지 못합니다 (이 경우,이 자원의 클래스 및 방법)?아직도 나에게 혼란스러워 - 답변을 찾으려고 - 결과 만 사용하는 방법.
해결책
잘 자녀 수업이 있다고 상상해보십시오
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을 복사하여 응용 프로그램을 업데이트하려는 경우 사용할 수 있다는 것입니다.이것은 빠른 여러 클라이언트 응용 프로그램을 업데이트하려는 경우 실제로 도움이 될 수 있습니다. (참고 : 늦은 바인딩 후 성능을 향상시킨 후 리플렉션의 결과를 캐시해야 함)
제휴하지 않습니다 StackOverflow