Как именно свойство "конкретная версия" ссылки на сборку работает в Visual Studio?



сегодня я более подробно рассмотрел свойство "Specific Version" ссылок на сборки в Visual Studio 2010. После нескольких экспериментов с неожиданными результатами я решил узнать как можно больше о том, как свойство работает. Даже так, мне кажется, не все ответы есть, поэтому вот моя попытка самостоятельно ответить на вопрос:



Как ровно работает ли свойство "конкретная версия" ссылки на сборку в Visual Studio?

472   2  

2 ответов:

это свойство времени компиляции!

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

что все это значит?

при построении проекта ссылки на сборки проекта должны быть разрешены, чтобы найти физические сборки, которые должна использовать система сборки. Если выполняется проверка "конкретной версии" (см. раздел "когда проверяется" конкретная версия"?"), это влияет на исход процесса принятия резолюции Ассамблеей:

  • система сборки находит физическую сборку, которую она потенциально может использовать
  • система сборки сравнивает версию физической сборки с версией сборки, хранящейся в ней .файл csproj для ссылки на сборку
  • если две версии сборки точно совпадают, процесс разрешения завершается успешно и физическая сборка найдена используется для сборки
  • если две версии сборки не совпадают, физическая сборка отбрасывается и процесс разрешения продолжается путем поиска следующей потенциальной сборки
  • если больше не удается найти потенциальные физические сборки, процесс разрешения завершается неудачей. Это приводит к появлению предупреждения компилятора (предупреждение MSB3245), которое сообщает вам, что ссылка не может быть решена.
  • интересно, что сборка продолжается! если код не имеет фактических ссылок на сборку, сборка завершается успешно (с ранее упомянутым предупреждением). Если код содержит ссылки, сборка завершается с ошибкой, которая выглядит так, как если бы код использовал неизвестные типы или пространства имен. Единственное указание, почему сборка действительно ошибка-это предупреждение MSB3245.

порядок разрешения сборок

порядок расположения потенциальных сборок в процессе разрешения сборки выглядит следующим образом это:

  1. сборка, на которую ссылается <HintPath> элемент .csproj file
  2. путь вывода проекта
  3. GAC

обратите внимание, что если в GAC существует несколько версий сборки, процесс разрешения сначала пытается разрешить сборку с самой высокой версией. Это важно только в том случае, если проверка" конкретной версии " не производится.

когда "конкретная версия" проверено?

Visual Studio основывает свое решение о том, следует ли выполнять проверку "конкретной версии" на двух фрагментах информации, найденных в .файл csproj:

  • наличие или отсутствие <SpecificVersion> элемент, и его значение (если он присутствует)
  • наличие или отсутствие информации о версии в ссылку на сборку

так выглядит типичная ссылка на сборку с информацией о версии например:

<Reference Include="Foo, Version=1.2.3.4, Culture=neutral, processorArchitecture=MSIL">
  <SpecificVersion>True</SpecificVersion>
  <HintPath>..\..\Bar\Foo.dll</HintPath>
</Reference>

и вот как выглядит ссылка на сборку без версия:

<Reference Include="Foo">
[...]

в следующей таблице показано, когда выполняется проверка "конкретной версии", а когда нет.

                            |     Version information
                            |  Present       Not present
----------------------------+------------------------------
<SpecificVersion>           |
- Present, has value True   |    Yes (1)        Yes (check always fails) (2)
- Present, has value False  |    No  (3)        No (4)
- Not present               |    Yes (5)        No (6)

самое удивительное здесь заключается в том, что никакая проверка не выполняется, если оба <SpecificVersion> и информация о версии отсутствуют (случай 6). Я ожидал бы, что проверка будет выполнена и всегда завершится неудачей (так же, как и в случае 2), потому что в мое понимание отсутствия <SpecificVersion> подразумевает значение по умолчанию "true". Это может быть причуда Visual Studio 2010, где я делал свои тесты.

при проверке свойств ссылки на сборку в пользовательском интерфейсе Visual Studio (выберите ссылку и нажмите F4), значение, которое вы видите для свойства "определенная версия", указывает, будет ли Visual Studio выполнять проверку "определенная версия". В случае 6 пользовательский интерфейс покажет "True", хотя <SpecificVersion> элемент отсутствует в.файл csproj.

побочные эффекты на "копировать локально"

если свойство " копировать локально "имеет значение" True", но процесс разрешения сборки не выполняется из-за проверки" конкретной версии", сборка не копируется.

справочные материалы

при добавлении ссылки Visual Studio записывает [AssemblyVersion] сборки в файл проекта. Это очень важно. Если вы, скажем, создадите исправление ошибки через год, то вы хотите убедиться, что вы перестраиваете проект с помощью точно та же версия ссылки, так что это истинное падение-В. Вы получите сообщение об ошибке, если ссылочная сборка изменилась.

но это не всегда желательно. Некоторые программисты позволяют версии сборки автоматически инкремент, генерируя новую версию каждый раз, когда они перестраивают. Несмотря на то, что открытый интерфейс сборки никогда не менялся. Некоторые настраивают свой проект с помощью Nuget для получения библиотек и позволяют ему автоматически обновлять библиотеку, когда доступен новый выпуск. Они хотели бы установить определенное свойство Version в False, чтобы подавить ошибку компиляции.

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

Comments

    Ничего не найдено.