Windows Installer 部署疑难解答

更新:2007 年 11 月

本节中的主题涵盖了在创建部署项目和部署应用程序时可能遇到的各种问题。

当安装在区域设置不是英语的计算机上时,MFC 应用程序未进行本地化

使用 Visual Studio 部署项目来部署 MFC 应用程序时,未检测到已本地化的合并模块 Mfc_loc_e.msm 和 Mfc_loc_fe.msm 的依赖项。合并模块包含在 Visual C++ 中;默认安装位置是 \Program File\Common\Merge Modules。为了分发已本地化的 MFC 应用程序,必须将这两个合并模块手动添加到您的部署项目中。有关更多信息,请参见部署和依赖项

未检测到程序集依赖项

在部署项目中添加项目输出组、程序集或合并模块后,会自动检测所有依赖程序集,并将检测到的程序集添加到该项目中。如果依赖的程序集是在运行时通过代码方式加载的,则部署工具无法检测到它。应该避免通过代码加载程序集,如果可能,将依赖程序集手动添加到您的部署项目中。有关更多信息,请参见部署和依赖项

安装之后无法在 Web 服务器上找到文件

将 Web 安装程序安装到 Web 服务器上时,Web 应用程序文件夹和任何 Web 自定义文件夹的“VirtualDirectory”属性将确定这些文件夹中的文件相对于 Web 根文件夹的安装位置。如果此属性保留为空,文件将安装在 Web 根文件夹 (inetpub\wwwroot) 中。有关更多信息,请参见 VirtualDirectory 属性

如何将 Web 应用程序安装到 Web 服务器根目录?

默认情况下,使用 Web 安装程序部署项目安装 Web 应用程序时,文件将安装在 Web 根文件夹下与部署项目同名的文件夹中。Web 应用程序文件夹的 VirtualDirectory 属性决定了文件的安装位置。若要安装到 Web 根目录下,请将“VirtualDirectory”属性更改为 null(删除默认值)。有关更多信息,请参见 VirtualDirectory 属性

使用 Xcopy 命令部署的 Web 应用程序无法调试

当使用 Xcopy 命令将 Web 应用程序复制到 Web 服务器时,并不自动为应用程序配置 Internet 信息服务 (IIS)。由于应用程序文件夹没有被识别为应用程序的根文件夹,所以调试将无法进行。

复制之后,必须使用 IIS 管理器将新文件夹设置为应用程序根文件夹。此外,还应设置应用程序的 Bin 文件夹的权限以防止下载 DLL。

提示:

可以考虑使用“复制项目”命令或 Web 安装程序部署项目,而不是使用 Xcopy 命令。有关更多信息,请参见 其他部署方法

如何关闭依赖项分析?

遗憾的是,没有直接关闭依赖项分析的搜索和解析的方式。但是,可以采用以下解决方法:清除在单击“SearchPath”属性时出现的对话框中的“包括标准搜索路径”选项。

还应当考虑另外几个要点:

  • 必须使用“添加文件”命令(从“项目”菜单中选择“添加”,再选择“文件”)来添加文件。如果使用“添加项目输出”(从“项目”菜单中选择“添加”,再选择“项目输出”),就会包括代码项目报告的依赖项。

  • 在生成过程中,您可能会看见一个或多个“无法找到依赖项”警告,但是在这种情况下可以忽略这些警告。

  • 如果您只想针对某些文件关闭依赖项分析功能,则可以将这些文件放入一个关闭了标准搜索路径的合并模块项目,然后使用“添加合并模块”(从“项目”菜单中选择“添加”,再选择“添加合并模块”)将 .msm 包括在一个打开了标准搜索路径的常规安装项目中。

如何关闭对用户应修改或删除的文件的修复?

Visual Studio 会创建建议的快捷方式,以便在程序启动时验证它的所有文件是否都存在。若要更改此行为,使 Visual Studio 不修复该文件,请选择安装项目中的文件,并将“Condition”属性更改为“NOT REINSTALL”,以便在修复时不会重新安装该文件,并将“Transitive”属性设置为“TRUE”,以便重新评估该条件。这样操作后,安装程序会在屏幕上闪烁片刻,这是删除该文件后第一次显示安装程序;此时,它会验证是否应当重新安装该文件,此后您就不会再看到该安装程序。

如何调试自定义操作/安装程序类?

可以使用下列方法之一:

  • 在您的代码中添加对 System.Diagnostics.Debugger.Launch 的调用。此方法会打开实时调试,并允许您将新的调试器附加到您的代码。

  • 在您的代码中添加对 MessageBox.Show("Debug Me") 的调用。当显示消息框时,使用 Visual Studio 附加到 MessageBox 进程,然后在代码中添加断点(对于 Visual C# 项目)或停止点(对于 Visual Basic 项目)。

  • 将调试首选项设置为启动 InstallUtil.exe(位于 \winnt\Microsoft.net\Framework\版本),并将其作为参数传递给程序集。按 F5 时,命中断点。InstallUtil.exe 将像 MSI 一样运行自定义操作。

用 COM 接口注册程序集不起作用

这是已知的 RegAsm Bug。如果程序集具有依赖项(例如,依赖于另一个类库),那么,当调用 RegAsm 来获取注册信息时,可能会导致 RegisterCOM 失效。RegAsm 是在 \obj 目录中调用的,因此无法找到依赖项,RegAsm 失败且不会发出通知。最好的解决办法是从 \bin 目录手动添加程序集。另一个解决办法是使用 RegisterSelfReg。

此外,还要确保通过使用 RegAsm/Codebase 手动注册。如果程序集不在共享位置,那么,除非它和调用代码位于相同的目录中,否则会找不到。/Codebase 将目录输入注册表。

如何使用日志文件来解决 Windows Installer 的安装问题?

Windows Installer 会将安装程序时其自身发生的操作记录到一个日志文件中。该日志文件位于 .msi 文件驻留的目录中。

如何获取安装的日志文件?

可通过以下两种方法来获取:

  • 使用日志记录开关,从命令行运行以下命令。

    misexec /i mysetup.msi /l*v mylog.txt
    
  • 将以下内容保存为 .reg 文件,并将其加载到注册表中。

    REGEDIT4
    
    [HKEY_LOCAL_MACHINE\Software\Policies\Microsoft\Windows\Installer]
    "Logging"="voicewarmup"
    "Debug"=dword:00000007
    

    然后打开 \temp 目录并按日期进行排序。最新的 msi*.log 文件来自最新的安装或卸载。

如何安装到以前安装的产品的子目录中?

  1. 假设以前安装的产品(产品 1)已安装,并具有一个名为 MyFile.txt 的文件。

  2. 使用 ORCA(来自 Windows Installer SDK)查看文件表,并找到表示 MyFile.txt 的行。

  3. 获取 Component_ 列的值,然后打开组件表。

  4. 在组件表的组件列中找到具有 Component_ 值的行,然后获取 ComponentID。将该值复制到剪贴板。关闭 ORCA。

  5. 在安装项目中,打开“启动条件编辑器”,并添加 Windows Installer 组件搜索。对于新搜索的 ComponentID 属性,请粘贴 ComponentID。

  6. 复制“Property”属性。它应该类似于 COMPONENTEXISTS1。

  7. 打开“文件系统编辑器”,并选择“应用程序文件夹”。

  8. 将“DefaultLocation”属性编辑成类似于 [COMPONENTEXISTS1]MySubFolder(因为 COMPONENTEXISTS1 中的路径包含结尾的“\”)。

完成以上过程中的步骤 6 之后,您可能需要在“启动条件编辑器”中添加一个条件,以便检查是否找到了该组件,并在组件未找到的情况下阻止安装并显示一则消息。该条件将为 COMPONENTEXISTS1(它表示,在 COMPONENTEXISTS1 不为空的情况下可以运行安装程序)。

如何将自定义 Web 文件夹安装到非默认端口?

若要将自定义 Web 文件夹安装到不是在默认情况下指定的端口上,请从命令行运行安装。此命令必须包含每个 Web 自定义文件夹的“Property”属性值。通常情况下,值应类似于 NEWWEBPROPERTY1。您还需要包括 Web 应用程序文件夹的 TARGETPORT。

例如,如果 Web 服务器位于端口 20 上,命令行应如下所示:

msiexec /i mywebsetup.msi TARGETPORT=20 NEWWEBPROPERTY1PORT=20

上述命令仅适用于一个 Web 文件夹。如果您拥有多个 Web 文件夹,请按照上述内容针对每个文件夹添加更多的 PROPERTY=VALUE 对,以便将列出的每个文件夹的端口重定向到指定端口。

您可能需要移除“安装地址”对话框,因为如果有人在安装过程中更改了用户界面中的端口,自定义 Web 文件夹将使用命令行值。

如果安装到网站的根目录?

若要安装到网站的根目录(例如 c:\inetpub\wwwroot),请在 Web 安装项目中或在安装的过程中将 VirtualDirectory 设置为空字符串。

如何将 ServicedComponent 安装到 GAC 并在 COM+ 目录中对其进行配置?

如果您尝试将 ServicedComponent 安装到 GAC 中,并在 COM+ 目录中对其进行配置,您可能会收到下面的编译错误:

"Unable to build custom action named 'Primary output from RegServer (Active)' because the file's Folder property is set to Global Assembly Cache."

不支持该安装,因为在运行自定义操作时,GAC 中的程序集不是始终可用的(提交到 GAC)。

解决方法是,如果可能,请将代码放入不同的文件,并将自定义操作代码放入不会转到 GAC 的文件中。有时不能按照这种方式分发代码。

如何在安装后自动运行程序?

  1. 创建包含以下代码的 .vbs 文件:

    Set WshShell = CreateObject("WScript.Shell")
    WshShell.Run """" & Property("CustomActionData") & """",7,False
    Set WshShell = Nothing
    
  2. 打开安装项目并转到“自定义操作编辑器”。

  3. 选择“提交”节点,右击,然后添加新的“自定义操作”。

  4. 浏览文件系统,以添加您在步骤 1 中创建的 .vbs 文件。

  5. 通过添加以下内容编辑“CustomActionData”属性(其中,YourApp.exe 是启动应用程序文件的名称):

    [TARGETDIR]YourApp.exe

如何在快捷方式上创建卸载链接?

  1. 在安装项目目录中,创建一个新的 Uninstall.bat 文件。

  2. 在安装项目中,复制“ProductCode”属性(一个类似 [12345678-1234-1234-1234-123412341234] 的值)。

  3. 编辑 Uninstall.bat,让该程序的某一行包含以下内容(其中,ProductCode 是您在步骤 2 中复制的值):

    Msiexec /x ProductCode

  4. 将 Uninstall.bat 添加到安装项目的应用程序文件夹。

  5. 右击 Uninstall.bat 并选择“创建快捷方式”以创建快捷方式。

  6. 将快捷方式放在安装项目中相应的“开始”菜单文件夹中。

  7. 重命名快捷方式,新名称类似于“卸载 <应用程序名称>”。

在何处可以找到演示如何使用安装项目的示例?

请参见 Windows Installer 部署演练以获取如何使用安装项目的示例。

如何规划基于 .NET Framework 的应用程序的部署?

以下指南将为您提供规划和实现基于 .NET Framework 的应用程序的有效部署所需的信息:Deploying .NET Framework-based Applications(部署基于 .NET Framework 的应用程序)。

在何处可以下载 Windows Installer SDK?

可以从 Platform SDK 网站下载 Windows Installer SDK:

https://www.microsoft.com/downloads/details.aspx?FamilyId=A55B6B43-E24F-4EA3-A93E-40C0EC4F68E5&displaylang=en

在何处可以获取 Crystal Reports 的更新和帮助?

可以从 BusinessObjects.com 网站上的“Downloads & Updates”(下载和更新)页安装经过更新的软件和合并模块:

http://support.businessobjects.com/fix/downloads_updates.asp

在何处可以获取引导程序,以便帮助一起安装 .NET Framework 和应用程序?

“Microsoft .NET Framework Setup.exe Bootstrapper Sample”(Microsoft .NET Framework Setup.exe 引导程序示例)可以在以下位置找到:

https://www.microsoft.com/downloads/details.aspx?FamilyID=bf253cfd-1efc-4fc5-ba7e-6a6f21403495&displaylang=en

“Visual Studio .NET Framework Bootstrapper Plug-in”(Visual Studio .NET Framework 引导程序插件)可以在以下位置找到:

http://workspaces.gotdotnet.com/vsboot

如何解决“不可恢复的生成错误”错误消息?

如果在生成安装和部署项目时收到“不可恢复的生成错误”错误消息,请阅读以下文章:

位于 https://support.microsoft.com/kb/329214/zh-cn 上的“PRB: 'Unrecoverable Build Error' Error Message When You Build Setup and Deployment Projects”(PRB:在生成安装和部署项目时收到“不可恢复的生成错误”错误消息)。

如何解决验证错误消息?

如果收到类似于 An error occurred when validating. HRESULT = '80040155 的错误消息,请参见位于 https://support.microsoft.com/kb/329214/zh-cn 上的“PRB: "Unrecoverable Build Error" Error Message When You Build Setup and Deployment Projects”(PRB:在生成安装和部署项目时出现“不可恢复的生成错误”错误消息),请按照“Missing Registrations”(注册丢失)标题下的步骤操作。

如何在使用自定义操作的部署过程中修改 IIS

位于 https://msdn.microsoft.com/library/default.asp?url=/library/en-us/dv_vstechart/html/vbtchUsingCustomActionsToModifyInternetInformationServerDuringDeployment.asp?frame=true 上的“Modifying Internet Information Services During Deployment with Custom Actions”(在使用自定义操作的部署过程中修改 Internet 信息服务)一文解释了如何解决多个问题。这包括:

  • 如何在“文件系统编辑器”中修改 Web 文件夹上没有的 IIS 文件夹的设置。

  • 如何部署同时使用 Visual Basic 6 和 Visual Basic .NET(或更高版本)的混合应用程序。

  • 与 Visual Basic 6 应用程序相比,Visual Studio .NET(或更高版本)应用程序在部署方面的更改。

在何处可以找到有关“无接触部署”的信息?

请参见位于 https://msdn.microsoft.com/zh-cn/library/aa289511(en-us).aspx 上的“No-Touch Deployment in the .NET Framework”(.NET Framework 中的无接触部署)。

如何部署 ASP.NET 应用程序?

有关使用 Visual Studio .NET 部署 ASP.NET 应用程序的信息,请参见 Deploying an ASP.NET App Using Visual Studio .NET(使用 Visual Studio .NET 部署 ASP.NET 应用程序)。

在 Windows 2000 上安装应用程序后,应用程序失败并显示需要 MDAC 2.8 的警告

任何引用 System.Data 命名空间的应用程序都依赖 Microsoft 数据访问组件 (MDAC) 2.8 版或更高版本。大多数情况下,该文件已随操作系统一起安装。在 Windows 2000 Service Pack3 和更早版本上,可能需要与应用程序一起安装该组件。若要达到此目的,请将该组件添加到引导程序包中,并在安装期间从 Microsoft 下载该文件。有关更多信息,请参见部署系统必备 (Visual Studio)

相关知识库文章

下面的知识库文章提供有关 Windows Installer 部署问题的信息:

请参见

概念

部署和依赖项

其他部署方法

参考

VirtualDirectory 属性

其他资源

部署应用程序和组件

Windows Installer 部署演练