В чем разница между AssemblyVersion, AssemblyFileVersion и AssemblyInformationalVersion?

Управление версиями сборок .net в .NET может сбивать с толку, учитывая, что dot-net в настоящее время существует .net-framework как минимум три способа указать dot-net версию для вашей сборки.

Вот .net три основных атрибута сборки, связанных attribute с версией:

// Assembly mscorlib, Version 2.0.0.0
[assembly: AssemblyFileVersion("2.0.50727.3521")]
[assembly: AssemblyInformationalVersion("2.0.50727.3521")]
[assembly: AssemblyVersion("2.0.0.0")]

По соглашению четыре attribute части версии называются Основная версия, Дополнительная версия, Сборка и .net Редакция.

AssemblyFileVersion предназначен для уникальной идентификации сборки отдельной сборки

Обычно вы вручную устанавливаете dotnet Major и Minor AssemblyFileVersion, чтобы dot-net отразить версию сборки, а .net-framework затем увеличиваете Build .net-framework и / или Revision каждый раз, когда dot-net ваша система сборки компилирует .net сборку. AssemblyFileVersion assemblies должна позволить вам однозначно .net идентифицировать сборку сборки, чтобы dot-net вы могли использовать ее attribute в качестве отправной точки attributes для отладки любых проблем.

В dotnet моем текущем проекте сервер .net-framework сборки кодирует номер списка assemblies изменений из нашего репозитория attribute системы управления версиями attributes в части сборки и версии AssemblyFileVersion. Это dot-net позволяет нам напрямую сопоставлять dot-net сборку с ее исходным кодом attributes для любой сборки, созданной dot-net сервером сборки (без необходимости .net использовать метки или ветки .net в системе управления версиями attributes или вручную сохранять какие-либо .net-framework записи о выпущенных версиях).

Этот .net-framework номер версии хранится в ресурсе dot-net версии Win32, и его можно attributes увидеть при просмотре страниц dot-net свойств сборки в проводнике .net Windows.

CLR не заботится о AssemblyFileVersion и не проверяет ее.

AssemblyInformationalVersion предназначен для представления версии всего вашего продукта

AssemblyInformationalVersion .net предназначена для обеспечения dotnet согласованного управления dot-net версиями всего продукта, который assemblies может состоять из множества attribute сборок с независимыми версиями, возможно, с attributes разными политиками управления attributes версиями и потенциально разрабатываемых dotnet разными группами.

«Например, версия dotnet 2.0 продукта может содержать assemblies несколько сборок; один из assemblies этих сборок помечены как версия .net 1.0, так как это новая сборка которые .net-framework не поставлялись в версии dotnet 1.0 тот же продукт. Обычно assemblies вы устанавливаете основные dotnet и второстепенные части этой dotnet версии номер для представления .net-framework общедоступной версии вашего .net-framework продукта. Затем вы увеличиваете части attribute сборки и ревизии каждый раз вы dot-net упаковываете полный продукт dotnet с все его сборки ». - Джеффри attribute Рихтер, [CLR через C# (второе dotnet издание)] стр. 57

CLR не заботится о AssemblyInformationalVersion и не проверяет ее.

AssemblyVersion - единственная версия, о которой заботится CLR (но она заботится обо всем AssemblyVersion)

AssemblyVersion attribute используется средой CLR для assemblies привязки к сборкам со строгими attributes именами. Он хранится в таблице attributes метаданных манифеста AssemblyDef dotnet построенной сборки и в таблице assemblies AssemblyRef любой сборки, которая dotnet ссылается на нее.

Это очень attributes важно, потому что это означает, что dotnet при ссылке на сборку со строгим .net именем вы жестко привязаны assemblies к определенной версии AssemblyVersion dot-net этой сборки. Для успешной assemblies привязки весь AssemblyVersion .net-framework должен точно соответствовать. Например, если .net-framework вы ссылаетесь на версию 1.0.0.0 assemblies сборки со строгим именем assemblies во время сборки, но во время attributes выполнения доступна только dot-net версия 1.0.0.1 этой сборки, привязка .net-framework завершится ошибкой! (Затем attribute вам придется обойти это с dot-net помощью Assembly Binding Redirection.)

Неясность относительно того, должен ли совпадать весь AssemblyVersion. (Да, это так.)

Существует небольшая .net-framework путаница в отношении того, должно dot-net ли AssemblyVersion полностью .net-framework совпадать для загрузки сборки. Некоторые .net-framework люди ошибочно полагают, что .net-framework только основная и второстепенная dotnet части AssemblyVersion должны attributes совпадать, чтобы привязка .net была успешной. Это разумное dot-net предположение, однако в конечном assemblies итоге оно неверно (начиная dotnet с .NET 3.5), и проверить dotnet это для вашей версии CLR .net несложно. Просто выполните attributes this sample code.

На моей машине вторая загрузка .net-framework сборки не выполняется, и attribute последние две строки журнала dot-net слияния ясно дают понять, почему:

.NET Framework Version: 2.0.50727.3521
---
Attempting to load assembly: Rhino.Mocks, Version=3.5.0.1337, Culture=neutral, PublicKeyToken=0b3305902db7183f
Successfully loaded assembly: Rhino.Mocks, Version=3.5.0.1337, Culture=neutral, PublicKeyToken=0b3305902db7183f
---
Attempting to load assembly: Rhino.Mocks, Version=3.5.0.1336, Culture=neutral, PublicKeyToken=0b3305902db7183f
Assembly binding for  failed:
System.IO.FileLoadException: Could not load file or assembly 'Rhino.Mocks, Version=3.5.0.1336, Culture=neutral, 
PublicKeyToken=0b3305902db7183f' or one of its dependencies. The located assembly's manifest definition 
does not match the assembly reference. (Exception from HRESULT: 0x80131040)
File name: 'Rhino.Mocks, Version=3.5.0.1336, Culture=neutral, PublicKeyToken=0b3305902db7183f'

=== Pre-bind state information ===
LOG: User = Phoenix\Dani
LOG: DisplayName = Rhino.Mocks, Version=3.5.0.1336, Culture=neutral, PublicKeyToken=0b3305902db7183f
 (Fully-specified)
LOG: Appbase = [...]
LOG: Initial PrivatePath = NULL
Calling assembly : AssemblyBinding, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null.
===
LOG: This bind starts in default load context.
LOG: No application configuration file found.
LOG: Using machine configuration file from C:\Windows\Microsoft.NET\Framework64\v2.0.50727\config\machine.config.
LOG: Post-policy reference: Rhino.Mocks, Version=3.5.0.1336, Culture=neutral, PublicKeyToken=0b3305902db7183f
LOG: Attempting download of new URL [...].
WRN: Comparing the assembly name resulted in the mismatch: Revision Number
ERR: Failed to complete setup of assembly (hr = 0x80131040). Probing terminated.

Я .net думаю, что причиной этой .net путаницы, вероятно, является attributes то, что Microsoft изначально assemblies намеревалась немного более .net снисходительно относиться .net к этому строгому сопоставлению dot-net полной версии AssemblyVersion, сопоставляя assemblies только части основной и второстепенной .net-framework версии:

«При загрузке сборки .net CLR автоматически найдет dot-net последнюю установлена ​​сервисная attribute версия, которая совпадает .net-framework с основной / дополнительной dot-net версией требуется сборка .net-framework ». - Джеффри dotnet Рихтер, [CLR через C# (второе attributes издание)] стр. 56

Так было .net в бета-версии 1 среды CLR attribute 1.0, однако эта функция была assemblies удалена до выпуска версии .net-framework 1.0 и не удалось повторно attributes реализовать в .NET 2.0:

«Примечание. Я dotnet только что описал, как вы следует dotnet думать о номерах версий. К attributes сожалению, CLR не обрабатывает номера assemblies версий таким образом. [В .net-framework .NET 2.0], среда CLR рассматривает dotnet номер версии как непрозрачное dotnet значение, и если сборка зависит .net от версии 1.2.3.4 другого сборка, CLR attribute пытается загрузить только dotnet версия 1.2.3.4 (если нет dot-net привязки перенаправление attribute на месте). Тем не мение, Microsoft планирует изменить Загрузчик CLR в будущей версии, поэтому что он загружает последние сборка / ревизия для данного основного / второстепенного версия сборки. Например, в dotnet будущей версии CLR, если загрузчик attribute пытается найти версию 1.2.3.4 assemblies сборки и существует версия .net 1.2.5.0, загрузчик автоматически attribute подберет последнюю сервисная dotnet версия. Это будет очень приветствуем .net-framework изменение загрузчика CLR .net-framework - я ибо нельзя ждать ». - Джеффри .net Рихтер, [CLR через C# (второе dotnet издание)] стр. 164 (выделение мой)

Поскольку .net это изменение до сих пор .net-framework не реализовано, я думаю, можно dotnet с уверенностью предположить, что .net-framework Microsoft отступила от этого attributes намерения, и, возможно, уже dot-net слишком поздно менять это assemblies сейчас. Я попытался поискать dotnet в Интернете, что случилось attribute с этими планами, но не смог dotnet найти никаких ответов. Я attribute все еще хотел разобраться assemblies в этом.

Я написал Джеффу Рихтеру dotnet по электронной почте и спросил dotnet его напрямую - я подумал, что attributes если кто-нибудь и знает, что .net-framework произошло, то это он.

Он ответил attribute в течение 12 часов, не ранее .net субботнего утра, и пояснил, что attributes загрузчик .NET 1.0 Beta 1 dotnet действительно реализовал dot-net этот механизм «автоматического attributes отката вперед» для получения dot-net последней доступной сборки dotnet и версии сборки, но это поведение .net было отменено до поставки dotnet .NET 1.0. Позже было задумано .net-framework возродить это, но оно не assemblies вошло до выпуска CLR 2.0. Затем dotnet появился Silverlight, который assemblies стал приоритетом для команды dot-net CLR, поэтому эта функциональность attributes была отложена еще больше. Между attribute тем, большинство людей, которые attributes были во времена CLR 1.0 Beta .net-framework 1, с тех пор ушли, поэтому dotnet маловероятно, что это увидит attributes свет, несмотря на всю тяжелую dot-net работу, которая уже была .net вложена в нее.

Похоже, что .net нынешнее поведение сохранится.

Из attributes моего обсуждения с Джеффом .net-framework также стоит отметить, что assemblies AssemblyFileVersion была dot-net добавлена ​​только после assemblies удаления механизма «автоматического attributes повтора транзакций», потому assemblies что после 1.0 Beta 1 любое dotnet изменение AssemblyVersion .net было критическим изменением .net для ваших клиентов, тогда dot-net было негде безопасно хранить dotnet ваш номер сборки. AssemblyFileVersion .net - это безопасное убежище, поскольку dotnet оно никогда автоматически dot-net не проверяется средой CLR. Может assemblies быть, так будет понятнее, имея assemblies два отдельных номера версии .net с разными значениями, вместо attributes того, чтобы пытаться сделать attribute это разделение между основной dot-net / второстепенной (нарушающей) и dot-net сборкой / редакцией (неразрывной) частями dotnet AssemblyVersion.

Итог: внимательно подумайте, когда вы изменяете свой AssemblyVersion

Мораль заключается assemblies в том, что если вы отправляете dotnet сборки, на которые будут attribute ссылаться другие разработчики, вам attribute нужно быть предельно осторожным, когда .net вы изменяете (и не изменяете) AssemblyVersion attributes этих сборок. Любые изменения .net-framework AssemblyVersion будут означать, что attribute разработчикам приложений dotnet придется либо повторно компилировать .net новую версию (чтобы обновить attributes эти записи AssemblyRef), либо .net-framework использовать перенаправления attributes привязки сборки, чтобы вручную attribute переопределить привязку.

  • Не изменяйте AssemblyVersion для служебного выпуска, который должен быть обратно совместимым.
  • Обязательно измените AssemblyVersion для выпуска, в котором, как вы знаете, есть критические изменения.

Взгляните .net-framework еще раз на атрибуты версии assemblies в mscorlib:

// Assembly mscorlib, Version 2.0.0.0
[assembly: AssemblyFileVersion("2.0.50727.3521")]
[assembly: AssemblyInformationalVersion("2.0.50727.3521")]
[assembly: AssemblyVersion("2.0.0.0")]

Обратите внимание, что assemblies именно AssemblyFileVersion .net содержит всю интересную информацию dotnet об обслуживании (именно часть .net-framework Revision этой версии сообщает, какой dotnet у вас пакет обновления), в assemblies то время как AssemblyVersion dotnet исправлена ​​на скучной старой .net версии 2.0.0.0. Любое изменение assemblies AssemblyVersion заставит dot-net каждое приложение .NET, ссылающееся assemblies на mscorlib.dll, перекомпилировать attributes для новой версии!

.net

assemblies

attributes

2022-11-21T06:56:51+00:00