Question

Actuellement, j'essaie de comprendre certains aspects de la programmation en C#.Maintenant j'apprends LateBinding.Je comprends comment créer un programme simple comme celui ci-dessous.

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)
        { }
    }

J'ai également créé CarLibrary.dll et l'ai placé dans un dossier.Capture d'écran d'ILDASM

CarLibrary ILDASM

Tout fonctionne bien.j'ai juste un quelques questions concernant ce sujet

  • Quand est-ce utile de l'utiliser ?
  • Si j'utilise LateBinding, est-ce supposé que je ne connais rien des ressources que je veux utiliser ou que je sais tout à ce sujet (dans ce cas, pourquoi je ne peux tout simplement pas écrire de programme de manière normale, si je connais toutes les classes et méthodes) de cette ressource) ?C'est encore un peu déroutant pour moi - essayez de trouver la réponse - résultat uniquement comment l'utiliser.
Était-ce utile?

La solution

Eh bien, imaginez que vous ayez des cours pour enfants

ex Dll A

Étudiant en classe publique :Personne { }

DllB

Professeur de classe publique :Personne { }

La Personne peut être dans un assembly commun référencé par ces dll et votre application, ayant ainsi différentes implémentations d'une méthode virtuelle etc.En utilisant la réflexion, vous pouvez charger toutes les classes qui héritent de la classe Person.

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;
}

Une autre utilisation de Late Binding est qu'il peut être utilisé si vous souhaitez mettre à jour votre application en copiant uniquement la DLL qui contient une partie de votre code.Cela peut vraiment aider lorsque vous souhaitez mettre à jour rapidement plusieurs applications clientes. (Remarque :vous devez également mettre en cache les résultats de la réflexion après la liaison tardive pour augmenter les performances)

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top