#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. Обязательно обновите версию внутри манифеста, чтобы она соответствовала версии, на которую ссылаются ваши исполняемые ссылки, иначе она также не будет найдена.