Вот 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 на повторную компиляцию с новой версией!
Ситуация: ASM - проект сборки (.DLL/.EXE). SETUP - проект установки. Обратите внимание, что если [SETUP target ASM] AND [ASM AssemblyFileVersion NOT updated] И [двоичные файлы ASM не изменяются (например, только файлы содержимого обновлены)]; У меня возникли проблемы с установкой SETUP, не использующей последние бинарные файлы (с последними версиями). Это вызвало проблемы с `Application.ProductVersion` и при доступе к` AssemblyInformationalVersion` через отражение. – 2012-03-02 20:55:45
Для AssemblyFileVersion: «Если возможно, пусть он будет создан MSBuild» - Почему? Вы просто объяснили причину ручного управления им :) – 2013-01-04 17:50:47
Предупреждение в формате AssemblyInformationalVersion по-прежнему существует в VS2010 сегодня (21 мая 2013 г.), и ваша ссылка мертва. – reinierpost 2013-05-21 13:10:40