Перенаправление привязки сборки .Net с разными токенами открытого ключа

Можно ли выполнить перенаправление привязки сборки между разными версиями сборки, на которую указывает ссылка, если токен открытого ключа имеет значение NULL в более старой версии и установлен в более новой версии?

Например, у меня две сборки ...

System.Web.Mvc, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null

и

System.Web.Mvc, Version=2.0.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35

Если следующее перенаправление привязки сборки работает в Asp.Net web.config ...

<runtime>
  <assemblyBinding xmlns="urn:schemas-microsoft-com:asm.v1">
    <dependentAssembly>
      <assemblyIdentity name="System.Web.Mvc" publicKeyToken="31bf3856ad364e35"/>
      <bindingRedirect oldVersion="1.0.0.0" newVersion="2.0.0.0"/>
    </dependentAssembly>
  </assemblyBinding>
</runtime>

person Russell Giddings    schedule 03.02.2010    source источник


Ответы (3)


Нет, это невозможно. Сборки должны иметь один и тот же publicKeyToken.

Тег bindingRedirect имеет только атрибуты oldVersion и newVersion, поэтому в любом случае нельзя сказать ему о «нулевой» версии.

Но настоящая причина объясняется механизм строгого имени

person Mark Worth    schedule 03.02.2010

Возможно, вы сможете использовать AppDomain.AssemblyResolve событие для этого. Я включил образец кода в этот ответ.

person Don Kirkby    schedule 26.02.2010
comment
К сожалению, похоже, что токены открытого ключа все еще должны совпадать. Когда я пытаюсь вручную загрузить другую сборку (с bindingRedirect или без), я получаю. Определение манифеста обнаруженной сборки не соответствует ссылке на сборку. - person ladenedge; 05.01.2012
comment
@ladenedge, если вы посмотрите на образец кода в ответе, на который я указал, он позволяет вам использовать любые критерии, которые вы хотите решить, какую сборку использовать. В примере я использовал имя сборки и проигнорировал токены открытого ключа. Обратите внимание, что мой образец динамически загружал сборку из файла, а не во время запуска. Честно говоря, я не пытался делать то, о чем вы говорите, так что это может быть невозможно. - person Don Kirkby; 05.01.2012

Кажется, что перенаправление привязки невозможно использовать, но в моем случае мне удалось обойти проблему с разными publicKeyTokens, изменив значение токена, запрашиваемое в ссылающейся DLL:

Разберите dll на IL, измените ссылку, соберите заново (и переподпишите - что может быть проблемой, если у вас нет ключевого файла).

(См. Мой комментарий к при ссылке на сборки, можно ли настаивать на номере версии, но игнорировать публичный токен ключа? (т.е. принимать подписанный / неподписанный))

person mwardm    schedule 29.10.2014