65.9K
CodeProject 正在变化。 阅读更多。
Home

在 Web 设置项目中为虚拟目录指定不同位置

starIconstarIconstarIconstarIcon
emptyStarIcon
starIcon

4.86/5 (20投票s)

2006 年 4 月 21 日

CPOL

5分钟阅读

viewsIcon

270851

downloadIcon

1090

如何:增强 Visual Studio 2005 Web Setup Project 中的安装地址 UI 对话框,以便用户可以选择虚拟目录安装的不同物理路径。

引言

当通过 Web Setup Project 使用 Visual Studio 2005 生成 MSI 安装程序时,无法指定所创建虚拟目录的物理路径。该位置默认为网站根目录下的一个子目录(通常,此主目录为“C:\Inetpub\wwwroot”)。

“安装地址”对话框提供的唯一字段是“站点”和“虚拟目录”。

Installation Address Dialog before modification

我决定增强此对话框,使其具有指定虚拟目录不同物理位置的选项。

要实现此目的的最简单方法是创建一个常规的 Visual Studio Setup Project,然后实现一个自定义安装程序类,该类将在适当的位置创建虚拟目录(通过将 Setup Project 中的 TARGETDIR 传递给它)。最后,我将安装程序类添加为 Setup Project 中的自定义操作并进行编译。

然而,我决定在 Web Setup Project 中实现此功能,原因有两个:

  1. 我已经花费了大量时间创建 Web Setup Project,并且不想重新开始。
  2. 我不想失去选择网站的选项,或者在常规 Setup Project 中实现这一点。

仅通过 Visual Studio 无法完成此实现。需要采取以下步骤:

  • 通过在 Visual Studio 2005 中编译 Web Setup Project 来创建 MSI。
  • 使用Orca.exe(来自 Microsoft Platform SDK)来扩展“安装地址”对话框。
  • 将扩展保存为 MSI 转换文件,然后将此转换文件应用于原始 MSI 文件。

在 Visual Studio 中编译 Web Setup Project 非常简单。让我们详细介绍后两个步骤。

使用 Orca.exe 修改 MSI

Orca.exe 提供了一个图形用户界面,可直接编辑 Windows Installer 表。它是 Microsoft Platform SDK for Windows 2003 Server R2 的一部分。首先,安装 SDK,然后运行 SDK 的“/Bin”目录中的Orca.msi

启动Orca.exe。在编辑任何表之前,请确保在“工具 > 选项 > 数据库”中选中“保存副本时复制嵌入的流”复选框。如果忘记此步骤,将在运行修改后的 MSI 时遇到一个恼人的“错误 2356:无法在流中找到 cabinet”错误。

在 Orca 中,您需要向“Control”和“ControlEvent”表添加一些行,并对现有行进行一些小的修改。然后需要将这些更改保存为 MSI 转换文件,以便可以轻松地重新应用于由 Visual Studio 构建的任何后续 MSI。

首先,从菜单中选择“转换 > 新建转换”,开始为我们的转换记录更改。现在,让我们开始修改Control表。我们想要修改的对话框名为“WebFolderForm”,我们想向其中添加一个标签、一个文本框和一个浏览按钮。这可以通过向表中添加以下三行来实现(Ctrl+R):

Rows to be added to the 'Controls' table

(注意:由于大小限制,我将所有表截图分成两部分。)

此表中唯一其他修改是更改指定 VDirEdit 文本框的行的“下一控件”单元格。将值从“取消”更改为“InstallLabel”。

Modification to existing rows in the 'Control' table

这些更改将使“安装地址”对话框看起来像这样:

This is how the Installation Address Dialog looks after the modifications

浏览按钮尚未生效。为此,我们需要修改ControlEvent表。向此表中添加以下两行:

Modifications to the 'ControlEvent' table for SelectFolderDialog functionality

MSI 数据库中已提供 SelectFolderDialog。以上两行确保浏览按钮会启动此对话框,并将选定的文件夹位置存储在 TARGETDIR 属性中。这些就是所有修改。现在,通过选择“转换 > 关闭转换”将转换保存到磁盘。Orca 会保存一个扩展名为.mst的文件,该文件将来可用于扩展 Visual Studio 创建的 MSI 包。

将转换应用于 MSI 数据库非常简单。只需使用 Orca 打开 MSI,然后通过选择菜单中的“转换 > 应用转换...”来应用转换。要完成,请选择“文件 > 另存为转换后的文件...”来保存修改后的 MSI。为避免一些问题,最好在保存转换后的 MSI 之前,从“转换”菜单中指定“转换属性...”。选中以下三个复选框:“相同语言”、“相同产品代码”和“相同升级代码”。

附加步骤

MSI 表的内容由 Visual Studio 在创建安装程序时生成。生成的代码可能存在一些差异,需要采取额外步骤才能使解决方案正常工作。

Visual Studio 可能会插入几个自定义操作,这些操作会将 TARGETDIR 重置到其原始位置。在 WebFolderForm 上单击“下一步”按钮时会运行它们。如果是这种情况,您将在ControlEvent表中看到以下行:

WebFolderForm 下一篇 DoAction WEBCA_EvaluateURLsMB 1 1

这指定在单击“下一步”时应运行自定义操作 WEBCA_EvaluateURLsMB。在“顺序”列中,此操作的顺序号高于设置 TARGETDIRSetTargetPath。但是,仅更改顺序不足够,因为在 InstallExecuteSequence 中,有一个对自定义操作 WEBCA_EvaluateURLs 的调用,而在 InstallUISequence 表中最终 resides WEBCA_EvaluateURLsNoFail 自定义操作。从这三个表中删除它们将解决问题。另一种方法是通过从 CustomAction 表中删除相应的行来完全删除这些操作。

我不确定这些自定义操作的功能,因为它们未被记录。它们由 Visual Studio 插入到 MSI 中的一个名为 MSVBDPCADLL 的二进制流中(包含MSVBDPCA.DLL)。据我所见,删除它们并未对安装过程产生负面影响。

指定默认安装目录

在删除自定义操作后,默认安装目录不再初始化为您的 Web 服务器下方的路径。通过向 MSI 添加几行额外的行(这是常规 Setup 项目的默认设置),可以轻松安装到像 [ProgramFilesFolder][Manufacturer]\[ProductName] 这样的目录。

将此行添加到CustomAction表中:

DIRCA_TARGETDIR 307 TARGETDIR [ProgramFilesFolder][Manufacturer]\[ProductName]

然后将以下行添加到InstallExecuteSequenceInstallUISequence表中:

DIRCA_TARGETDIR TARGETDIR="" 749

此行中的最后一列包含安装顺序,该顺序安排在 WEBCA_TARGETVDIR 操作之前发生。

© . All rights reserved.