Разное поведение WinSxS в Windows 7 и Windows Server 2008 R2

#windows #assemblies #manifest #winsxs

#Windows #сборки #манифест #winsxs

Вопрос:

У меня есть исполняемый файл, в манифесте которого указано, что это зависит от

 Microsoft.VC90.CRT 9.0.21022.8
Microsoft.VC90.CRT 9.0.30729.1
  

В Windows 7 этот исполняемый файл запускается без проблем.
В Windows Server 2008 R2 этот исполняемый файл не запускается с сообщением:

Приложению не удалось запуститься, поскольку его параллельная конфигурация неверна. Пожалуйста, просмотрите журнал событий приложения или воспользуйтесь командной строкой sxstrace.exe инструмент для получения более подробной информации.

Это было неожиданно — я думал, что Windows 7 и Windows Server 2008 R2 должны быть очень похожи в отношении доступности во время выполнения. Обе машины довольно чистые. Компьютер с Windows 7 является новой установкой, на нем ничего нет. На компьютере с Windows Server 2008 R2 установлены только некоторые обновления из Центра обновления Windows.

Я проверил каталог WinSxS на компьютере с Windows 7 и обнаружил

 Microsoft VC90.CRT 9.0.30729.4926
  

Я проверил каталог WinSxS на компьютере с Windows Server 2008 R2 и обнаружил

 Microsoft VC90.CRT 9.0.30729.4926
  

Присутствующая среда выполнения новее, чем указано в манифесте, и все же системе Windows Server 2008 R2 не удается перенаправить на более новую среду выполнения. Запуск sxstrace в Windows Server 2008 R2 показывает:

 INFO: Applying Binding Policy
    INFO: No publisher policy found.
    INFO: No binding policy redirect found.
  

Запуск sxstrace в Windows 7 дает:

 INFO: Applying Binding Policy
    INFO: Find publisher policy at C:WindowsWinSxSmanifestamd64...
    INFO: Publisher Policy redirected assembly version.
    INFO: Post policy assembly identity is...
  

Есть идеи, как это можно решить, помимо установки среды выполнения VS 2008 и среды выполнения VS 2008 SP1? Я думал, что вся идея сборок заключалась в том, что она позволяла системе переопределять старые среды выполнения и заменять их более новыми.

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

1. Я тоже испытываю это. Я сравнил каталоги SXS на компьютерах Win7 и Server 2008 R2, и они кажутся одинаковыми. Кроме того, ошибка кажется изолированной только для server 2008 R2 — я тестировал на Windows Vista, Server 2008 (не R2), Windows 8 (и 8.1), Server 2012 (и R2), и все они имеют версию 30729 среды выполнения C , и все перенаправляют соответствующим образом. Только server 2008 R2 имеет эту проблему:-(

Ответ №1:

Хотя в принципе WinSxS позволяет совместимым новым версиям сборок заменять старые версии, среды выполнения VS не используют эту функциональность и привязываются только к той же версии, для которой они были скомпилированы. Либо перекомпилируйте все компоненты вашего приложения с использованием одной и той же версии библиотеки (вероятно, лучше всего, чтобы избежать проблем с несколькими кучами malloc), либо установите обе среды выполнения.

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

1. похоже, что это не так — исполняемый файл связан с 9.0.21022.8 и 9.0.30729.1, но запускается на чистом компьютере с Windows 7, на котором в каталоге WinSxS есть только 9.0.30729.4926.

2. Сборки SxS имеют политики издателя, которые перенаправляют старые версии на более новую — это не происходит автоматически. Похоже, в 2008 R2 отсутствует такая политика для среды выполнения msvc.

Ответ №2:

Вы можете поместить библиотеки DLL среды выполнения VC в исполняемый каталог вашего приложения, и это должно сработать. Вам также понадобятся 2 библиотеки DLL (MSVCR и MSVCP) и манифест. Мне кажется, что простое помещение всех 3 этих файлов в исполняемый каталог приложения должно сработать

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

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