创建Windows安装项目-Part 1(下)

类别:.NET开发 点击:0 评论:0 推荐:

创建Windows安装项目-Part 1(下)

作者: Wrox Team
发表:2003.3.6
翻译:邹建强
接上期:http://www.csdn.net/Develop/read_article.asp?id=21370

支持文件和项目输出

支持文件 

  可以手动添加一些文件供应用程序使用(如位图、定制的数据文件等等)。仅需要右击上面提到的文件夹列表,选择添加文件,然后浏览选择正确的文件(也可通过选择添加文件夹 创建任何你需要的子目录)。你选择的文件会被复制到目标计算机对应的位置上。

 项目输出

  你应该为你的应用程序项目输出添加一些重要的.NET程序集。这会确保每次生成setup文件时文件会被自动生成。同时也要确保所要求的从属程序集被包括。为了给这个FontView应用程序添加项目输出,右击应用程序文件夹选择添加项目输出



  这个窗口允许你从当前解决方案中的任意一个项目中输出。一旦你选择了恰当的项目,你就可以选择输出类型。

  主输出添加了由引用项目生成的程序集,以及一些从属的程序集。这是通常的选项(你也可以给Release .NET设置配置 选项以确保setup程序总是使用程序集的release版本,而不用担心当前IDE的设置)。

  本地化资源 使用了这个项目的附属程序集,它包含了本地指定的资源。

  源文件 包括了所有引用项目的文本源文件件。因为这些文件不包括实际编译的程序集,所以从属程序集不会被自动包括进来。

  任何从属的程序集会被自动引用。在这种情况下,从属程序集 mscorlib.cfgmscorlib.dll(.NET framework 的核心部分)会被包括。

  

  在添加 .NET 程序集时,.NET 可重发布文件被自动加入到 setup 项目中,这可以允许把你的应用程序安装到没有安装.NET运行时环境的计算机上。这会使你的setup项目的大小迅速膨胀(大约从100K到15MB以上)。如果客户已经安装了.NET framework,那么就要除去这些组件以节省空间。这是在示例 FontViewer 中所采取的方式。

  右击解决方案资源管理器中的dotnetfxredist_x86_enu.msm 合并模块,然后选择移除(Exclude).

快捷方式

  可以添加捷方式。比较典型的是在桌面文件夹上、启动文件夹、用户收藏夹创建,最常见的是在程序菜单中应用程序指定的子目录中创建。

  给应用程序FontViewer创建快捷方式遵循如下步骤:

  1. 添加快捷方式图标到setup项目中。
  2. 为应用程序在程序菜单里创建一个文件夹(这里我们用 FontViewer)。
  3. 右击新建的这个文件夹然后选择创建它的快捷方式。会有一个特殊窗口提示你选择setup项目中的一个文件作为快捷方式的目标。
  4. 一旦你选择了目标,快捷方式会被添加。你可以给它更名,并且利用属性窗口可以配置其它选项。




  到这里,你已经拥有了一个简单的全功能setup程序了。可以用它生成单独的 .msi 文件,用它安装 FontViewer 应用程序。下面我们设计一个非常简单的欢迎安装界面,可以提示安装路径,显示复制文件和快捷方式的进度条,然后以一个常用信息提示结束安装。你可以看到下面这部分是如何修改这些元素的。

定制用户界面

  在用户界面设计器里,你可以看到如下窗口。这些窗口以他们安装场景显示分组的顺序罗列出来。你会看到列表中有两个setup版本,一个是普通用户安装,另一个是管理员安装。你可使用 /a 参数来得到管理员安装功能。通常在需要网络安装时才使用管理员安装。

  为了明白实际Setup安装窗口象什么就必须实际地去安装Setup,或者参考 MSDN 帮助,它描述了每一种方式的属性并且显示它们的外观。 setup 项目是无法象普通应用程序那样进行调试的。

  有许多方式定制安装程序的用户界面:

  • 修改窗口选项。每个窗口提供一套不同的选项。选择窗口,检查属性窗口,看看什么选项可以用到。
  • 通过右击窗口,选择 上移 下移 可重新安排窗口的顺序。
  • 右击窗口,选择 删除 可以从安装项目中除去一个窗口。
  • 右击一个安装场景,选择 添加对话框 可以添加一个新的预定义窗口。

Setup窗口类型

  几个预定义窗口中,你可以添加一个到安装向导当中。每个窗口仅被添加一次,然后从选择列表中显示出来。每一设计窗口仅仅是为单一的目的,提供的配置选项非常少。几乎所窗口都提供了一个 BannerBitmap 属性,允许你指定一个图像文件,它显示在窗口顶部空白的banner区内(默认的图像是一个电脑)。其实窗口类型的选项如下:

窗口类型 描述/属性
启动画面窗口 在安装开始时用于显示公司或产品图像。提供: Sunken 属性,布尔型; SplashBitmap 属性,提供闪屏图像
欢迎窗口 介绍性窗口。通过 CopyrightWarning 属性和 WelcomeText 属性显示文本信息
许可协议窗口 提供一许可信息窗口,在进行下面安装前要求用户选择“同意”。许可信息是从 LicenseFile 属性中指定的 .rtf 文件抽取出来的,并且在窗口上是以 Sunken 属性显示出来的
客户信息窗口 提供一个要求用户名的窗口。利用布尔型属性 ShowOrganization 和 ShowSerialNumber,你也可以要求额外的信息。利用 SerialNumberTemplate 可以执行简单的序列号合法性校验,这会在下面的部分中介绍。
安装进度窗口 将 ShowProgressBar 属性设置为 True ,会显示出进度条。
用户注册窗口 允许用户通过一个独立的程序注册。它提供了一个“现在注册”按钮,点击可以启动一个可执行程序,或者启动了一个Web页面。可以通过 Executable 和 Arguments 属性指定这个应用程序。
自述文件窗口 通过 LicenseFile 属性指定的 .rtf 文件显示信息。窗口中是以 Sunken 属性显示的。


  用界面设计器可能对大多数开发者而言有些令人失望,因为它允许的定制相当有限。你能添加和重新安排预建的窗口类型,但是你不能设计一个全新的窗口,或是添加一部分自定义的代码。微软把更多的钱放在了一致性和简单性上,而不是复杂性。

序列号模板

  可以使用序列号模板(在客户信息窗口中的 SerialNumberTemplate 属性)阻止一个没有合法序列号的用户安装。模板定义了序列号如何被格式化。然而,你不能直接确认序列号。相反,你必须使用已经构建在Windows Installer产品当中基于模板的校验程序,对所有应用程序而言这可能还不够。

  起初,SerialNumberTemplate 被大于号和小于号括起来(即“<”和“>”),这些符合不会在文本框中直接显示出来。也可以用短划线把序列号分隔在多个文本框内。

  对于模板自身可以使用下面的字符:

  • # 要求是一个数字,但不执行额外校验。
  • ? 要求是一个英文字母,便不执行额外校验。
  • ^ 要求是一个大写字母或一个数字,但不执行额外校验。
  • % 要求是一个数字,这个数字被内置校验算法使用。
  • ? 要求是一个英文字母,这个字母被内置校验算法使用。

  别的任何字符都被文字常量对待。校验算法(对于“%”和“?”而言)已经被构建进了Windows Installer 服务当中。 它合计所有的数字,并且除以7。如果余数是0,则校验成功,否则失败。

  FontViewer 安装程序使用的模板是 <%%D-##-##>,它使用了三个文本框。最后四个字符必须是数字,第三个字符必须是字母“D”,并且头两个数字之和必须被7整除(例如一个合法序列号:77D-00-00)。

 

注册表设置

  我将介绍的最后的一个特点就是FontView 安装程序自动添加注册表项。注册表设计器界面非常类似于 regedit.exe 程序。你可以在注册表上的一个节点浏览,并通过右击选择合适选项添加键或值。这些设置会写入目标电脑的注册表当中。注意:你不能删除已有注册项,这会阻止潜在的破坏性修改。

  对于我们的注册表设置而言,我们使用被安装程序认知的特殊变量。这些变量通过方括号识别。在运行时状态,对于[Manufacturer] 和 [Product](它们在安装项目的属性窗口中被设置)和 [CUSTOMERNAME](客户在注册窗口中指定它)安装程序互换适当的值来创建注册表设置 HKEY_LOCAL_MACHINE\ProseTech\FontViewer\Customer。有关描述安装注册项目变量的更多细节会在个系列的Part 2中讲解。

  为了结合这个变化,应用程序 FontViewer 只是稍微修改了一下。现在在标题栏上显示的是安装客户的客户名称。

Here's the required code in the FontViewer application:

private void main_Load(object sender, EventArgs e)
{

    // (Original code omitted for space.)

    RegistryKey rk;
    rk = Registry.LocalMachine.OpenSubKey(
                   "Software\\ProseTech\\FontViewer");
    if (rk != null) this.Text += " - " + rk.GetValue("Customer");
}

Part 1尾声

  本文中,你已经知道 .NET 是如何结合Windows Installer 软件打包的。关于 Windows Installer 技术的其它信息可以在 Windows 文档中(如这里的在线文档)和到处都是的MSDN帮助文档中找到。

  本文解释了MSI的基础性的东西,在本系列的Part 2部分,我们将着眼于某些高级的选项,包括安装条件、定制操作以及文件类型注册等。

本文地址:http://com.8s8s.com/it/it45356.htm