Имя пользователя:
Пароль:  
Помощь | Регистрация | Забыли пароль?  

Показать сообщение отдельно


Moderator


Сообщения: 53585
Благодарности: 15543

Профиль | Отправить PM | Цитировать


Цитата Demetriadis:
Исполняемый файл (exe файл) игры в общем случае не обладает такой логикой и не читает манифесты
Это логика функций операционной системы.

Возьмем для примера какую-нибудь старую программу, типа 3DMark 2006.
В ее файлах Exporter.dll и SI3.dll есть манифесты с зависимостями:
Код: Выделить весь код
<dependency>
  <dependentAssembly>
    <assemblyIdentity type="win32" name="Microsoft.VC80.CRT" version="8.0.50608.0" processorArchitecture="x86" publicKeyToken="1fc8b3b9a1e18e3b"></assemblyIdentity>
  </dependentAssembly>
</dependency>
Версия VC 2005 8.0.50608.0 не установлена в системе. Значит, по-вашему программа запускаться не будет?

Но есть VC 2005 8.0.50727.6195 (соответствует SP1 с MFC Security Update). Там в файле x86_policy.8.0.microsoft.vc80.crt_1fc8b3b9a1e18e3b_8.0.50727.6195_none_517205a10f4550e3.manifest директива bindingRedirect:
Код: Выделить весь код
<bindingRedirect oldVersion="8.0.41204.256-8.0.50608.0" newVersion="8.0.50727.6195"/>
<bindingRedirect oldVersion="8.0.50727.42-8.0.50727.6195" newVersion="8.0.50727.6195"/>
Кроме того, в составе Windows 8 есть сборка Microsoft.VC80.CRT 8.0.50727.6910 и в файле x86_policy.8.0.microsoft.vc80.crt_1fc8b3b9a1e18e3b_8.0.50727.6910_none_516a74190f4c088e.manifest директива bindingRedirect:
Код: Выделить весь код
<bindingRedirect oldVersion="8.0.41204.256-8.0.50608.0" newVersion="8.0.50727.6910"/>
<bindingRedirect oldVersion="8.0.50727.42-8.0.50727.6910" newVersion="8.0.50727.6910"/>
Так что программа запустится: операционная система вместо старой сборки 8.0.50608.0 загрузит последнюю 8.0.50727.6910.
Если вы по-прежнему мне не верите, вот события из Process Monitor:
Код: Выделить весь код
3DMark06.exe	4048	Load Image	C:\Windows\WinSxS\x86_microsoft.vc80.crt_1fc8b3b9a1e18e3b_8.0.50727.6910_none_d089c358442de345\msvcp80.dll	SUCCESS	Image Base: 0x6aae0000, Image Size: 0x87000	0.0000000
3DMark06.exe	4048	Load Image	C:\Windows\WinSxS\x86_microsoft.vc80.crt_1fc8b3b9a1e18e3b_8.0.50727.6910_none_d089c358442de345\msvcr80.dll	SUCCESS	Image Base: 0x689e0000, Image Size: 0x9b000	0.0000000
P. S. Возможно, поэтому Microsoft в VC 2010 и более новых отказалась от Side-by-side. Смысла нет, ведь все равно используется последняя сборка.
Игры/приложения, требующие VC 2012, просто грузят нужные им библиотеки из System32 (или SysWOW64 в зависимости от разрядности игры/приложения).
Это сообщение посчитали полезным следующие участники:

Отправлено: 11:41, 05-02-2014 | #7