AssemblyVersion
Где будут смотреть другие сборки, которые ссылаются на вашу сборку. Если это число меняется, другие сборки должны обновить свои ссылки на вашу сборку! Обновляйте только эту версию, если она нарушает обратную совместимость. AssemblyVersion
Требуется.
Я использую формат: Major.minor . Это приведет к:
[assembly: AssemblyVersion("1.0")]
Если вы строго следите за SemVer, то это означает, что вы обновляетесь только при значительных изменениях, например, 1.0, 2.0, 3.0 и т. Д.
AssemblyFileVersion
Используется для развертывания. Вы можете увеличить это число для каждого развертывания. Используется программами установки. Используйте его для пометки сборок, которые имеют одинаковые AssemblyVersion
, но сгенерированные из разных сборок.
В Windows это можно посмотреть в свойствах файла.
AssemblyFileVersion является необязательным. Если не указано, используется AssemblyVersion.
Я использую формат: major.minor.patch.build , где я следую SemVer для первых трех частей и использую номер сборки сервера сборки для последней части (0 для локальной сборки). Это приведет к:
[assembly: AssemblyFileVersion("1.3.2.254")]
Помните, что System.Version называет эти части как major.minor.build.revision
!
AssemblyInformationalVersion
Версия продукта сборки. Это версия, которую вы будете использовать при общении с клиентами или для отображения на вашем сайте. Эта версия может быть строкой, например, « 1.0 Release Candidate ».
Это AssemblyInformationalVersion
необязательно. Если не указан, используется AssemblyFileVersion.
Я использую формат: major.minor [.patch] [revision as string] . Это приведет к:
[assembly: AssemblyInformationalVersion("1.0 RC1")]
major.minor[.build[.revision]]
и неmajor.minor.revision.build
так в данном ответе номера сборки и ревизии поменяются местами, если вы используете свойства класса илиSystem.Reflection.Assembly.GetExecutingAssembly().GetName().Version
для определения номеров сборки и ревизии.AssemblyInformationalVersion
, если не указано ,AssemblyFileVersion
используется. Тогда,AssemblyVersion
если оба опущены.Управление версиями сборок в .NET может вызвать затруднения, поскольку в настоящее время существует как минимум три способа указать версию для вашей сборки.
Вот три основных атрибута сборки, связанных с версией:
Условно четыре части версии называются Основная версия , Малая версия , Сборка и Редакция .
AssemblyFileVersion
Предназначен для однозначной идентификации сборки из индивидуальной сборкиОбычно вы вручную устанавливаете Major и Minor AssemblyFileVersion для отображения версии сборки, а затем увеличиваете Build и / или Revision каждый раз, когда ваша система сборки компилирует сборку. AssemblyFileVersion должна позволять вам однозначно идентифицировать сборку сборки, чтобы вы могли использовать ее в качестве отправной точки для устранения любых проблем.
В моем текущем проекте у сервера сборки есть код списка изменений из нашего репозитория исходного кода в части Build и Revision AssemblyFileVersion. Это позволяет нам напрямую сопоставлять сборку с ее исходным кодом для любой сборки, сгенерированной сервером сборки (без необходимости использовать метки или ветви в управлении исходным кодом или вручную хранить какие-либо записи выпущенных версий).
Этот номер версии хранится в ресурсе версии Win32, и его можно увидеть при просмотре страниц свойств Windows Explorer для сборки.
CLR не заботится и не проверяет AssemblyFileVersion.
AssemblyInformationalVersion
Предназначено для представления версии всей продукцииAssemblyInformationalVersion предназначена для обеспечения согласованного управления версиями всего продукта, который может состоять из множества сборок, которые имеют независимое управление версиями, возможно, с разными политиками управления версиями и потенциально разработанные разнородными группами.
CLR не заботится и не изучает AssemblyInformationalVersion.
Это
AssemblyVersion
единственная версия, о которой заботится CLR (но она заботится обо всемAssemblyVersion
)AssemblyVersion используется CLR для привязки к строго именованным сборкам. Он хранится в таблице метаданных манифеста AssemblyDef собранной сборки и в таблице AssemblyRef любой сборки, которая на нее ссылается.
Это очень важно, потому что это означает, что когда вы ссылаетесь на сборку со строгим именем, вы тесно связаны с конкретной версией Assembly для этой сборки. Вся AssemblyVersion должна точно соответствовать для успешного связывания. Например, если вы ссылаетесь на версию 1.0.0.0 сборки со строгим именем во время сборки, но во время выполнения доступна только версия 1.0.0.1 этой сборки, связывание завершится ошибкой! (Затем вам придется обойти это, используя перенаправление привязки сборки .)
Путаница в том, должно ли все
AssemblyVersion
совпадать. (Да, это так.)Существует небольшая путаница вокруг того, должно ли полное AssemblyVersion быть точным совпадением для загрузки сборки. Некоторые люди ошибочно полагают, что только основные и второстепенные части AssemblyVersion должны совпадать, чтобы связывание было успешным. Это разумное предположение, однако в конечном итоге оно неверно (начиная с .NET 3.5), и это легко проверить для вашей версии CLR. Просто выполните этот пример кода .
На моей машине происходит сбой загрузки второй сборки, и последние две строки журнала Fusion ясно показывают, почему:
Я думаю, что источником этой путаницы, вероятно, является то, что Microsoft изначально намеревалась быть немного более снисходительной в этом строгом сопоставлении полной версии AssemblyVersion, сопоставляя ее только в частях Major и Minor версии:
Это было поведение в бета-версии 1 CLR 1.0, однако эта функция была удалена до выпуска 1.0 и не смогла вновь появиться в .NET 2.0:
Поскольку это изменение до сих пор не реализовано, я думаю, что можно с уверенностью предположить, что 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. Может быть, так будет понятнее, имея два отдельных номера версий с разными значениями, вместо того, чтобы пытаться сделать это разделение между основными / второстепенными (разрывными) и сборочными / ревизионными (неразрывными) частями AssemblyVersion.
Итог: тщательно продумайте, когда вы меняете
AssemblyVersion
Мораль такова, что если вы отправляете сборки, на которые будут ссылаться другие разработчики, вам нужно быть предельно осторожным, когда вы изменяете (и не изменяете) AssemblyVersion этих сборок. Любые изменения в AssemblyVersion будут означать, что разработчикам приложений придется либо перекомпилироваться с новой версией (чтобы обновить эти записи AssemblyRef), либо использовать перенаправления привязки сборки, чтобы вручную переопределить привязку.
Просто взгляните на атрибуты версии в mscorlib:
Обратите внимание, что это AssemblyFileVersion, которая содержит всю интересную информацию об обслуживании (это версия Revision этой версии, которая сообщает вам, какой пакет обновления вы используете), в то время как AssemblyVersion исправлена на скучной старой версии 2.0.0.0. Любое изменение в AssemblyVersion заставит каждое приложение .NET, ссылающееся на mscorlib.dll, перекомпилироваться для новой версии!
источник
AssemblyVersion
в значительной степени остается внутренним для .NET, в то времяAssemblyFileVersion
как Windows видит это. Если вы перейдете к свойствам сборки,AssemblyFileVersion
находящейся в каталоге, и перейдете на вкладку версии, то это то, что вы увидите вверху. Если вы сортируете файлы по версии, это то, что используется Explorer.AssemblyInformationalVersion
Карты в «Версии продукта» и предназначается , чтобы быть чисто «человеком используемым».AssemblyVersion
конечно, самое главное, но я бы тоже не стал пропускатьAssemblyFileVersion
. Если вы не предоставитеAssemblyInformationalVersion
, компилятор добавит его для вас, убрав часть «revision» номера вашей версии и оставив Major.minor.build.источник
AssemblyInformationalVersion
иAssemblyFileVersion
отображаются, когда вы просматриваете информацию «Версия» в файле через проводник Windows, просматривая свойства файла. Эти атрибуты фактически компилируются вVERSION_INFO
ресурс, который создается компилятором.AssemblyInformationalVersion
является значением «Версия продукта».AssemblyFileVersion
значение версии файлаОн
AssemblyVersion
специфичен для сборок .NET и используется загрузчиком сборок .NET, чтобы узнать, какую версию сборки загружать / связывать во время выполнения.Из них единственным, который абсолютно необходим .NET, является
AssemblyVersion
атрибут. К сожалению, это может также вызвать большинство проблем, когда оно меняется без разбора, особенно если вы хорошо называете свои сборки.источник
Чтобы сохранить актуальность этого вопроса, стоит выделить то, что
AssemblyInformationalVersion
используется NuGet и отражает версию пакета. включая любой суффикс перед выпуском.Например, AssemblyVersion версии 1.0.3. * В комплекте с ядром asp.net dotnet-cli
Создает пакет с версией 1.0.3-ci-7, который вы можете проверить с помощью отражения:
источник
Стоит отметить некоторые другие вещи:
1) Как показано в диалоговом окне «Свойства проводника Windows» для сгенерированного файла сборки, есть два места, называемые «Версия файла». В заголовке диалогового окна отображается AssemblyVersion, а не AssemblyFileVersion.
В разделе Информация о другой версии есть еще один элемент, который называется «Версия файла». Здесь вы можете увидеть, что было введено как AssemblyFileVersion.
2) AssemblyFileVersion - это просто текст. Он не должен соответствовать ограничениям схемы нумерации, которые делает AssemblyVersion (например, <build> <65K). Это может быть 3.2. <Release tag text>. <Datetime>, если хотите. Ваша система сборки должна будет заполнить токены.
Более того, он не подлежит замене подстановочным знаком, которым является AssemblyVersion. Если у вас просто есть значение «3.0.1. *» В AssemblyInfo.cs, это именно то, что будет отображаться в элементе «Другая информация о версии» -> «Версия файла».
3) Я не знаю, как влияет на установщик использование чего-либо, кроме числовых номеров версий файлов.
источник
При изменении AssemblyVersion сборки, если она имеет строгое имя, ссылочные сборки необходимо перекомпилировать, иначе сборка не загружается! Если у него нет строгого имени, если оно явно не добавлено в файл проекта, оно не будет скопировано в выходной каталог при сборке, поэтому вы можете пропустить определенные сборки, особенно после очистки выходного каталога.
источник