Windows 7和Windows Server 2008 R2中WinSxS行为不同

3

我有一个可执行文件,其清单表明它依赖于

Microsoft.VC90.CRT 9.0.21022.8
Microsoft.VC90.CRT 9.0.30729.1

在Windows 7上,此可执行文件可以正常运行。 在Windows Server 2008 R2上,此可执行文件无法运行,并显示以下消息:
“应用程序无法启动,因为其配对配置不正确。请参阅应用程序事件日志或使用命令行sxstrace.exe工具获取更多详细信息。”
这是出乎意料的 - 我认为Windows 7和Windows Server 2008 R2在运行时可用性方面应该非常相似。两台机器都非常干净。Windows 7机器是全新安装,没有安装任何软件。Windows Server 2008 R2机器只安装了一些来自Windows Update的更新。
我检查了Windows 7机器的WinSxS目录,发现
Microsoft VC90.CRT 9.0.30729.4926

我检查了Windows Server 2008 R2机器的WinSxS目录,并发现

Microsoft VC90.CRT 9.0.30729.4926

在清单中指定的运行时版本较旧,但实际安装的运行时版本更高,然而 Windows Server 2008 R2 系统无法重定向到新的运行时版本。在 Windows Server 2008 R2 上运行 sxstrace 的结果如下:

INFO: Applying Binding Policy
    INFO: No publisher policy found.
    INFO: No binding policy redirect found.

在Windows 7上运行sxstrace会得到以下结果:
INFO: Applying Binding Policy
    INFO: Find publisher policy at C:\Windows\WinSxS\manifest\amd64...
    INFO: Publisher Policy redirected assembly version.
    INFO: Post policy assembly identity is...

除了安装VS 2008运行时和VS 2008 SP1运行时,还有什么其他方法可以解决这个问题吗?我以为程序集的整个理念就是允许系统覆盖旧的运行时并替换成新的运行时。

我也遇到了这个问题。我已经比较了Win7和Server 2008 R2机器之间的SXS目录,它们看起来是一样的。此外,错误似乎只出现在Server 2008 R2上 - 我在Windows Vista、Server 2008(非R2)、Windows 8(和8.1)、Server 2012(和R2)上进行了测试,这些都有C++运行时30729版本,并且都可以正确重定向。只有Server 2008 R2存在这个问题 :-( - Orion Edwards
2个回答

0

尽管原则上WinSxS允许兼容的新版本程序集替换旧版本,但VS运行时不使用此功能,并且仅绑定到它们编译的相同版本。要么重新编译应用程序的所有组件以针对库的相同版本(可能是最好的选择,以避免多个malloc堆问题),要么安装两个运行时。


1
似乎不是这种情况——exe文件链接了9.0.21022.8和9.0.30729.1,但在一个只有WinSxS目录中的9.0.30729.4926的干净的Windows 7机器上运行。 - likso
SxS组件集具有发布者策略,可将旧版本重定向到新版本--这不会自动发生。看起来2008 R2缺少msvc运行时的此类策略。 - Eugene

0

您可以将VC++运行时dll文件放置在应用程序的可执行目录中,这样应该就可以正常工作了。 您需要2个dll文件(MSVCR和MSVCP)以及清单文件。我想,只需将这3个文件全部放入应用程序的可执行目录中即可解决问题。


请确保在清单文件中更新版本号,以匹配可执行文件链接的版本号,否则它也无法找到它。 - Eugene

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接