Ecco un sottaceto piuttosto sgradevole che abbiamo trovato su un sito cliente. Il client ha circa 100 workstation, su cui abbiamo distribuito la versione 1.0.0 del nostro prodotto "MyApp".Cambio di interfaccia tra versioni - come gestire?
Ora, una delle cose che il prodotto fa è caricare un componente aggiuntivo (chiamalo "MyPlugIn", che prima cerca su un server centrale per vedere se c'è una versione più recente, e se è così copia quel file localmente, quindi carica il componente aggiuntivo utilizzando Assembly.Load
e invoca una determinata interfaccia nota. Funziona bene da diversi mesi
Quindi il client voleva installare v1.0.1 del nostro prodotto su alcuni macchine (ma non tutte) .Questo è venuto con una versione nuova e aggiornata di MyPlugIn.
Ma poi è arrivato il problema. C'è una DLL condivisa, a cui fa riferimento sia MyApp che MyPlugIn, chiamato MyDLL, che ha un metodo MyClass.MyMethod
. Tra la v1.0.0 e la v1.0.1, la firma di MyClass.MyMethod
è cambiata (è stato aggiunto un parametro). E ora la nuova versione del myplugin fa sì che le applicazioni client v1.0.0 di crash:
Metodo non trovato: MyClass.MyMethod (System.String)
Il client volutamente non vuole distribuire v1 .0.1 su tutte le stazioni client, poiché la correzione inclusa in v1.0.1 era necessaria solo per poche workstation e non è necessario eseguirla su tutti i client. Purtroppo, non stiamo ancora utilizzando ClickOnce o altre utilità di distribuzione di massa, quindi implementare v1.0.1 sarà un esercizio doloroso e altrimenti inutile.
C'è un modo per scrivere il codice in MyPlugin in modo che funzioni ugualmente bene, indipendentemente dal fatto che si tratti di MyDLL v1.0.0 o v1.0.1? Forse c'è un modo per sondare un'interfaccia prevista usando la riflessione per vedere se esiste, prima di chiamarla effettivamente?
MODIFICA: Vorrei anche menzionare: abbiamo alcune procedure di QA piuttosto strette. Dal momento che v1.0.1 è stato ufficialmente rilasciato da QA, non è consentito apportare modifiche a MyApp o MyDLL. L'unica libertà di movimento che abbiamo è quella di cambiare MyPlugin, che è un codice personalizzato scritto appositamente per questo cliente.
Perché non aggiungere nuovamente a MyDll il metodo previsto dalla vecchia versione del plug-in? Internamente questo metodo potrebbe chiamare la nuova versione del metodo che passa un valore predefinito per il nuovo parametro param. – Steve
@Steve - vedere la mia modifica - non è possibile apportare modifiche a MyDLL –
MyClass.MyMethod è statico? –