Как разрешить «две сборки с одинаковыми именами»

#windows #dll #manifest #sxs

#Windows #dll #манифест #sxs

Вопрос:

У меня есть приложение, которое использует версию 8.0.50727.5592 CRT. Одна из зависимых библиотек использует версию 8.0.50727.762. Когда я запускаю приложение на компьютере с установленной версией 8.0.50727.4940, я получаю ошибку «неправильная конфигурация side-by-side». Используя sxstrace, я получаю следующий результат:

 =================
Begin Activation Context Generation.
Input Parameter:
    Flags = 0
    ProcessorArchitecture = AMD64
    CultureFallBacks = en-US;en
    ManifestPath = F:TempTemp.exe
    AssemblyDirectory = F:Temp
    Application Config File = F:TempTemp.exe.Config
-----------------
INFO: Parsing Application Config File F:TempTemp.exe.Config.
INFO: Parsing Manifest File F:TempTemp.exe.
    INFO: Manifest Definition Identity is (null).
    INFO: Reference: Microsoft.VC80.CRT,processorArchitecture="amd64",publicKeyToken="1fc8b3b9a1e18e3b",type="win32",version="8.0.50727.762"
    INFO: Reference: Microsoft.VC80.CRT,processorArchitecture="amd64",publicKeyToken="1fc8b3b9a1e18e3b",type="win32",version="8.0.50727.5592"
INFO: Resolving reference Microsoft.VC80.CRT,processorArchitecture="amd64",publicKeyToken="1fc8b3b9a1e18e3b",type="win32",version="8.0.50727.762".
    INFO: Resolving reference for ProcessorArchitecture amd64.
        INFO: Resolving reference for culture Neutral.
            INFO: Applying Binding Policy.
                INFO: Find publisher policy at C:WindowsWinSxSmanifestsamd64_policy.8.0.microsoft.vc80.crt_1fc8b3b9a1e18e3b_8.0.50727.4940_none_09c03a53facd313f.manifest
                INFO: Publisher Policy redirected assembly version.
                INFO: Post policy assembly identity is Microsoft.VC80.CRT,processorArchitecture="amd64",publicKeyToken="1fc8b3b9a1e18e3b",type="win32",version="8.0.50727.4940".
            INFO: Begin assembly probing.
                INFO: Attempt to probe manifest at C:WindowsWinSxSmanifestsamd64_microsoft.vc80.crt_1fc8b3b9a1e18e3b_8.0.50727.4940_none_88df89932faf0bf6.manifest.
                INFO: Manifest found at C:WindowsWinSxSmanifestsamd64_microsoft.vc80.crt_1fc8b3b9a1e18e3b_8.0.50727.4940_none_88df89932faf0bf6.manifest.
            INFO: End assembly probing.
INFO: Resolving reference Microsoft.VC80.CRT.mui,language="amp;#x2a;",processorArchitecture="amd64",publicKeyToken="1fc8b3b9a1e18e3b",type="win32",version="8.0.50727.4940".
    INFO: Resolving reference for ProcessorArchitecture amd64.
        INFO: Resolving reference for culture en-US.
            INFO: Applying Binding Policy.
                INFO: No publisher policy found.
                INFO: No binding policy redirect found.
            INFO: Begin assembly probing.
                INFO: Did not find the assembly in WinSxS.
                INFO: Attempt to probe manifest at C:WindowsassemblyGAC_64Microsoft.VC80.CRT.mui8.0.50727.4940_en-US_1fc8b3b9a1e18e3bMicrosoft.VC80.CRT.mui.DLL.
                INFO: Did not find manifest for culture en-US.
            INFO: End assembly probing.
        INFO: Resolving reference for culture en.
            INFO: Applying Binding Policy.
                INFO: No publisher policy found.
                INFO: No binding policy redirect found.
            INFO: Begin assembly probing.
                INFO: Did not find the assembly in WinSxS.
                INFO: Attempt to probe manifest at C:WindowsassemblyGAC_64Microsoft.VC80.CRT.mui8.0.50727.4940_en_1fc8b3b9a1e18e3bMicrosoft.VC80.CRT.mui.DLL.
                INFO: Did not find manifest for culture en.
            INFO: End assembly probing.
INFO: Resolving reference Microsoft.VC80.CRT,processorArchitecture="amd64",publicKeyToken="1fc8b3b9a1e18e3b",type="win32",version="8.0.50727.5592".
    INFO: Resolving reference for ProcessorArchitecture amd64.
        INFO: Resolving reference for culture Neutral.
            INFO: Applying Binding Policy.
                INFO: No binding policy redirect found.
            INFO: Begin assembly probing.
                INFO: Did not find the assembly in WinSxS.
                INFO: Attempt to probe manifest at C:WindowsassemblyGAC_64Microsoft.VC80.CRT8.0.50727.5592__1fc8b3b9a1e18e3bMicrosoft.VC80.CRT.DLL.
                INFO: Attempt to probe manifest at F:TempMicrosoft.VC80.CRT.DLL.
                INFO: Attempt to probe manifest at F:TempMicrosoft.VC80.CRT.MANIFEST.
                INFO: Attempt to probe manifest at F:TempMicrosoft.VC80.CRTMicrosoft.VC80.CRT.DLL.
                INFO: Attempt to probe manifest at F:TempMicrosoft.VC80.CRTMicrosoft.VC80.CRT.MANIFEST.
                INFO: Manifest found at F:TempMicrosoft.VC80.CRTMicrosoft.VC80.CRT.MANIFEST.
            INFO: End assembly probing.
ERROR: Two assemblies have the same assembly name with different version. Assembly 1: F:TempMicrosoft.VC80.CRTMicrosoft.VC80.CRT.MANIFEST. Assembly 2: INFO: Manifest found at F:TempMicrosoft.VC80.CRTMicrosoft.VC80.CRT.MANIFEST..
ERROR: Activation Context generation failed.
End Activation Context Generation.
  

Для меня похоже, что зависимость от версии 762 «обновляется» до версии 4940, тогда как зависимость от 5592, очевидно, не может быть.

Я скопировал папку «Microsoft.VC80.CRT», содержащую версию 5592 CRT, в папку моего приложения (т. Е. Развертывание сборок как частных сборок). Кажется, что это распознано в конце, где sxstrace говорит:

 INFO: Manifest found at F:TempMicrosoft.VC80.CRTMicrosoft.VC80.CRT.MANIFEST.
  

Увы, по какой-то причине это не отображается при разрешении ссылки на версию 762. Как я могу заставить ссылку на версию 762 указывать на версию 5592, которая распространяется вместе с моим приложением?

Я ошибаюсь в том, в чем, по моему мнению, проблема?

Спасибо за вашу помощь!

Ответ №1:

На компьютере просто отсутствует версия DLL, необходимая вашему приложению. Нет особого смысла пытаться обойти это, это не приведет к хорошему концу. Просто разверните версию .5592 библиотеки CRT. Эта версия будет включать политику, которая перенаправляет .792 на .5592, чтобы все использовали одну и ту же DLL.

Комментарии:

1. На самом деле я включаю версию 5592 в дистрибутив прямо сейчас. По какой-то причине похоже, что система переключает 762 на 4940, прежде чем поймет, что я включил 5592. Есть идеи, почему это может происходить случайно?

2. Это поиск политики для 4940, а не для 5592. Вероятно, это старая сборка, которая уже была на компьютере. Не забудьте включить модуль слияния для политики в свой установщик.

3. Это может быть проблемой. На данный момент я использую NSIS и просто копирую папку CRT в свою папку program. Нужно ли будет менять установщиков, или есть какой-то другой способ, которым я могу решить эту проблему?

4. Есть идеи, возможно ли решить эту проблему без модулей слияния? На данный момент было бы непросто переключиться на MSI, и у меня сложилось впечатление, что я должен иметь возможность развертывать с использованием частных сборок — что, как я думал, я и делаю.

5. Понятия не имею, модули слияния являются основным способом создания содержимого установщика. Если NSIS не знает, как с ними обращаться, в это трудно поверить, тогда избавьтесь от этого как можно скорее. Проект установки и развертывания Visual Studio выполняет это за несколько минут. Проект Добавить Объединить модуль. Выберите те из c:program файлы общие файлы модули слияния. Библиотеки DLL и политики. Снимите флажок с предварительного условия .NET.