2014-04-12 6 views
5

L'applicazione My C# server.exe è fondamentale per le operazioni aziendali e deve essere eseguita senza interruzioni 24 ore su 24, 7 giorni su 7. Il codice è solido, ma una cosa fuori dal mio controllo è la scarsa qualità dei feed di dati in ingresso generati da terze parti. Io occasionalmente ricevere feed di dati che contengono anomalie nel qual caso deve:Come posso caricare una parte della mia app C# in modo dinamico senza riavvio dell'app?

  • aggiornamento del codice di trasformazione degli alimenti all'interno server.exe per accogliere l'anomalia
  • ricompilazione
  • riavvio server.exe utilizzando il nuovo codice e consentire la sintatticamente mangimi viziata da lavorare

l'intero processo di solito richiede meno di un paio di minuti, ma il riavvio server.exe provoca l'azzeramento di alcune informazioni di stato non critiche e peggio, provoca una perturbazione di processi esterni che dipendono da server.exe.

Il mio obiettivo: isolare il codice trasformazione degli alimenti in una DLL separata il cui contenuto può essere aggiornato senza riavviare server.exe. Come posso fare questo?

Permettetemi di spiegare ciò che ho fatto finora prima di scrivere questo post sul forum: interfaccia processore

Il feed è stato spostato in un nuovo gruppo chiamato common.dll. L'interfaccia simile a questa:

public interface IFeedProcessor{ 
    bool ProcessFeed(String filePath); //returns false on failure, true on success 
} 

Server.exe ora fa riferimento common.dll.

Gli stessi processori di alimentazione sono stati spostati in un nuovo assieme denominato feedProcessors.dll. Le implementazioni sono qualcosa del tipo:

internal class FeedProcessor1:IFeedProcessor{ 
    public FeedProcessor1(){} 
    bool ProcessFeed(String filePath){/*implementation*/return true;} 
} 

internal class FeedProcessor2:IFeedProcessor{ 
    public FeedProcessor2(){} 
    public bool ProcessFeed(String filePath){/*implementation*/return true;} 
} 

[... and so on...] 

feedProcessors.dll contiene anche una classe denominata FeedProcessorUtils che viene utilizzato per creare una specifica processore di alimentazione sulla base di alcuni input di configurazione. Assomiglia a questo:

public class FeedProcessorUtils{ 
    public static void CreateFeedProcessor(int feedType /*and other configuration params*/){ 
     switch(feedType){ 
      case 1:return new FeedProcessor1(); 
      case 2:return new FeedProcessor2(); 
      default: throw new ApplicationException("Unhandled feedType: "+feedType); 
     } 
    } 
} 

Tutto funziona come prima ma ovviamente non risolve il mio problema di caricamento dinamico; Se ho aggiornato feedProcessors.dll con un nuovo codice e lo ho copiato sul server di produzione, non riesco a farlo perché il file è in uso. Nessuna sorpresa lì. Quindi qual è la soluzione?

Idealmente, voglio essere in grado di copiare un feedProcessors.dll aggiornato sul server di produzione senza un errore di file in uso e senza riavviare server.exe. Quindi, la volta successiva che server.exe effettua una chiamata a FeedProcessorUtils.CreateFeedProcessor(), verrà eseguito dalla mia DLL modificata anziché anziché vecchia.

Da dove iniziare?

+1

Stai cercando [MEF] (http://msdn.microsoft.com/en-us/library/dd460648 (v = vs.110) .aspx) –

risposta

3

si desidera utilizzare le assemblee di copie shadow per la DLL caricata in modo dinamico http://msdn.microsoft.com/en-us/library/ms404279(v=vs.110).aspx

+0

Interessante. Grazie. Diciamo che uso Assembly.Load (byte []) per caricare dinamicamente il mio assembly. Ho raccolto da altri post SO che una volta caricato, non posso scaricarlo senza uccidere l'intero AppDomain, che nel mio caso non è praticabile. Quindi stai dicendo che se il mio programma determina che 'feedProcessor.dll' è fuori data che posso effettuare ** successive ** chiamate a Assembly.Load()? Cosa devo fare per la versione precedentemente caricata? Devo annullare il riferimento ad esso? Non c'è una funzione Dispose(). Creerò una perdita di memoria? –

Problemi correlati