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
:
如果我没记错的话,如果应用程序在其清单中指定了依赖项,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
: