Почему применяется перенаправление DotLocal, даже если у exe есть манифест - PullRequest
1 голос
/ 13 апреля 2019

В соответствии с документацией Microsoft , перенаправление .local отключено, когда приложение имеет манифест. Но я заметил, что даже если EXE-файл имеет встроенный манифест, если в каталоге приложения есть папка <exe name>.exe.local, перенаправление все еще применяется.

Например, вот встроенный манифест для foo.exe:

<?xml version='1.0' encoding='UTF-8' standalone='yes'?>
<assembly xmlns='urn:schemas-microsoft-com:asm.v1' manifestVersion='1.0'>
  <trustInfo xmlns="urn:schemas-microsoft-com:asm.v3">
    <security>
      <requestedPrivileges>
        <requestedExecutionLevel level='asInvoker' uiAccess='false' />
      </requestedPrivileges>
    </security>
  </trustInfo>
  <dependency>
    <dependentAssembly>
      <assemblyIdentity type='win32' name='Microsoft.Windows.Common-Controls' version='6.0.0.0' processorArchitecture='*' publicKeyToken='6595b64144ccf1df' language='*' />
    </dependentAssembly>
  </dependency>
</assembly>

Если я помещу папку foo.exe.local в каталог приложения, Windows попытается загрузить comctl32.dll из foo.exe.local\amd64_microsoft.windows.common-controls_6595b64144ccf1df_6.0.17763.437_none_05b63dca071e5dd6\comctl32.dll, а не из папки C:\Windows\WinSxS.

Я проверял это на Windows 10 x64 версии 10.0.17763.437 и на Windows 7 x86 с последними исправлениями.

Так почему же все еще следует перенаправление * 1019? Как изменить манифест, чтобы полностью отключить .local? 1021 *

1 Ответ

2 голосов
/ 22 мая 2019

Я также наблюдал такое же поведение. Я хотел бы знать, если кто-нибудь знает, как отключить перенаправление Windows .local ("dotLocal") - я считаю, что это побочный эффект параллельной загрузки WinSxS.

Я тестировал на Windows 10 x64, версия 10.0.17763.503.

Обратите внимание, что я обнаружил, что могу использовать недокументированную функцию " loadFrom " манифеста, чтобы заставить COMCTL32.DLL загружаться из каталога \ Windows \ System32. Однако это работает только в том случае, если исполняемый файл не требует визуальных стилей и может использовать COMCTL32 версии 5.x.

<?xml version='1.0' encoding='UTF-8' standalone='yes'?>
<assembly xmlns='urn:schemas-microsoft-com:asm.v1' manifestVersion='1.0'>
  <trustInfo xmlns="urn:schemas-microsoft-com:asm.v3">
   <security>
     <requestedPrivileges>
      <requestedExecutionLevel level='asInvoker' uiAccess='false' />
     </requestedPrivileges>
   </security>
  </trustInfo>
  <file name="comctl32.dll" loadFrom="%SystemRoot%\System32\" />
</assembly>
...