2009-04-20 18 views
7

Quali modifiche a un assembly con nome sicuro richiedono una modifica in AssemblyVersionAttribute? Chiaramente, cambiare la API pubblica in un modo che potrebbe richiedere a un client di dover apportare una modifica del codice richiede un aumento di AssemblyVersion. Ma che dire delle modifiche all'API pubblica che non richiedono modifiche al codice nel client? Ad esempio:.NET: rispetto a AssemblyVersion, cosa definisce la compatibilità binaria?

  • l'aggiunta di una classe pubblica o di un'interfaccia?
  • l'aggiunta di un membro pubblico a una classe o un'interfaccia pubblica? (MODIFICA: drscroogemcduck indica correttamente in basso che l'aggiunta di un membro a un'interfaccia farebbe affluire tutti gli implementatori.Splendimi.)
  • un aumento della visibilità di un membro della classe?

Deve esserci una documentazione definitiva di questo da qualche parte su MSDN (o, conoscendo MS, su alcuni blog personali di MSSE). Ma semplicemente non riesco a trovarlo. Per favore aiuto!

risposta

4

È piuttosto semplice ... finché i tipi rimangono invariati (nel loro layout pubblico o protetto) e le firme dei metodi non vengono modificate (l'aggiunta di metodi o tipi va bene), il JIT dovrebbe essere in grado di collegare la DLL bene .

Detto questo, penso che anche se si fa lavoro che non dovrebbe farlo. Crea una nuova versione e usa un criterio per mappare la vecchia versione a quella nuova, se necessario. Altrimenti ti ritroveresti subito al diavolo della DLL ... e sono abbastanza sicuro che non lo vuoi.

+0

Due domande: * mi potete puntare alla documentazione - ufficiale o altrimenti - sulla vostra prima dichiarazione? * ti dispiacerebbe elaborare la tua seconda affermazione? In questo caso clinico, voglio aumentare la visibilità, dall'interno al pubblico, del ctor di una classe pubblica. Non mi è chiaro come ciò possa portare (all'inferno della versione GAC di) DLL. – cero

+0

Primo: dovrei cercarlo. Fondamentalmente, il JIT compila i metodi il più tardi possibile. L'associazione finale si verifica solo quando la JIT compila il metodo, quindi se il metodo è lì e corrisponde alla firma, funzionerà - questa è la mia esperienza. L'aggiunta di metodi alle interfacce pubbliche non sarebbe comunque una buona idea, dal momento che ciò potrebbe portare a metodi mancanti. – Lucero

+0

Per quanto riguarda la seconda affermazione, la modifica del codice e l'eliminazione dell'identità dell'assembly possono comportare comportamenti diversi. Ad esempio, quando si esegue il reflection, si specifica se si desidera trovare membri privati ​​o pubblici. Se si utilizza solo l'associazione "privata", non troverà più il ctor (nel tuo caso) e l'utente otterrà un messaggio di errore anche se lui (e il runtime) pensa che sia la stessa versione ...e può confondere il runtime se anche l'assembly era nel GAC. Non farlo – Lucero

1

l'aggiunta di metodi a un'interfaccia non dovrebbe essere soddisfacente perché i vecchi provider non implementeranno i nuovi metodi.

+0

Buon punto. Modifica post originale. :) – cero

1

Microsoft aggiunge nuovi metodi/classi nelle librerie .NET nelle versioni del service pack senza modificare AssemblyVersion (ancora 2.0.0.0/3.0.0.0). Microsoft cambia solo AssemblyFileVersion. Ad esempio, in .NET 2.0 SP1 è stata aggiunta la struttura DateTimeOffset.

Questa pratica dovrebbe essere consigliata a Microsoft in quanto Microsoft? È confuso.

Problemi correlati