Не удалось загрузить файл или сборку "Microsoft.Practices.Unity"

Я пытаюсь обновить Unity до версии (2.1.505.2), но когда я запускаю приложение, я получаю следующее FileLoadException

Не удалось загрузить файл или сборку "Microsoft.Practices.Unity, версия =2.0.414.0, культура = нейтральная, PublicKeyToken=31bf3856ad364e35" или одна из ее зависимостей.

Мы обновляем Unity 2.0.414.0 до 2.1.505.2.

  • Все ссылки на проекты в решении, которые ссылаются на Unity, ссылаются на правильную версию DLL
  • В Gac нет ссылок на Unity dll. (дважды проверено проверкой gacutil -l)
  • Я удалил все библиотеки Unity из архива. Двойная проверка с PowerShell

    PS C:\> ls -rec -inc Microsoft.Practices.Unity.dll | foreach-object { "{0}`t{1}" -f $_.FullName, [System.Diagnostics.FileVersionInfo]::GetVersionInfo($_).FileVersion }
    

Как я могу узнать, что / кто все еще относится к Unity 2.0.414.0?

FusionLogVw не говорит мне, какая DLL вызывает проблему.

Любая помощь высоко ценится!

7 ответов

Решение

Проблема была в другом Microsoft DLL, который ссылается на старую версию единства. Я обнаружил, что это было случайно, проверяя пространства имен каждой упомянутой библиотеки DLL, и нашел другую библиотеку DLL, которая содержала пространства имен с "единством".

Обновление:

  • Microsoft.Practices.EnterpriseLibrary.Common
  • Microsoft.Practices.EnterpriseLibrary.Validation

до последних выпущенных версий решена проблема.

Я надеюсь, что сэкономлю этот день для какой-то потерянной души, которая также тянет свои волосы над этой проблемой...:)

Вы должны добавить редирект к правильной сборке:

Но ОБРАТИТЕ ВНИМАНИЕ, что версия 2.1.505.0 должна использоваться в перенаправлении!

<assemblyBinding xmlns="urn:schemas-microsoft-com:asm.v1">
    <assemblyIdentity name="Microsoft.Practices.Unity" publicKeyToken="31bf3856ad364e35" culture="neutral" />
    <bindingRedirect oldVersion="0.0.0.0-2.1.505.0" newVersion="2.1.505.0" />
  </dependentAssembly>
</assemblyBinding>

Вы не можете установить 2.1.505.2 по следующей причине:

Сборка Unity 2.1.505.2 содержит разные версии для AssemblyFileVersion и AssemblyVersion.

CLR не заботится о AssemblyFileVersion, поэтому используется только AssemblyVersion! И AssemblyFileVersion используется только nuget!

Если у вас есть resharper, вы можете удалить ссылку на проблему, собрать, перейти к классу, где он используется (есть ошибка), и получить resharper, чтобы исправить это за вас.

Спасает суету, но я ценю, что не у всех есть резкость:D

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

Как найти то, что зависит от конкретной версии конкретной зависимости?

Что относится к использованию Fuslogvw.exe

Обзор: это был чей-то код, мне пришлось исправить ошибку в коде, поэтому они предоставили мне zip-файл приложения.

Я понятия не имел, что происходит и почему всегда в первый раз мой код работал, и после перезапуска приложения (после внесения каких-либо изменений) оно начало выдавать Exception. Есть много возможных решений, представленных на форумах, и я обвинял свой код и базу данных, а затем начал отменять каждый шаг, который я сделал. Но это не помогает

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

Для каждой новой сборки папка bin моего приложения удаляет DLL

тогда решение состоит в том, чтобы вставить эти dll в папку bin приложений и пересобрать код (см. скриншот)

результат: все пошло

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

Я не смог исправить это с помощью обновления EnterpriseLibrary в принятом решении. В итоге я просто переопределил зависимую версию сборки в app.config, вы могли сделать что-то подобное, чтобы заставить любую библиотеку, которая жалуется на версию, использовать другую версию.

App.config:

  <dependentAssembly>
    <assemblyIdentity name="Unity.Container" publicKeyToken="489B6ACCFAF20EF0" culture="neutral"/>
    <bindingRedirect oldVersion="0.0.0.0-5.8.11.0" newVersion="5.8.11.0"/>
  </dependentAssembly>

Проверьте ваш app.config/web.config и, конечно, ссылки на ваш проект.

Другие вопросы по тегам