Це властивість часу компіляції!
Однією з найважливіших речей, яку потрібно знати, є те, що "Конкретна версія" - це властивість, яка набуває чинності під час компіляції, а не під час виконання.
Про що це все?
Коли проект будується, посилання на складання проекту повинні бути вирішені, щоб знайти фізичні збірки, якими повинна використовувати система збирання. Якщо перевірка "Конкретної версії" виконується (див. Розділ "Коли перевіряється" Конкретна версія "?"), Це впливає на результат процесу вирішення монтажу:
- Система збирання знаходить фізичну збірку, яку вона потенційно може використовувати
- Система збірки порівнює версію фізичної збірки з версією збірки, що зберігається у файлі .csproj для посилання на збірку
- Якщо дві версії збірки абсолютно однакові, процес роздільної здатності успішний, і знайдена фізична збірка використовується для збірки
- Якщо дві версії збірки не збігаються, фізична збірка відміняється, і процес роздільної здатності триває шляхом знаходження наступної потенційної збірки
- Якщо більше потенційних фізичних вузлів не може бути розміщено, процес роздільної здатності не вдається. Це призводить до попередження компілятора (попередження MSB3245), яке повідомляє, що посилання неможливо було вирішити.
- Цікаво, що збірка продовжується! Якщо в коді немає фактичних посилань на збірку, збірка вдається (з попередньо згаданим попередженням). Якщо в коді є посилання, збірка не вдається з помилкою, схожою на те, що в коді використовуються невідомі типи або простори імен. Єдине свідчення, чому збірка дійсно не вдалася, - це попередження MSB3245.
Порядок, в якому вирішуються збірки
Порядок, в якому процес роздільної здатності збирання знаходить потенційні збірки, виглядає таким:
- Вузол , на який посилається
<HintPath>елемент в файлі .csproj
- Шлях виведення проекту
- 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.
Побічні ефекти для "Копіювати локальний"
Якщо для властивості "Copy Local" встановлено значення "True", але процес роздільної здатності збірки не вдається через перевірку "Specific Version", жодна збірка не копіюється.
Довідковий матеріал