windows 并排 (WinSxS) 机制如何工作?

How windows side by side (WinSxS) mechanism works?

如果我没记错的话,如果应用程序在其清单中指定了依赖项,Windows 加载程序将从 C:\Windows\WinSxS\xxx\ 文件夹中加载指定版本的 DLL。

当我研究 C:\Windows\System32\dccw.exe - 这是 windows 上的“显示颜色校准”应用程序时,我看到了这个奇怪的行为:

Application manifest has only one dependency - "Microsoft.Windows.Common-Controls"
 which is basically the - comctl32.dll

但是当你运行dccw.exe时,它会从WinSXS文件夹加载两个DLL; comctl32.dll 和预期的一样 GdiPlus.dll.

GdiPlus.dll 的依赖项不应该出现在清单中。还是我不明白 WinSxS 是如何正确工作的?

不需要在应用程序清单中指定所有依赖项。您可以添加一些但忽略其他的。

正如 Hans 在评论中提到的,WinSxS 下的 gdiplus 是指向 system32 中同一文件的硬链接:

    > C:\Windows\system32>fsutil.exe hardlink list GdiPlus.dll

    \Windows\WinSxS\amd64_microsoft.windows.gdiplus.systemcopy_31bf3856ad364e35_10.0.
         19041.1645_none_5b73408eab60fd9c\GdiPlus.dll
    \Windows\System32\GdiPlus.dll

因此,从功能上讲,加载该文件的哪个 'copy' 并不重要。


至于为什么进程似乎从 WinSxS 加载...两个硬链接 indistinguishable. There is nothing documented 表明默认情况下 WinSxS 将用作 DLL 搜索位置。

这可能正是 Process Monitor 选择报告文件位置的方式 (?)。如果您与(古老的)Dependency Walker 或 Dependencies 等其他工具进行比较,您会得到不同的结果。一个显示 WinSxS 位置,另一个显示 system32: