2008-09-15 8 views
736

Имеются три атрибута сборки. Каковы различия? Это нормально, если я использую AssemblyVersion и игнорировать остальные?Каковы различия между AssemblyVersion, AssemblyFileVersion и AssemblyInformationalVersion?


MSDN говорит:

  • AssemblyVersion:

    Указывает версию сборки, приписываемых.

  • AssemblyFileVersion:

    инструктирует компилятор использовать определенный номер версии для Win32 версии файла ресурса. Версия версии Win32 не обязана быть такой же, как номер версии сборки.

  • AssemblyInformationalVersion:

    Определяет дополнительную информацию о версии для манифеста сборки.


Это следовать до What are the best practices for using Assembly Attributes?

ответ

787

AssemblyVersion

Если другие узлы, которые ссылаются на сборку будет выглядеть. Если это число изменится, другие сборки должны обновить свои ссылки на вашу сборку! Требуется AssemblyVersion.

Я использую формат: major.minor. Это приведет к:

[assembly: AssemblyVersion("1.0")] 

AssemblyFileVersion

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

В Windows это можно просмотреть в свойствах файла.

Если возможно, пусть оно будет создано MSBuild. AssemblyFileVersion не является обязательным. Если не указано, используется AssemblyVersion.

Я использую формат: major.minor.revision.build, где я использую ревизию для этапа разработки (Alpha, Beta, RC и RTM), пакеты обновлений и исправления. Это приведет к:

[assembly: AssemblyFileVersion("1.0.3100.1242")] 

AssemblyInformationalVersion

версии продукта сборки. Это версия, которую вы использовали бы при разговоре с клиентами или для показа на вашем веб-сайте. Эта версия может быть строкой, например «1.0 Release Candidate».

Анализ кода будет жаловаться на это (CA2243) - reported to Microsoft (не установлен в VS2013).

AssemblyInformationalVersion не является обязательной. Если не указано, используется AssemblyFileVersion.

Я использую формат: major.minor [редакция как строка]. Это приведет к:

[assembly: AssemblyInformationalVersion("1.0 RC1")] 
+1

Ситуация: ASM - проект сборки (.DLL/.EXE). SETUP - проект установки. Обратите внимание, что если [SETUP target ASM] AND [ASM AssemblyFileVersion NOT updated] И [двоичные файлы ASM не изменяются (например, только файлы содержимого обновлены)]; У меня возникли проблемы с установкой SETUP, не использующей последние бинарные файлы (с последними версиями). Это вызвало проблемы с `Application.ProductVersion` и при доступе к` AssemblyInformationalVersion` через отражение. – 2012-03-02 20:55:45

+4

Для AssemblyFileVersion: «Если возможно, пусть он будет создан MSBuild» - Почему? Вы просто объяснили причину ручного управления им :) – 2013-01-04 17:50:47

+3

Предупреждение в формате AssemblyInformationalVersion по-прежнему существует в VS2010 сегодня (21 мая 2013 г.), и ваша ссылка мертва. – reinierpost 2013-05-21 13:10:40

39

AssemblyVersion в значительной степени остается внутренним для .NET, в то время как AssemblyFileVersion является то, что видит Windows. Если вы перейдете к свойствам сборки, сидящей в каталоге, и переключитесь на вкладку версии, то AssemblyFileVersion - это то, что вы увидите вверху. Если вы сортируете файлы по версии, это то, что используется Explorer.

Карты AssemblyInformationalVersion соответствуют «Версии продукта» и предназначены исключительно для использования человеком.

AssemblyVersion, безусловно, самый важный, но я бы не пропустил AssemblyFileVersion. Если вы не предоставите AssemblyInformationalVersion, компилятор добавит его для вас, удалив часть «ревизии» вашего номера версии и оставив файл major.minor.build.

+5

+1 За что говорить, что делает Windows! – Sebastian 2012-10-09 14:49:07

21

AssemblyInformationalVersion и AssemblyFileVersion отображаются при просмотре информации о версии в файле через проводник Windows путем просмотра свойств файла. Эти атрибуты фактически скомпилируются в ресурс VERSION_INFO, который создается компилятором.

AssemblyInformationalVersion - значение «Версия продукта». AssemblyFileVersion - это значение «File version».

AssemblyVersion относится к сборке .NET и используется сборщиком .NET-сборки, чтобы узнать, какую версию сборки загрузить/привязать во время выполнения.

Из них единственным, что требуется .NET, является атрибут AssemblyVersion.К сожалению, это может также вызвать большинство проблем, когда оно изменяется без разбора, особенно если вы сильно назовете свои сборки.

526

Вот a blog post I recently wrote, что углубляется в детали сборки версий ...

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

Вот три основные версии, связанные сборки атрибуты:

// 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")] 

По соглашению, четыре части версии называются как Major Version, Minor Version, Построить, и Редакция.

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

Обычно вы будете вручную установить мажорные и минорные AssemblyFileVersion, чтобы отразить версию сборки, затем увеличивает Создание и/или пересмотр каждый раз, когда ваша сборка компилирует сборку. AssemblyFileVersion должен позволить вам однозначно идентифицировать сборку сборки, чтобы вы могли использовать ее в качестве отправной точки для отладки любых проблем.

В моем текущем проекте у нас есть сервер сборки, кодирующий номер списка изменений из нашего исходного хранилища управления в части сборки и ревизии AssemblyFileVersion. Это позволяет нам напрямую сопоставлять сборку с исходным кодом для любой сборки, сгенерированной сервером сборки (без необходимости использования меток или ветвей в исходном элементе управления или для ведения любых записей выпущенных версий вручную).

Этот номер версии хранится в ресурсе версии Win32 и отображается при просмотре страниц свойств проводника Windows для сборки.

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

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

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

«Например, версия 2.0 продукта может содержать несколько сборок; один этих сборок обозначен как версии 1.0, так как это новый сборник , который не отправил в версии 1.0 тот же продукт. Как правило, вы устанавливаете основные и второстепенные части этой версии номер, представляющий общедоступную версию вашего продукта. Затем вы добавляете сборку и ревизию деталей каждый раз , вы упаковываете полный продукт с всеми его узлами. » - Jeffrey Richter, CLR via C# (Second Edition) p. 57

CLR не заботится и не изучает AssemblyInformationalVersion.

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

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

Это очень важно, потому что это означает, что когда вы ссылаетесь на сильно именованную сборку, вы тесно связаны с конкретной AssemblyVersion этой сборки. Весь AssemblyVersion должен быть точным совпадением для успешной привязки. Например, если вы ссылаетесь на версию 1.0.0.0 сильно названной сборки во время сборки, но только версия 1.0.0.1 этой сборки доступна во время выполнения, привязка не удастся! (Вам нужно будет обойти это, используя Assembly Binding Redirection.)

Путаница в том, должен ли соответствовать весь AssemblyVersion. (Да, да.)

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

На моей машине второй нагрузки сборки повреждается, и последние две строки журнала слитого сделать совершенно ясно, почему:

.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. 

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

«При загрузке сборки, то CLR автоматически найти последнюю установленную версию обслуживания, что соответствует основной/младшей версии запрашиваемой сборки . " - Jeffrey Richter, CLR via C# (Second Edition) p. 56

Это поведение в Beta 1 1.0 CLR, однако эта возможность была удалена до версии 1.0, и не удалось повторно поверхность в .NET 2.0:

« Примечание. Я только что описал, как вы должны думать о версиях номера . К сожалению, CLR не обрабатывает номера версий таким образом. [В .NET 2.0] CLR рассматривает номер версии как непрозрачное значение, а если сборка зависит от версии 1.2.3.4 другой сборки , CLR пытается загрузить только версии 1.2.3.4 (если только привязка перенаправление на месте). Тем не менее, Microsoft планирует изменить загрузчик в CLR в будущей версии так , что он загружает последнюю сборки/пересмотра для данного старшего/младшего версии сборки. Например, на будущей версии CLR, если загрузчик пытается найти версию 1.2.3.4 сборки и версии 1.2.5.0, загрузчик автоматически получает последнюю версию обслуживания . Это будет очень приветствуется замена на загрузчик CLR - I за один не может ждать. " - Jeffrey Richter, CLR via C# (Second Edition) p.164 (курсив мой)

Как это изменение до сих пор не были реализованы, я думаю, что это с уверенностью предположить, что Microsoft была обратно отслеживаются на этом намерении, и это, возможно, слишком поздно, чтобы изменить это сейчас. Я попытался найти в Интернете, чтобы узнать, что произошло с этими планами, но я не нашел ответов. Я все еще хотел разобраться.

Итак, я отправил по электронной почте Джеффу Рихтеру и спросил его прямо - я понял, знает ли кто, что случилось, это был бы он.

Он ответил в течение 12 часов, в субботу утром, не менее, и пояснил, что загрузчик .NET 1.0 Beta 1 реализовал этот механизм автоматического перемотки вперед, чтобы собрать новейшие доступные сборки и ревизии сборки, но это поведение было отменено до отправки .NET 1.0. Позже это было предназначено для оживления этого, но оно не дошло до отправки CLR 2.0. Затем появился Silverlight, который стал приоритетом для команды CLR, поэтому эта функциональность затянулась еще дальше. В то же время большинство людей, которые были во времена CLR 1.0 Beta 1, с тех пор перешли, так что маловероятно, что это увидит свет дня, несмотря на всю тяжелую работу, которая уже была введена в нее.

Текущее поведение, кажется, здесь, чтобы остаться.

Также стоит отметить, что AssemblyFileVersion был добавлен только после удаления механизма автоматического перемотки вперед - потому что после 1.0 Beta 1 любое изменение в AssemblyVersion стало изменением для ваших клиентов , тогда негде было безопасно хранить ваш номер сборки. AssemblyFileVersion - это безопасное убежище, поскольку оно никогда не проверяется автоматически CLR. Возможно, это более понятно, имея два отдельных номера версии с отдельными значениями, вместо того, чтобы пытаться сделать это разделение между Major/Minor (break) и Build/Revision (неразрывными) частями AssemblyVersion.

В нижней строке: Подумайте внимательно о том, когда вы меняете AssemblyVersion

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

  • Не Смените AssemblyVersion для выпуска обслуживания, которое предназначено для обеспечения обратной совместимости.
  • Do Измените AssemblyVersion для выпуска, который, как вы знаете, имеет нарушения.

Просто еще раз взглянуть на версии атрибутов 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")] 

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

2

При изменении сборки AssemblyVersion, Если у него есть сильное имя, референсные сборки необходимо перекомпилировать, иначе сборка не загружается! Если у него нет сильного имени, если он явно не добавлен в файл проекта, он не будет скопирован для вывода каталога при сборке, поэтому вы можете пропустить определенные сборки, особенно после очистки выходного каталога.

7

Стоит отметить и некоторые другие вещи:

1), как показано в диалоговом окне Свойства для Windows Explorer, для созданного файла сборки, есть два места, называемые «версия файла». Тот, который отображается в заголовке диалогового окна, показывает AssemblyVersion, а не AssemblyFileVersion.

В разделе «Информация о другой версии» есть еще один элемент «Версия файла». Здесь вы можете увидеть, что было введено как AssemblyFileVersion.

2) AssemblyFileVersion - это просто текст. Он не должен соответствовать ограничениям схемы нумерации, которые делает AssemblyVersion (<build> < 65K, например). Это может быть 3.2. < текст тега релиза >. <datetime>, если хотите. Ваша система сборки должна будет заполнить жетоны.

Кроме того, он не подлежит замене шаблонов, что AssemblyVersion. Если вы просто имеете значение «3.0.1. *» В AssemblyInfo.cs, это именно то, что будет показано в элементе «Информация о версии» -> «Версия файла».

3) Однако я не знаю, какое влияние оказывает на установщика использование чего-то другого, кроме числовых номеров версий файлов.

5

Для того, чтобы оставить этот вопрос актуальным, стоит отметить, что AssemblyInformationalVersion используется NuGet и отражает версию пакета , включая любой суффикс предварительной версии.

например AssemblyVersion из 1.0.3. * В комплекте с основным asp.net DotNet-Cli

dotnet pack --version-suffix ci-7 src/MyProject 

Производит пакет с версией 1.0.3-C-7, которые вы можете проверить с помощью отражения :

CustomAttributeExtensions.GetCustomAttribute<AssemblyInformationalVersionAttribute>(asm);