Переспрямування прив'язки збірки: як і чому?


127

Це не проблемне питання, а загальне розуміння питання щодо роботи перев'язувальної обов'язкової збірки.

Запити

  1. Чому прив'язка переспрямування показує лише основні номери версій, а не незначні, номери побудови та перегляду?
  2. Чи змінюються старі та нові версії лише тоді, коли є основна версія?

    <dependentAssembly>
        <assemblyIdentity name="FooBar"  
                          publicKeyToken="32ab4ba45e0a69a1"  
                          culture="en-us" />  
    
        <bindingRedirect oldVersion="7.0.0.0" newVersion="8.0.0.0" />  
    </dependentAssembly>

Це може бути будь-яка версія, не тільки основна. Наприклад:oldVersion="0.0.0.0-4.1.0.0" newVersion="4.1.0.0"
Евк

@Evk: Усі приклади, які я бачу, показують лише основну версію.
Nikhil Agrawal

4
Ну, це лише приклади, і ніде не сказано, що це єдиний можливий спосіб.
Евк

Відповіді:


166

Чому взагалі потрібні переадресації прив’язки? Припустимо, у вас є додаток A, що посилається на бібліотеку B, а також на бібліотеку C версії 1.1.2.5. Бібліотека B у свою чергу також посилається на бібліотеку C, але версії 1.1.1.0. Зараз у нас конфлікт, оскільки ви не можете завантажувати різні версії однієї збірки під час виконання. Для вирішення цього конфлікту ви можете використовувати переадресацію прив'язки, як правило, до нової версії (але може бути і до старої). Ви робите це, додаючи в розділ app.config програми програми A під configuration > runtime > assemblyBindingрозділом (див. Тут приклад повного файлу конфігурації):

<dependentAssembly>
    <assemblyIdentity name="C"  
                      publicKeyToken="32ab4ba45e0a69a1"  
                      culture="en-us" />  

    <bindingRedirect oldVersion="1.1.1.0" newVersion="1.1.2.5" />  
</dependentAssembly>

Ви також можете вказати діапазон версій для картування:

<bindingRedirect oldVersion="0.0.0.0-1.1.1.0" newVersion="1.1.2.5" />  

Тепер бібліотека B, складена з посиланням на C версії 1.1.1.0, буде використовувати C версії 1.1.2.5 під час виконання. Звичайно, ви краще переконайтеся, що бібліотека C сумісна назад, або це може призвести до несподіваних результатів.

Ви можете перенаправляти будь-які версії бібліотек, а не лише основні.


У який файл і в який розділ вони входять? Чи може хтось, будь ласка, надати посилання на джерело на зразок MSDN або подібне для довідки? Пам’ятайте, що люди будуть висаджуватися на ваші статті SO Q / A з усієї сфери пошукової системи та посилання є критичними. У мене був співробітник, який скаже мені, "просто додайте переспрямування збірки до вашого файлу exe" безпосередньо перед відпусткою на тиждень, і я приземлився тут, і хоча ця відповідь виглядає чудово, їй не вистачає контексту та довідок.
tpartee

Дійсні запитання @tpartee, я відредагував відповідь (чекаю експертної оцінки), щоб включити розділ конфігурації та посилання на docs.microsoft.com/en-us/dotnet/framework/configure-apps/…
Kobus Smit

1
@AlexanderDerck в конфігураційному файлі програми A - вони не впливають (наскільки я знаю) на конфігураційні файли бібліотек, за винятком, можливо, коли ця бібліотека є одиничною тестовою бібліотекою і в деякому сенсі "виконується" одиницею тестового бігуна.
Евк

1
@AlexanderDerck було питання пару тижнів назад, з багатьма upvotes і навіть щедрості, який напрошувався саме це, але ніхто не був в змозі забезпечити переконливу відповідь - stackoverflow.com/q/48377474/5311735
Evk

1
@CodeEngine publicKeyToken ідентифікує збірку C. Тільки підписані збірки мають цей маркер відкритого ключа, що їх ідентифікує. Ось пов'язаний з цим питання про те , як ви можете дізнатися , що маркер за умови , що у вас є збірка: stackoverflow.com/q/3045033/5311735
Evk

56

Ми зіткнулися з проблемою із перенаправленням прив’язки для NewtonSoft.Json. Ми переглянули версію файлу у файлі win 10 "9.0.1.19813", знайшли номер та переспрямовування не вийшло. Подальше розслідування виявило, що ми дивимось на версію файлу, а не на версію монтажу. Отже, мені цікаво, чи помиляються люди у версії файлу (яка часто змінюється) та версії збірки (яку ви не бачите у Windows 10 File Explorer). Щоб побачити збірну версію DLL, ви можете запустити це в powershell. Замініть ім'я dll тим, на яке ви хочете знайти версію.

[Reflection.AssemblyName]::GetAssemblyName('C:\development\bin\Newtonsoft.Json.dll').Version

Результат вище -.

Major  Minor  Build  Revision

-----  -----  -----  --------

9      0      0      0

Дивіться посилання:

Як я можу побачити версію збірки .NET-збірки в Windows Vista та новіших версіях (WIndows 7, 2008)?

https://support.microsoft.com/en-nz/help/556041

введіть тут опис зображення


12
Оновлення за збільшення різниці між версією файлу та версією збірки !!
понеділок
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.