Quelles sont les différences entre AssemblyVersion, AssemblyFileVersion et AssemblyInformationalVersion?
Il y a trois version de l'assembly attributs. Quelles sont les différences? Est-ce ok si j'utilise AssemblyVersion
et ignorer le reste?
MSDN dit:
-
Spécifie la version de l'assemblée étant attribué.
-
Indique un compilateur d'utiliser un numéro de version Win32 de version de fichier de ressources. Le fichier Win32 version n'est pas nécessaire d'être le même que l'assemblée du numéro de version.
-
Définit d'autres informations de version pour un manifeste d'assembly.
C'est un suivi à Quelles sont les meilleures pratiques pour l'utilisation de l'Assemblage des Attributs?
Vous devez vous connecter pour publier un commentaire.
AssemblyVersion
Où d'autres assemblys de référence de votre assemblée sera look. Si ce nombre de changements, d'autres assemblées doivent mettre à jour leurs références à votre assemblée! Le
AssemblyVersion
est nécessaire.- Je utiliser le format: majeur.mineur. Cela aurait pour conséquence:
AssemblyFileVersion
Utilisé pour le déploiement. Vous pouvez augmenter ce nombre pour chaque déploiement. Il est utilisé par les programmes d'installation. Utilisez-le pour marquer les assemblées qui ont le même
AssemblyVersion
, mais sont générés à partir de différentes versions.Dans Windows, il peut être affiché dans les propriétés du fichier.
Si possible, qu'il soit généré par MSBuild. Le AssemblyFileVersion est facultatif. Si ce n'est pas donné, le AssemblyVersion est utilisé.
- Je utiliser le format: majeur.mineure.la révision.construire, où j'utilise révision pour la phase de développement (Alpha, Beta, RC et RTM), les service packs et les correctifs à chaud. Cela aurait pour conséquence:
AssemblyInformationalVersion
La version du Produit de l'assemblée. C'est la version que vous utilisez lorsque vous parlez à des clients ou pour les afficher sur votre site web. Cette version peut être une chaîne de caractères, comme " 1.0 Release Candidate'.
L'Analyse de Code va s'en plaindre (CA2243) -- signalé à Microsoft (pas fixe dans VS2013).
La
AssemblyInformationalVersion
est facultatif. Si ce n'est pas donné, le AssemblyFileVersion est utilisé.- Je utiliser le format: majeur.mineur [révision à la chaîne]. Cela aurait pour conséquence:
Application.ProductVersion
et lors de l'accèsAssemblyInformationalVersion
par la réflexion.major.minor[.build[.revision]]
et pasmajor.minor.revision.build
donc dans la réponse de la construction et des numéros de révision serait échangé si vous avez été en utilisant les propriétés de la classe ouSystem.Reflection.Assembly.GetExecutingAssembly().GetName().Version
pour détecter les construire et les numéros de révision.Version
classe, sauf si vous n'utilisez pas Microsoft les définitions, les autres utilisateurs de votre assemblée pourrait s'attendre. Le propos sate "Une différence dans le numéro de build représente une recompilation de la même source."AssemblyInformationalVersion
, si omis,AssemblyFileVersion
est utilisé. PuisAssemblyVersion
si les deux sont omis.La gestion des versions des assemblées .NET peut être une source de confusion perspective étant donné qu'il existe actuellement au moins trois façons de spécifier une version de votre assemblée.
Ici sont les trois principaux liés à la version de l'assemblée attributs:
Par convention, les quatre parties de la version sont appelés les Version Majeure, Version Mineure, Construire, et Révision.
La
AssemblyFileVersion
est destiné à identifier de manière unique une version de la assemblée individuelleTypiquement, vous allez définir manuellement la Majeure et la Mineure AssemblyFileVersion pour refléter la version de l'assemblée, puis incrémenter la construction et/ou la Révision à chaque fois que votre système de construction compile l'assemblée. Le AssemblyFileVersion devrait vous permettre d'identifier de manière unique une accumulation de l'assemblée, de sorte que vous pouvez l'utiliser comme un point de départ pour le débogage des problèmes.
Sur mon projet actuel, nous avons le serveur de build encoder la liste nombre de sources de notre référentiel de contrôle dans la construction et la Révision des pièces de la AssemblyFileVersion. Cela nous permet de mapper directement à partir d'un assembly à son code source, pour toute assemblée généré par le serveur de build (sans avoir à utiliser des étiquettes ou des branches dans le contrôle de code source, ou manuellement en gardant tous les enregistrements de versions).
Ce numéro de version est stockée dans la version Win32 de ressources et peut être vu lors de l'affichage de l'Explorateur Windows les pages de propriétés de l'assemblée.
Le CLR ne pas s'en soucier, ni examiner les AssemblyFileVersion.
La
AssemblyInformationalVersion
est destiné à représenter la version de votre produitLa AssemblyInformationalVersion est destiné à permettre cohérente de gestion des versions de la totalité du produit, qui peut consister en de nombreuses assemblées qui sont leur propre version, peut-être avec les différentes politiques de gestion des versions, et potentiellement développés par des équipes hétérogènes.
Le CLR ne pas s'en soucier, ni examiner les AssemblyInformationalVersion.
La
AssemblyVersion
est la seule version du CLR se soucie (mais il se soucie de l'ensemble de laAssemblyVersion
)La AssemblyVersion est utilisé par le CLR pour lier fortement nommé assemblées. Il est stocké dans le AssemblyDef manifeste des métadonnées de la table du construit de l'assemblée, et dans le AssemblyRef tableau de toute l'assemblée qui y fait référence.
C'est très important, car cela signifie que lorsque vous faites référence à un nommé fortement de l'assemblée, vous êtes étroitement lié à un AssemblyVersion de l'assemblée. L'ensemble de la AssemblyVersion doit être une correspondance exacte pour la liaison à réussir. Par exemple, si vous faites référence à la version 1.0.0.0 d'un nommé fortement de l'assemblée au moment de la construction, mais seulement la version 1.0.0.1 de cette assemblée est disponible au moment de l'exécution, la liaison échoue! (Vous serez alors obligé de contourner cela en utilisant De Liaison D'Assembly De Redirection.)
Confusion quant à savoir si l'ensemble de la
AssemblyVersion
doit correspondre. (Oui, c'est fait.)Il y a un peu de confusion autour de l'ensemble de la AssemblyVersion doit être une correspondance exacte pour un assemblage à être chargé. Certains gens sont sous la fausse conviction que seule la Majeure et la Mineure de la AssemblyVersion doivent correspondre pour que la liaison à réussir. C'est une hypothèse raisonnable, mais il est en fin de compte incorrect (comme de .NET 3.5), et il est trivial de vérifier votre version du CLR. Juste exécuter cet exemple de code.
Sur ma machine de la deuxième assemblée chargement échoue, et les deux dernières lignes de la fusion du journal qu'il soit parfaitement clair pourquoi:
Je pense que la source de cette confusion est probablement parce que Microsoft à l'origine prévu pour être un peu plus indulgent sur cette stricte correspondance de la pleine AssemblyVersion, par correspondance uniquement sur la Majeure et la Mineure de la version de pièces:
C'était le comportement de la Bêta 1 de l'1.0 CLR, cependant cette fonctionnalité a été supprimée avant la version 1.0, et n'a pas réussi à refaire surface dans .NET 2.0:
Que ce changement n'a pas encore été mis en œuvre, je pense qu'il est sûr de supposer que Microsoft est revenue sur cette intention, et c'est peut-être trop tard pour changer maintenant. J'ai essayé de chercher sur le web pour savoir ce qui s'est passé avec ces plans, mais je ne pouvais pas trouver toutes les réponses. J'ai toujours voulu aller au fond de lui.
Donc j'ai envoyé Jeff Richter et lui a demandé directement — j'ai pensé que si quelqu'un savait ce qui s'est passé, ce serait lui.
Il a répondu dans un délai de 12 heures, un samedi matin, pas moins, et a précisé que l' .NET 1.0 Beta 1 chargeur de ne mettre en œuvre cette "automatique roll-forward" mécanisme de la cueillette jusqu'à la dernière Construire et la Révision d'un assemblage, mais ce comportement a été repris avant .NET 1.0 fourni. Plus tard, il fut destiné à relancer ce, mais il ne l'a pas fait en avant de la CLR 2.0 livré. Puis vint Silverlight, qui a la priorité pour l'équipe CLR, afin que cette fonctionnalité a été retardé de plus. Dans l'intervalle, la plupart des gens qui étaient autour de dans le jours de CLR 1.0 Beta 1 ont depuis évolué, de sorte qu'il est peu probable que cela permettra de voir la lumière du jour, en dépit de tout le travail qui avait déjà été mis en elle.
Le comportement actuel, il semble, est là pour rester.
Il est également intéressant de noter à partir de ma discussion avec Jeff qui AssemblyFileVersion n'a été ajouté après la suppression de la ‘automatique roll-forward " mécanisme — parce que, après 1.0 Beta 1, toute modification de la AssemblyVersion est une modification importante pour vos clients, puis il y a eu nulle part pour stocker en toute sécurité votre numéro de build. AssemblyFileVersion est qu'un refuge sûr, comme il n'est jamais automatiquement examiné par le CLR. Peut-être que c'est plus clair de cette façon, avoir deux numéros de version, avec des significations, plutôt que d'essayer de faire que la séparation entre le Majeur/Mineur (la rupture) et de la création/Révision (sans rupture) des parties de la AssemblyVersion.
La ligne du bas: Réfléchir soigneusement lorsque vous modifiez votre
AssemblyVersion
La morale est que si vous expédiez des assemblées que les autres développeurs vont être de référencement, vous devez être extrêmement prudent quand vous faites (et ne le font pas) changer le AssemblyVersion de ces assemblées. Toute modification de la AssemblyVersion signifie que les développeurs d'applications doivent re-compiler à l'encontre de la nouvelle version (mise à jour de ces AssemblyRef entrées) ou utiliser de l'assemblée de liaison des redirections pour remplacer manuellement la liaison.
Il suffit de prendre un autre regard sur la version attributs sur mscorlib:
Noter que c'est la AssemblyFileVersion qui contient toutes les intéressantes informations de service (c'est la partie Révision de cette version qui vous indique ce Service Pack, vous êtes sur la), pendant ce temps la AssemblyVersion est fixé à un ennuyeux 2.0.0.0. Toute modification de la AssemblyVersion serait forcer .NET application référencement mscorlib.dll de re-compiler avec la nouvelle version!
AssemblyVersion
assez bien séjours à l'interne .NET, tandis queAssemblyFileVersion
est ce que Windows voit. Si vous accédez aux propriétés d'une séance de l'assemblée dans un répertoire et de passer à l'onglet version, laAssemblyFileVersion
est ce que vous verrez en haut. Si vous trier les fichiers selon la version, c'est ce qui est utilisé par l'Explorateur.La
AssemblyInformationalVersion
cartes à la "Version du Produit" et est destiné à être purement "humain-utilisé".AssemblyVersion
est certainement le plus important, mais je ne voudrais pas sauterAssemblyFileVersion
, soit. Si vous ne fournissez pasAssemblyInformationalVersion
, le compilateur ajoute pour vous en dépouiller de la "révision" pièce de votre numéro de version et quitter la major.mineure.construire.AssemblyInformationalVersion
etAssemblyFileVersion
sont affichés lorsque vous affichez la "Version" de l'information sur un fichier via l'Explorateur Windows en affichant les propriétés du fichier. Ces attributs réellement obtenir compilées dans unVERSION_INFO
ressource qui est créé par le compilateur.AssemblyInformationalVersion
est le "Produit" version de valeur.AssemblyFileVersion
est la version du Fichier de la valeur.La
AssemblyVersion
est spécifique .NET assemblées et est utilisé par la .NET de l'assemblée chargeur pour connaître la version d'un assemblage de charge/bind au moment de l'exécution.De ces, la seule qui soit absolument nécessaire par .NET est le
AssemblyVersion
attribut. Malheureusement, il peut aussi causer le plus de problèmes en cas de changement tort et à travers, surtout si vous êtes forts de nommage de vos assemblées.De garder cette question actuelle, il est important de souligner que
AssemblyInformationalVersion
est utilisé par NuGet et reflète la version de package y compris toute version pré-suffixe.Par exemple un AssemblyVersion de 1.0.3.* emballé avec la asp.net core dotnet-cli
Produit un paquet de la version 1.0.3-ic-7 que vous pouvez inspecter la réflexion à l'aide de:
Il est intéressant de noter quelques autres choses:
1) Comme indiqué dans l'Explorateur Windows boîte de dialogue Propriétés de l'assembly généré un fichier, il existe deux endroits appelés "version du Fichier". Celle que l'on voit dans l'en-tête de la boîte de dialogue affiche le AssemblyVersion, pas la AssemblyFileVersion.
Dans les Autres informations de version de l'article, il y a un autre élément appelé "Fichier" Version. C'est là que vous pouvez voir ce qui a été conclu que la AssemblyFileVersion.
2) AssemblyFileVersion est juste du texte brut. Il n'a pas à se conformer au schéma de numérotation des restrictions qui AssemblyVersion t (<build> < 65K, par exemple). Il peut être 3.2.<balise de version texte>.<datetime>, si vous le souhaitez. Votre système de construction devra remplir les jetons.
En outre, il n'est pas soumis au générique de remplacement qui AssemblyVersion est. Si vous venez d'avoir une valeur de "3.0.1.*" dans le AssemblyInfo.cs, c'est exactement ce qui s'affichera dans l'Autre version de l'information->Version de Fichier de l'élément.
3) je ne sais pas l'impact sur un programme d'installation de l'aide de quelque chose d'autre que numérique numéros de version de fichier, si.
Lors d'une assemblée s' AssemblyVersion est changé,
Si elle a de fortes nom, le référencement assemblées besoin d'être recompilées, sinon l'assemblée ne se charge pas!
Si elle n'a pas de nom, si ce n'est explicitement ajouté au fichier de projet, il ne sera pas copié dans le répertoire de sortie lors de la construction afin que vous pouvez manquer selon des assemblées, notamment après le nettoyage, le répertoire de sortie.