首页 > 解决方案 > 为什么即使 exe 有清单也应用 DotLocal 重定向

问题描述

根据 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.dllfoo.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 上对此进行了测试。

那么为什么.local仍然遵循重定向?如何更改清单以.local完全禁用?

标签: windowsdllmanifest

解决方案


我也观察到了同样的行为。我很想知道是否有人知道如何禁用 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>

推荐阅读