0

我使用 VS2005 为我正在开发的应用程序创建了一个安装项目,它可以在 Windows 2000 和 XP 上正常安装,但是当我尝试在 Vista 上运行安装程序时,会出现以下错误:

此 Windows Installer 程序包存在问题。无法运行完成此安装所需的程序。

此错误发生在安装过程的最后,在它已经将所有文件复制到磁盘之后,并且在它尝试运行我的自定义操作可执行文件时发生。

自定义操作二进制文件是一个名为 InstallCustom.exe 的文件,用 C++ 编写。它是非常基本的,只处理安装、提交、卸载和回滚操作,并且只设置一些注册表项并启动几个批处理脚本来完成安装。

我在安装过程中运行了 SXSTrace 以查看它失败的原因并得到以下跟踪:

=================
Begin Activation Context Generation.
Input Parameter:
    Flags = 0
    ProcessorArchitecture = x86
    CultureFallBacks = en-US;en
    ManifestPath = C:\Program Files\MyApp\InstallCustom.exe
    AssemblyDirectory = C:\Program Files\MyApp\
    Application Config File = 
-----------------
INFO: Parsing Manifest File C:\Program Files\MyApp\InstallCustom.exe.
    INFO: Manifest Definition Identity is (null).
    INFO: Reference: Microsoft.VC80.CRT,processorArchitecture="x86",publicKeyToken="1fc8b3b9a1e18e3b",type="win32",version="8.0.50727.4053"
INFO: Resolving reference Microsoft.VC80.CRT,processorArchitecture="x86",publicKeyToken="1fc8b3b9a1e18e3b",type="win32",version="8.0.50727.4053".
    INFO: Resolving reference for ProcessorArchitecture x86.
        INFO: Resolving reference for culture Neutral.
            INFO: Applying Binding Policy.
                INFO: Find publisher policy at C:\Windows\WinSxS\manifests\x86_policy.8.0.microsoft.vc80.crt_1fc8b3b9a1e18e3b_8.0.50727.1434_none_516c10c30f4aae68.manifest
                INFO: No binding policy redirect found.
            INFO: Begin assembly probing.
                INFO: Did not find the assembly in WinSxS.
                INFO: Attempt to probe manifest at C:\Windows\assembly\GAC_32\Microsoft.VC80.CRT\8.0.50727.4053__1fc8b3b9a1e18e3b\Microsoft.VC80.CRT.DLL.
                INFO: Attempt to probe manifest at C:\Program Files\MyApp\Microsoft.VC80.CRT.DLL.
                INFO: Attempt to probe manifest at C:\Program Files\MyApp\Microsoft.VC80.CRT.MANIFEST.
                INFO: Attempt to probe manifest at C:\Program Files\MyApp\Microsoft.VC80.CRT\Microsoft.VC80.CRT.DLL.
                INFO: Attempt to probe manifest at C:\Program Files\MyApp\Microsoft.VC80.CRT\Microsoft.VC80.CRT.MANIFEST.
                INFO: Did not find manifest for culture Neutral.
            INFO: End assembly probing.
    ERROR: Cannot resolve reference Microsoft.VC80.CRT,processorArchitecture="x86",publicKeyToken="1fc8b3b9a1e18e3b",type="win32",version="8.0.50727.4053".
ERROR: Activation Context generation failed.
End Activation Context Generation.

=================
Begin Activation Context Generation.
Input Parameter:
    Flags = 0
    ProcessorArchitecture = x86
    CultureFallBacks = en-US;en
    ManifestPath = C:\Program Files\MyApp\InstallCustom.exe
    AssemblyDirectory = C:\Program Files\MyApp\
    Application Config File = 
-----------------
INFO: Parsing Manifest File C:\Program Files\MyApp\InstallCustom.exe.
    INFO: Manifest Definition Identity is (null).
    INFO: Reference: Microsoft.VC80.CRT,processorArchitecture="x86",publicKeyToken="1fc8b3b9a1e18e3b",type="win32",version="8.0.50727.4053"
INFO: Resolving reference Microsoft.VC80.CRT,processorArchitecture="x86",publicKeyToken="1fc8b3b9a1e18e3b",type="win32",version="8.0.50727.4053".
    INFO: Resolving reference for ProcessorArchitecture x86.
        INFO: Resolving reference for culture Neutral.
            INFO: Applying Binding Policy.
                INFO: Find publisher policy at C:\Windows\WinSxS\manifests\x86_policy.8.0.microsoft.vc80.crt_1fc8b3b9a1e18e3b_8.0.50727.1434_none_516c10c30f4aae68.manifest
                INFO: No binding policy redirect found.
            INFO: Begin assembly probing.
                INFO: Did not find the assembly in WinSxS.
                INFO: Attempt to probe manifest at C:\Windows\assembly\GAC_32\Microsoft.VC80.CRT\8.0.50727.4053__1fc8b3b9a1e18e3b\Microsoft.VC80.CRT.DLL.
                INFO: Attempt to probe manifest at C:\Program Files\MyApp\Microsoft.VC80.CRT.DLL.
                INFO: Attempt to probe manifest at C:\Program Files\MyApp\Microsoft.VC80.CRT.MANIFEST.
                INFO: Attempt to probe manifest at C:\Program Files\MyApp\Microsoft.VC80.CRT\Microsoft.VC80.CRT.DLL.
                INFO: Attempt to probe manifest at C:\Program Files\MyApp\Microsoft.VC80.CRT\Microsoft.VC80.CRT.MANIFEST.
                INFO: Did not find manifest for culture Neutral.
            INFO: End assembly probing.
    ERROR: Cannot resolve reference Microsoft.VC80.CRT,processorArchitecture="x86",publicKeyToken="1fc8b3b9a1e18e3b",type="win32",version="8.0.50727.4053".
ERROR: Activation Context generation failed.
End Activation Context Generation.

如您所见,它无法找到 Microsoft.VC80.CRT,即 Visual C++ 运行时 dll。

奇怪的是这个运行时已经包含在安装程序中,通过添加合并模块:“Microsoft_VC80_CRT_x86.msm”和“policy_8_0_microsoft_vc80_crt_x86.msm”

但是,我怀疑这些合并模块在发生此错误之前实际上并没有得到应用......
但我无法弄清楚如何在 InstallCustom.exe 运行之前包含这些所需的文件。我什至尝试将运行时复制到安装之前文件所在的目录。

有没有办法解决这个问题?为什么这在 XP 和 2000 上不是问题,但在 Vista 上……我认为它应该有这个运行时。

4

1 回答 1

1

您应该使用 CRuntime 的静态版本(如果可能),最佳实践是自定义操作将具有尽可能少的先决条件。它会使自定义操作更大一点(在 10 KB 范围内),但这是值得的。


使用静态 CRuntime 库 goto 进行编译Project Properties\C/C++\Code Generation\Runtime Library。不要忘记,如果您的 exe 需要其他需要该版本 CRuntime 的 dll,他们还需要使用静态版本进行编译。

于 2009-11-11T13:51:58.587 回答