我对 SxS 绑定有一些奇怪的问题。我有依赖于 VC9 的 CRT、MFC 和 OpenMP 的供应商 DLL。最初这些 DLL 指向旧的 CRT (21022.8),但我更新了它们的清单以指向最新版本 (30729.6161)。我需要这些 DLL 在客户端机器上工作,而无需安装 VC9 可再发行组件(即非管理员安装)。很难在我的开发者机器上进行测试,因为我无法完全摆脱 VC9 可再发行组件:太多的应用程序正在使用它(例如 Everything 搜索、Google 备份)。我可以从 winsxs 中删除 MFC 和/或 OpenMP(以及随附的策略/清单文件)。
当我删除 OpenMP 时,我得到一个 SxS 配置错误,该错误显示在事件查看器中,我可以使用sxstrace.exe
. 这样做导致我将一个Microsoft.VC90.OpenMP.manifest
文件与 vcomp90.dll 一起放在我的应用程序旁边,这允许该应用程序使用本地 OpenMP。
但是当我删除 MFC 时,我没有收到并排错误。相反,我得到一个弹出对话框说The program can't start because mfc90.dll is missing from computer.
。即使将文件提供给我的应用程序Microsoft.VC90.MFC.manifest
,它也不会在可执行文件旁边找到 mfc90.dll。因为这不是一个并排错误,sxstrace.exe
所以没有告诉我任何事情。
当我使用 Process Monitor 监视 DLL 访问时,我看到它绑定到 winsxs 中的 VC90.CRT(我无法摆脱它,因为它正在使用中)。然后,不看本地目录,在winsxs中找mfc90.dll,没有找到,然后不找其他地方就报错了。
为什么它会这样,我该如何解决?
编辑:我不知道它是否相关,但供应商 DLL 是基于 COM 的,我已使用 Interop DLL 包装/隔离。所以我实际上只The program can't start
在它尝试创建 COM 对象时得到错误。