2009-04-30 3 views
4

Considérons deux .NET dll. Le premier, "application.dll" contient la logique métier principale et le code d'accès aux données. La seconde, "webservice.dll" se compose principalement de WebMethods qui lient des objets et des méthodes avec application.dll dans le but de fournir des appels webservice au code existant.Qu'est-ce qui casse une interface binaire (dll) .net

Quels changements (par exemple ajouter de nouvelles classes, ajouter un nouveau champ ou une nouvelle méthode à une classe existante, etc.) peuvent et ne peuvent pas être faits à application.dll sans nécessiter une recompilation de webservice.dll?

Répondre

3

La plupart des choses iront bien; certaines choses qui le casser:

  • Suppression * types qui sont utilisés (sauf si vous utilisez type expédition)
  • Supprimer les méthodes * qui sont utilisés (constructeur y compris)
  • Modification de la signature des méthodes (qui sont utilisés)
  • Modification des champs communs aux propriétés (qui sont utilisés)
  • Modification des équipements internes de sérialisation si sérialisation est utilisé
  • Ajout d'une méthode à une interface, dans laquelle le second dll a un type qui œuvre ments que l'interface
  • Ajout d'une méthode abstraite d'une classe de base qui est héritée de la seconde dll
  • Presque tout interne si la réflexion hacky est (ab) utilisé
  • Ajout de contraintes à un type générique/méthode
  • le marquage d'un type que sealed quand il a été hérité dans la seconde dll
  • Ajout d'un champ à un struct si l'appelant utilise plutôt que l'initialisation membre à membre l'initialisation du constructeur

(la suppression inclut la modification de l'accessibilité à quelque chose de non public)

+1

Toutes les modifications apportées aux interfaces seront brisées, n'est-ce pas? –

+0

J'ajoutais déjà des interfaces et des méthodes abstraites pendant que vous ajoutiez ce commentaire ;-p –

+0

Liste de recherche très complète. À votre santé! – SillyMonkey

1

Techniquement, le nom va le casser (nom et version et jeton de clé dans le cas d'assembiles nommés forts). Sinon, le framework va essayer pour charger et utiliser la DLL, et cela fonctionnera plus ou moins bien jusqu'à ce qu'il frappe un type différent ou une signature de méthode, un type manquant, etc. Mais attention, les noms réutilisés vont directement Retour à l'enfer DLL (ou les problèmes de celui-ci).

Je suggère d'en savoir plus sur assembly versioning pour avoir une idée comment résoudre ces problèmes.

+0

Dans ce cas, je préfère que ce soit cassé que chargé une version périmée;) – SillyMonkey

0

Vous pouvez apporter des modifications à application.dll sans avoir besoin de recompiler de webservice.dll tant que vous n'appelez pas les nouvelles classes, fonctions [ajoutées dans application.dll]. si vous voulez consommer l'un de vos changements application.dll dans webservice.dll, alors vous devez recompiler le webservice.dll

de cours, si vous modifiez la signature ou le niveau d'accès de l'une des méthodes ou propriétés dans l'application. dll qui sont utilisés par websrvice.dll, il va casser votre code dans webservice.

Questions connexes