Esecuzione di codice di importazione salvato in file esterni

di il
4 risposte

Esecuzione di codice di importazione salvato in file esterni

Salve ho questa problematica
il mio software deve importare dei dati da differenti file di testo con strutture diverse ed archiviare i campi di mio interesse in un tabella mysql.
Ho creato degli importatori con funzioni salvate in classi che carico dal programma e funziona tutto.
Ovviamente se cambia la struttura di un file testo, devo aggiornare l'importatore e ricompilare l'exe.
in qui no problem.
Ovviamente devo redistribuire l'intero eseguibile aggiornato.

Io ho un altro software che fa una procedura simile e per questo viene distribuito solo l'aggiornamento dell'importatore, quindi il prg carica il codice di importazione dal file esterno e svolge il suo compito.

Vorrei sapere qual è la funzionalità che dovrei seguire per poter realizzare una procedura del genere.
Qualcuno mi parlava di scripting, ma non so di cosa si tratti. L'importante che gli importatori siano in file esterni al prg.
Grazie 1000 anticipatamente.

4 Risposte

  • Re: Esecuzione di codice di importazione salvato in file esterni

    Da qualunque programma .NET, puoi importare assembly esterni (ad esempio, una Class Library sottoforma di DLL) usando funzionalità specifiche come le classi di System.Reflection, ad esempio .

    Questo presuppone ovviamente che nella libreria specificata sia stato scritto e compilato il codice che implementa il tipo con la logica di importazione a cui fare riferimento. Ciò garantisce la libertà di sostituire questa libreria in modo separato dall'eseguibile, anche se è sempre necessario passare da una fase di "build" per poterla creare.

    Potremmo considerare questo approccio come un esempio di plug-in per l'applicazione.

    Per eseguire codice dinamicamente invece, occorre coinvolgere (appunto) la programmazione dinamica in .NET, ovvero quelle classi che sono in grado di compilare codice "al volo", magari contenuto in un file sorgente o in una risorsa che può essere modificata, generando in memoria nel runtime i tipi corrispondenti, che possono successivamente essere utilizzati come qualsiasi altro oggetto, invocandone i metodi specifici.

    Queste opportunità fanno uso del DLR (Dynamic Language Runtime), una parte del framework .NET appositamente progettata per forme di programmazione basate su "late binding", ovvero su oggetti (tendenzialmente di tipo dynamic o implementati in specifiche librerie) che rappresentano oggetti e metodi da invocare che il compilatore ignora in fase di build e, solo a runtime appunto, vengono "collegati" a oggetti veri e propri il cui codice dipende dalla fonte da cui hanno origine i tipi corrispondenti, codificati usando le classi indicate sopra, oppure usando uno dei tanti runtime esistenti che supportano linguaggi di scripting, ad esempio IronPython.

    Il concetto in breve è che vengono creati oggetti e invocati metodi scritti in C# o in linguaggi diversi, senza che il compilatore metta becco, e solo a runtime questi tipi vengono creati esattamente come ci si aspetta, compilando al volo codice C# contenuto in file di testo o altra risorsa, o usando una libreria come quella di IronPython che svolge la stessa funzione ma interagendo con altri "motori" e linguaggi differenti.

    Fai una ricerca usando le parole chiave indicate sopra e troverai numerosi esempi di come realizzare questa tipologia di architetture in modo semplice.

    Se invece la struttura deve farsi più complessa, ad esempio emerge la necessità di definire uno o più "importatori", consentire una loro presentazione e scelta di quale utilizzare, andare a ricercarli all'interno di un folder, in breve se nascono altre esigenze di contorno, meglio allora dotarsi di librerie appositamente progettate per architetture strutturate a plugin vere e proprie, che danno qualche servizio in più.

    Ciao!
  • Re: Esecuzione di codice di importazione salvato in file esterni

    Intanto grazie per la risposta.
    Nel mio caso dovrebbe essere abbastanza semplice.
    Se cambiano le colonne del txt, cambio il codice nell'importatore, ma poi compilo io il file e lo distribuisco.
    Era solo per snellire gli aggiornamenti senza ricompilare l'intero software.
    ora cercerò come hai detto tu perchè non mi ci sono mai cimentato.
    L'unica cosa che la classe interna andava a caricare delle public per aprire il database mysql e quindi creando class library esterne spero possa passare ad esse dei parametri del prg.
  • Re: Esecuzione di codice di importazione salvato in file esterni

    ribelle ha scritto:


    Se cambiano le colonne del txt, cambio il codice nell'importatore, ma poi compilo io il file e lo distribuisco.
    Era solo per snellire gli aggiornamenti senza ricompilare l'intero software.
    Ok, quindi stai favorendo la scelta di usare una Class Library in cui implementare il codice specifico dell'importazione, in modo da tenerlo semplicemente separato da quello dell'eseguibile, e potendo così agevolmente copiare una nuova DLL al posto della precedente quando occorre aggiornare solo l'importazione, evitando di sostuire tutti gli altri file.

    ribelle ha scritto:


    L'unica cosa che la classe interna andava a caricare delle public per aprire il database mysql e quindi creando class library esterne spero possa passare ad esse dei parametri del prg.
    Non so cosa intendi per "caricare delle public", ad ogni modo ti basta sapere che tramite Reflection tu puoi fare tutto ciò che il runtime fa all'avvio dell'applicazione, solo on-demand e in fase di esecuzione.

    Se hai una classe che implementa l'esportazione, puoi creare una istanza di quell'oggetto e chiamarne tutti i metodi che vuoi, passando al costruttore o ad uno qualsiasi dei suoi metodi tutti i parametri che vuoi.

    Io comunque consiglio di tenere le due implementazioni il più separate e indipendenti possibile, ossia eviterei di produrre oggetti noti a entrambe le classi, quella del programma principale che invoca quella esterna una volta caricata, e di scambiarli o restituirli... in poche parole, passerei parametri che appartengano ai tipi di base del .NET Framework, o un classico oggetto POCO, magari addirittura in formato JSON, così da non avere istanze che viaggiano da un contesto (quello dell'applicazione principale) all'altro (quello in cui viene caricata la DLL), a meno che non sia lo stesso contesto (quindi senza creare un AppDomain separato).

    Ciao!
  • Re: Esecuzione di codice di importazione salvato in file esterni

    "Ovviamente devo redistribuire l'intero eseguibile aggiornato." , forse era scontato ma potresti utilizzare clickonce https://docs.microsoft.com/it-it/visualstudio/deployment/clickonce-security-and-deployment?view=vs-2022
Devi accedere o registrarti per scrivere nel forum
4 risposte