Domanda

Attualmente cerco di capire alcuni aspetti riguardanti la programmazione in C #.Ora sto imparando LateBinding.Capisco come creare un semplice programma come quello qui sotto.

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

Ho anche creato carlibrary.dll e mettilo in una cartella.Screenshot di ildilasmo

Carlibrary illdasm

Tutto funziona bene.Ho solo un Poche domande per quanto riguarda questo argomento

    .
  • Quando è utile usare questo?
  • Se uso la fissaggio è che dovrebbe non sapere nulla della risorsa che voglio usare o so tutto a riguardo (in questo caso perché non riesco a scrivere il programma in modo normale, se so ogniclasse e metodo da questa risorsa)?È ancora un po 'confuso per me - prova a trovare la risposta - Risultato solo come usare.
È stato utile?

Soluzione

Beh, immagina di avere alcune lezioni di bambini

ex dll a

Studente di classe pubblica: persona {}

DLL B

Insegnante di classe pubblica: persona {}

La persona può essere in un assemblaggio comune referenziato da queste DLL e dalla tua applicazione, avendo così diverse implementazioni di un metodo virtuale, ecc. Utilizzando la riflessione È possibile caricare tutte le classi che ereditano dalla persona.

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

Un altro uso del legame tardivo è che può essere utilizzato se si desidera aggiornare la tua applicazione solo copiando la DLL che contiene parte del tuo codice.Questo può davvero aiutare quando si desidera aggiornare rapidamente più applicazioni client. (Nota: dovresti anche cache i risultati della riflessione dopo il legame tardivo per aumentare le prestazioni)

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top