Смена привязки к сборке не работает
Я пытаюсь настроить перенаправление связывания сборки, используя следующий файл app.config:
<configuration>
<runtime>
<assemblyBinding xmlns="urn:schemas-microsoft-com:asm.v1">
<dependentAssembly>
<assemblyIdentity name="Microsoft.AnalysisServices"
PublicKeyToken="89845dcd8080cc91" />
<bindingRedirect oldVersion="10.0.0.0"
newVersion="9.0.0.0" />
</dependentAssembly>
</assemblyBinding>
</runtime>
</configuration>
Я запускаю программу на машине с версией 9.0.242.0 в GAC с указанным токеном открытого ключа. CLR, похоже, даже не пытается перенаправить привязку для использования этой версии.
Вот что я получаю в fuslogvw.exe:
LOG: This bind starts in default load context.
LOG: Using application configuration file: \Debug\AssemblyRedirectPOC.exe.Config
LOG: Using machine configuration file from C:\Windows\Microsoft.NET\Framework\v2.0.50727\config\machine.config.
LOG: Post-policy reference: Microsoft.AnalysisServices, Version=10.0.0.0, Culture=neutral, PublicKeyToken=89845dcd8080cc91
LOG: GAC Lookup was unsuccessful.
LOG: Attempting download of new URL /Debug/Microsoft.AnalysisServices.DLL.
LOG: Attempting download of new URL /Debug/Microsoft.AnalysisServices/Microsoft.AnalysisServices.DLL.
LOG: Attempting download of new URL /Debug/Microsoft.AnalysisServices.EXE.
LOG: Attempting download of new URL /Debug/Microsoft.AnalysisServices/Microsoft.AnalysisServices.EXE.
LOG: All probing URLs attempted and failed.
Когда я попытался поместить dll 9.0.242.0 в путь зонда, я получаю это вместо:
LOG: Assembly download was successful. Attempting setup of file: \Debug\Microsoft.AnalysisServices.dll
LOG: Entering run-from-source setup phase.
LOG: Assembly Name is: Microsoft.AnalysisServices, Version=9.0.242.0, Culture=neutral, PublicKeyToken=89845dcd8080cc91
WRN: Comparing the assembly name resulted in the mismatch: Major Version
ERR: The assembly reference did not match the assembly definition found.
ERR: Failed to complete setup of assembly (hr = 0x80131040). Probing terminated.
Обратите внимание, что я также попытался изменить перенаправление на использование "9.0.242.0" вместо "9.0.0.0" в app.config, и это не сработало, хотя я не думаю, что это должно иметь значение.
Из того, что я понимаю, вся суть перенаправления привязки заключается в использовании версии, которая не соответствует той, с которой была построена программа. Я что-то здесь совсем не вижу? Я пытаюсь сделать то, что я пытаюсь сделать, и если да, то какая идея, почему он не работает?
Cheers,
Адам
Ответы
Ответ 1
Любая опечатка в конфигурации xml может быть причиной. Погрузчик просто не видит вашу конфигурацию.
У меня также был час головной боли, пока я не понял, что ошибка была в символе "=" вместо "-" в имени схемы:
<assemblyBinding xmlns="urn:schemas=microsoft-com:asm.v1">
Просто внимательно проверьте все имена и значения атрибутов. Я думаю, что "PublicKeyToken" должен быть "publicKeyToken"
Это должно работать:
<configuration>
<runtime>
<assemblyBinding xmlns="urn:schemas-microsoft-com:asm.v1">
<dependentAssembly>
<assemblyIdentity name="Microsoft.AnalysisServices" publicKeyToken="89845dcd8080cc91" />
<bindingRedirect oldVersion="10.0.0.0" newVersion="9.0.0.0"/>
</dependentAssembly>
</assemblyBinding>
</runtime>
</configuration>
Ответ 2
Убедитесь, что тэг <configuration>
имеет атрибут пространства имен. В противном случае тег <assemblyBinding>
будет проигнорирован.
Неправильно:
<configuration xmlns="http://schemas.microsoft.com/.NetConfiguration/v2.0">
Справа:
<configuration>
(из fooobar.com/questions/25420/...)
Ответ 3
Я обнаружил, что перенаправление привязки сборки не работает из-за отсутствия пространства имен в элементе assemblyBinding.
Правильный
<assemblyBinding xmlns="urn:schemas-microsoft-com:asm.v1">
<dependentAssembly>
<assemblyIdentity name="TIBCO.Rendezvous" publicKeyToken="1a696d1f90f6158a"/>
<bindingRedirect oldVersion="1.0.0.0-1.0.3191.28836" newVersion="1.0.3191.28836"/>
</dependentAssembly>
некорректный
Примечание отсутствует: xmlns = "urn: schemas-microsoft-com: asm.v1"
<assemblyBinding>
<dependentAssembly>
<assemblyIdentity name="TIBCO.Rendezvous" publicKeyToken="1a696d1f90f6158a"/>
<bindingRedirect oldVersion="1.0.0.0-1.0.3191.28836" newVersion="1.0.3191.28836"/>
</dependentAssembly>
Ответ 4
в моем случае мне пришлось удалить
appliesTo="v2.0.05727"
от
<assemblyBinding appliesTo="v2.0.05727" xmlns="urn:schemas-microsoft-com:asm.v1">
Ответ 5
Моя проблема была решена, когда я перевел привязку конфигурации перенаправления к файлу machine.config.
Ответ 6
У меня была аналогичная проблема, когда перемещение bindredirects к Machine.Config было единственным, что сработало. Это не было идеальным решением в моем приложении winform, потому что я распространяю свое приложение на клиентов.
Решение:
Убедитесь, что файл .config находится в каталоге, из которого выполняется ваше приложение. например если ваше AppName - "MyApp", то перенаправление должно быть в файле "MyApp.exe.Config" в каталоге приложения.
Я должен был это сделать, даже если код, использующий сторонние DLL файлы, находится в разных dll в моем решении, и добавление .dll.config не помогло.
Ответ 7
Эксцентричные политики паролей также могут привести к игнорированию элементов assemblyBinding в конфигурации. Такие персонажи, как '&' и '^', по-видимому, не разрешены в файле конфигурации. XML-инструменты в Notepad ++ показали это мне после нескольких часов работы с инструментом просмотра привязки к сборке.
Ответ 8
Если вы установите Visual Studio 2017 без части инструментов разработки ASP.NET, он все равно загрузит веб-проект, скомпилирует и соберет его. Он просто выдаст предупреждения о версиях пакета NuGet, потому что он не знает, что делать с файлом web.config, и поэтому не может видеть перенаправления привязки.
Исправление установки решило мою проблему, но потребовалось много времени, чтобы понять.
![Visual Studio Installer screenshot]()
Ответ 9
Если это кому-то поможет, я столкнулся с этим, потому что я не ввел полную версию для newVersion. то есть я имел newVersion="3.0.1"
вместо newVersion="3.0.1.0"
Ответ 10
Проверьте, если ошибка
Явное связывание переадресации на xxx, Culture = neutral, PublicKeyToken = xxx "конфликтует с аутогенерированным переадресацией привязок
появится в окне вывода (оно не появится в окне ошибки)
Ответ 11
Большое спасибо за ответы, особенно от Шрайка. У меня было одно приложение, которое работало в разработке, но не в развернутой версии. Когда я посмотрел более внимательно, у меня было это в производстве, которое НЕ соответствовало разработке:
<runtime>
<assemblyBinding xmlns="urn:schemas-microsoft-com:asm.v1">
<dependentAssembly xmlns="">
<assemblyIdentity name="Newtonsoft.Json" culture="neutral" publicKeyToken="30ad4fe6b2a6aeed" />
<bindingRedirect oldVersion="0.0.0.0-10.0.0.0" newVersion="10.0.0.0" />
</dependentAssembly>
</assemblyBinding>
</runtime>
зависимый сборщик xmlns = "" был виновником. Как только я сравнил свой с вашим ответом и исправил это, он работал. Спасибо за помощь
Ответ 12
Еще одно решение для тех, кто тоже борется
Убедитесь, что каждая <dependentAssembly>
<assemblyIdentity>
имеет только одну <assemblyIdentity>
и одну <bindingRedirect>
. В моем сценарии у меня было два в одном, что вызывало каскадный сбой нескольких перенаправлений привязки
<dependentAssembly>
<assemblyIdentity name="System.Net.Http.Formatting" publicKeyToken="31bf3856ad364e35" culture="neutral" />
<bindingRedirect oldVersion="0.0.0.0-5.2.3.0" newVersion="5.2.3.0" />
<assemblyIdentity name="SimpleInjector" publicKeyToken="984cb50dea722e99" culture="neutral" />
<bindingRedirect oldVersion="0.0.0.0-4.4.2.0" newVersion="4.4.2.0" />
</dependentAssembly>
Это означало, что вместо моей привязки SimpleInjector
к 4.4.2.0 он привязывался к 5.2.3.0, что привело к ошибке, сообщающей, что он не может правильно привязать System.Web.Mvc, скрывая истинную проблему