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

Это называется форвардным объявлением. Он используется, чтобы ваш код знал, что класс foo существует. Это, в свою очередь, может использоваться панелью классов.

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

//a.h
#include "b.h"

class A
{
    void useB(B obj);
}

и

// b.h
#include "a.h"
class B
{
     void useA(A obj);
}

Это вызывает проблему с круговым включением, так как a.h включает b.h, который по очереди включает a.h, в бесконечность. Вы можете решить эту проблему, сделав перед каждым заголовком декларацию в прямом выражении следующим образом:

//a.h
class B;

class A
{
    void useB(B obj);
}

// b.h
class A;

class B
{
     void useA(A obj);
}

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

828
задан Ian Kemp 4 June 2018 в 08:00
поделиться

4 ответа

AssemblyVersion

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

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

[assembly: AssemblyVersion("1.0")]

AssemblyFileVersion

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

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

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

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

[assembly: AssemblyFileVersion("1.0.3100.1242")]

AssemblyInformationalVersion

Версия продукта блока. Это - версия, которую Вы использовали бы когда говорящий с клиентами или для дисплея на Вашем веб-сайте. Эта версия может быть строкой, как' 1.0 Предвыпускных версии '.

Анализ кода будет жаловаться на это (CA2243) - , сообщил Microsoft (не зафиксированный в VS2013).

Эти AssemblyInformationalVersion является дополнительным. Если не данный, AssemblyFileVersion используется.

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

[assembly: AssemblyInformationalVersion("1.0 RC1")]
876
ответ дан Braiam 4 June 2018 в 08:00
поделиться

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

AssemblyInformationalVersion карты к "Версии продукта" и предназначен, чтобы просто "использоваться человеком".

AssemblyVersion является, конечно, самым важным, но я не пропустил бы AssemblyFileVersion, также. Если Вы не обеспечиваете AssemblyInformationalVersion, компилятор добавляет его для Вас путем снятия изоляции с части "пересмотра" номера версии и отъезда major.minor.build.

42
ответ дан Grant Palin 4 June 2018 в 08:00
поделиться

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

AssemblyInformationalVersion значение "Версии продукта". AssemblyFileVersion значение "Версии файла".

Эти AssemblyVersion характерно для блоков.NET и используется загрузчиком сборок.NET для знания который версия блока загрузить/связать во времени выполнения.

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

21
ответ дан Dejan 4 June 2018 в 08:00
поделиться

Создание версий сборок в .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 , Build и Revision .

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

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

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

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

CLR не заботится и не проверяет AssemblyFileVersion. может содержать несколько сборок; один из этих сборок помечается как версия 1.0, так как это новая сборка который не поставляется в версии 1.0 тот же продукт. Как правило, вы устанавливаете основные и второстепенные части этой версии номер для представления публичной версии вашего продукта. Тогда вы увеличиваете части сборки и ревизии каждый раз Вы упаковываете полный продукт с все его сборки ». - Джеффри Рихтер, [CLR через C # (второе издание)] с. 57

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

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

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

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

Путаница из-за того, должна ли вся AssemblyVersion соответствовать. (Да, это так.)

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

На моей машине не получается загрузить вторую сборку, установленная обслуживающая версия соответствует основной / вспомогательной версии сборка запрашивается ». - Джеффри Рихтер, [CLR через C # (второе издание)] с. 56

Это было поведение в бета-версии 1 CLR 1.0, однако эта функция была удалена до выпуска 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 - я потому что никто не может ждать. - Джеффри Рихтер, [CLR через C # (второе издание)] с. 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 автоматически. Может быть, так понятнее, имея два разных номера версии с разными значениями, вместо того, чтобы пытаться сделать это разделение между основными / второстепенными (ломающимися) и строящими / ревизионными (не ломающимися) частями AssemblyVersion.

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

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

  • Не изменяйте AssemblyVersion для сервисного релиза, который предназначен для обратной совместимости.
  • Замените на 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, перекомпилироваться для новой версии!

Между тем AssemblyVersion исправлена ​​на скучной старой версии 2.0.0.0. Любое изменение в AssemblyVersion заставит каждое приложение .NET, ссылающееся на mscorlib.dll, перекомпилироваться для новой версии!

Между тем AssemblyVersion исправлена ​​на скучной старой версии 2.0.0.0. Любое изменение в AssemblyVersion заставит каждое приложение .NET, ссылающееся на mscorlib.dll, перекомпилироваться для новой версии!

581
ответ дан 22 November 2019 в 21:11
поделиться
Другие вопросы по тегам:

Похожие вопросы: