Visualizzazione dei risultati da 1 a 6 su 6
  1. #1

    [C#] Utilizzare le classi in modo dinamico

    Buongiorno,

    mi sono trovato nella condizione di dover importare e usare dinamicamente una libreria o classe. Il mio problema è che l'utente dovrebbe scegliere la classe ( o libreria) presente su disco, e poi può creare oggetti utilizzando questa libreria. E' ovvio che l'oggetto creato per forza di cose erediterà da una classe già presente nel programma.... vediamo se riesco a spiegarmi meglio:

    Questa è una definizione generica della mia classe:

    virtual leggi();
    virtual scrivi();
    virtual elabora();

    (è solo un esempio)

    ogni classe che andrò a pescare da discofisso utilizza questa interfaccia, perciò avrà i metodi leggi, scrivi, elabora. Il casino però è come importare in modo dinamico questa classe.... sapete come si fa?
    Programmazione .NET
    http://www.samueletosatto.tk

  2. #2
    Devi usare la reflection.
    Amaro C++, il gusto pieno dell'undefined behavior.

  3. #3
    Ok, so cos'è la reflection, ma non credo che risolva il nocciolo del mio problema. La parte più difficile del mio problema è importare dinamicamente una libreria nella mia applicazione... vediamo se riesco a spiegarmi meglio...

    allora pensa a un compilatore. Ogni volta che viene prodotta una nuova macchina virtuale, l'azienda che produce il software mette a disposizione un link, dal quale l'utente si scarica la nuova libreria. L'utente nell'applicazione potrà scegliere se utilizzare "compiler1.dll" o "compiler2.dll" eccetera... tanto tutte le dll hanno i metodi "compila()", poi "getError()" eccetera.

    Oppure pensa ad un broswer. Ogni tanto vengono prodotti nuovi plug-in, che immagino siano dll o ocx, no? o simili. Il broswer deve poter importare quelle nuove librerie che sono state create dopo quella versione del broswer ( e mai più i produttori del broswer faranno una versione del broswer per ogni plugin che viene progettato), così ammettendo che tutti i plug-in come flash abbiano un metodo (getFile()) dove leggere i propri script, animazioni eccetera, poi un execute() per eseguire, stop() refresh() eccetera (sto sparando a caso).

    Perciò in sostanza, l'eseguibile deve importare dinamicamente un numero dinamico di librerie presenti su disco... e ovviamente crearne istanze.

    Io vorrei poter fare una cosa del tipo:

    percorsolibreria= FileDialog.show();
    mialibreria = using(percorsolibreria);

    quello che ho postato ovviamente non è C#, è uno pseudocodice, per spiegarmi insomma... Esiste qualcosa del genere?
    Programmazione .NET
    http://www.samueletosatto.tk

  4. #4
    È esattamente quello che ti ho detto di fare con la reflection: con la reflection carichi il plug-in in memoria (tramite il metodo Assembly.Load, mi pare) e invochi dinamicamente i metodi che ti interessano. Sta tutto spiegato nel link che ho postato prima.
    Amaro C++, il gusto pieno dell'undefined behavior.

  5. #5

    Creare classi dinamiche

    Ok, perfetto. Sono giunto alla conclusione che cercavo e la rendo pubblica, ringraziando MItaly.

    Allora, vi dico come ho risolto il problema. Ho creato la classe astratta che mi serve poi per fare un cast dell'oggetto che andrò a generare. Mettiamo che devo lavorare su degli oggetti su cui posso fare operazioni di lettura e scrittura.

    public abstract interfaccia{
    public abstract object lettura();
    public abstract void scrittura(object s);
    }

    questa è la mia interfaccia. Mettiamo che si chiami interfaccia dll ( è una libreira di classi).

    Ora vado a scrivere le mie varie classi nelle librerie che mi servono. Poniamo che creiamo una libreria dove faccio le operazioni di lettura/scrittura su un file.

    using LibreriaInterfacce; //uso la libreria che contiene la mia interfaccia

    namespace MieClassi
    {
    public class SuFile : Interfaccia
    {
    override public void scrittura(object s)
    {
    //....
    }
    override public object lettura()
    {
    //....
    }
    }
    }

    ora ci manca l'applicazione. Bene, con il metodo
    Assembly a = Assembly.LoadFile("C:\percorso\\MieClassi.dll");
    prendo la mia libreria, enlla quale tengo le varie classi (potrei sceglierne dinamicamente qualsiasi altra).
    poi occorre prendere il tipo dal quale istanzieremo il nostro oggetto
    Type t = a.GetType("MieClassi.Class1");
    Quindi istanziarlo
    MyInt m = (MyInt)Activator.CreateInstance(t);
    (MyInt è l'interfaccia che specifica l'oggetto generico che legge e scrive)
    Quindi... possiamo usare l'oggetto
    Object o = m.read();

    ok, ora il nostro oggetto potrà leggere e scrivere su file, importando la libreria giusta e aprendo il tipo giusto, potremmo leggere e scrivere a video, oppure su qualche altro dispositivo, ma il tutto dinamicamente, sarà l'utente a scegliere. L'utente senza reinstallare l'applicazione potrebbe scaricarsi la libreria adatta per fare quello che vuole.

    Ovviamente questo è un esempio un po' sciocco, ma ci permette di realizzare grandi cose ...
    Programmazione .NET
    http://www.samueletosatto.tk

  6. #6
    Utente di HTML.it L'avatar di Stoicenko
    Registrato dal
    Feb 2004
    Messaggi
    2,254
    Attenzione: se il metodo "Metodo1" è dichiarato in un'interfaccia e nella classe viene implementato non va utilizzata la parola "override" perchè inutile in quanto un'interfaccia non può avere implementazioni (quindi l'override de che?)

Permessi di invio

  • Non puoi inserire discussioni
  • Non puoi inserire repliche
  • Non puoi inserire allegati
  • Non puoi modificare i tuoi messaggi
  •  
Powered by vBulletin® Version 4.2.1
Copyright © 2025 vBulletin Solutions, Inc. All rights reserved.