2009-08-17 7 views
4

Si je compile deux fois un projet C#, j'obtiendrai deux assemblages. Ces assemblages ne sont pas exactement les mêmes (en utilisant un diff binaire). Je peux penser à des raisons pour lesquelles c'est le cas, mais il reste que la source des deux assemblées est identique.Comment est-ce que je peux patcher des assemblys .NET?

Je m'intéresse à la création d'un correctif entre ces assemblages et à l'application du correctif sur une machine client.

Est-ce que quelqu'un connaît une bibliothèque (de préférence .NET) ou un outil avec lequel je peux créer et appliquer des correctifs?

Idéalement, il devrait également gérer de petits changements, comme changer les dépendances au niveau d'un projet ou peaufiner quelques lignes dans la source. Il ne doit pas être capable de faire face à des changements plus importants, parce que je suis heureux de remplacer les assemblages dans leur intégralité dans ce cas.

Mise à jour:

Je pense un peu plus fond pourrait aider à clarifier ce que je veux en venir. J'ai un serveur d'intégration continue qui construit mon application. Je change la version du fichier et de l'assemblage pour refléter le numéro de build et la version que je construis. J'aurais pu le faire différemment, mais c'est l'option que j'aime. Cela a pour effet que les références d'assemblage changent lorsque je crée mon application, mais je suis satisfait de cela. Je suis maintenant concerné par la distribution d'une mise à jour à une version précédemment publiée. Je construis des mises à jour en utilisant InstallShield. Les assemblys disponibles pour InstallShield sont réduits à de petits correctifs. Cela n'augmente pas beaucoup la taille de la mise à jour.

Mon application a quelques fichiers de données, qui sont essentiellement des archives cryptées contenant des assemblages. InstallShield n'a pas accès à ces assemblys ou ne comprend pas mes archives. Il ne sait pas comment le déchiffrer et l'extraire. J'ai écrit ma propre routine de correctif qui trouve les fichiers modifiés dans l'archive précédente et les remplace par la nouvelle version mise à jour. Fondamentalement, une stratégie de recherche et de remplacement.

L'archive contient une centaine (et une croissance) de ces assemblys et certains de ces assemblys contiennent des fichiers de données volumineux en tant que ressources. Ces assemblages dépendent d'assemblages faisant partie de l'application. Ils sont également compilés lors de la construction de l'intégration continue. Ne pas les compiler pendant la construction laissera de la place pour les problèmes de dépendances et je ne suis pas prêt à essayer de gérer cela. Chaque fois que je crée un patch, tous ces assemblages sont inclus. Je regarde maintenant les options pour diminuer la taille du patch en générant des patches pour ces assemblages.

+0

L'horodatage est inclus dans un assemblage compilé. c'est pourquoi cela change à chaque fois que vous compilez. – Cheeso

+1

En outre, pourquoi voudriez-vous patcher des assemblages pour de "petits changements" et pourquoi est-il correct de les remplacer pour "de plus grands changements"? Pourquoi ne pas simplement utiliser une procédure de mise à jour: remplacer l'assemblage. – Cheeso

+0

Hm, si la source est la même, pourquoi auriez-vous besoin de changer l'assemblage sur la machine du client? Assurez-vous simplement que le numéro de version reste le même (pas de "*" dans l'attribut AssemblyVersion!) Alors l'ancien "assembly" devrait aussi être utilisable ... – MartinStettner

Répondre

3

Ce n'est pas .net mais devrait être en mesure de générer un fichier de patch pour vous -

http://www.tibed.net/vpatch/

je l'utiliser pour les jeux et cartes E.T.C. mais il devrait fonctionner avec deux fichiers.

+0

Je vais jeter un coup d'oeil et voir si ça fait ce dont j'ai besoin. Merci! – Christo

+0

J'ai regardé vpatch. Cela fonctionne encore mieux que prévu et fonctionnera parfaitement. Merci encore! – Christo

12

Je vous recommande de remplacer vos assemblages. Patching a toujours été un peu problématique - au moins en comparaison avec le remplacement. Les fichiers d'assemblage ont tendance à être assez petits, donc les remplacer n'est généralement pas une tâche très importante.

Généralement, la raison pour laquelle les assemblages changent si la source est identique est généralement liée à l'un des éléments suivants. Votre projet peut avoir des modifications, mais plus probablement, l'un des assemblys référencés de l'assembly a changé. Dans ce cas, vous souhaiterez distribuer l'ensemble complet des assemblys, y compris l'assembly référencé, ou vous obtiendrez des problèmes de version et de casse sur les machines du client.

Créer une nouvelle installation est généralement beaucoup plus simple et plus sûr que d'essayer de réparer une machine en place.

+4

+1 pour un bon conseil judicieux. –

+1

Pourquoi ne pas le patcher? Si les références changeaient, cela pourrait avoir un petit impact, mais un correctif approprié transformerait l'assembly A en B et n'inclurait que les bits nécessaires pour changer les références d'assembly dans A. – Christo

+3

De nombreuses années à essayer de patcher des logiciels sur le terrain m'ont fatigué toute solution de correction. Mon entreprise et les fournisseurs que nous avons utilisés ont été dans cette voie, et à coup sûr, ils ont trouvé que c'était au mieux problématique. Cela fonctionne, la plupart du temps, mais quand il y a un problème, c'est horriblement difficile à corriger. Il est très difficile de faire tout ce qu'une installation correcte peut gérer à partir d'un patch, et la bande passante pour le téléchargement des mises à jour est bon marché. Patcher ne vaut tout simplement pas l'effort. –

Questions connexes