# 五、部署服务

一旦构建了应用程序可执行文件，就需要将它部署在它将工作的计算机中——工作站或服务器。尝试建立一个 msi 安装文件可能是最可靠的方法。但是还有一种更简单的方法来完成部署过程:创建一个. BAT 文件，在其中使用 installutil.exe 工具。

## 安装工具

安装程序工具是一个命令行实用程序，允许您通过在指定的程序集中执行安装程序组件来安装和卸载服务器资源。该工具与`System.Configuration.Install` 命名空间中的类结合使用。

此工具是用 Visual Studio 自动安装的。要运行该工具，请使用开发人员命令提示符(或 Windows 7 中的 Visual Studio 命令提示符)。

在命令提示符下，键入以下内容:

代码示例 22

```cs
          installutil [/u[ninstall]] [options] assembly [[options] assembly] ...

```

表 1:表 1:参数

| 争吵 | 描述 |
| 装配 | 在其中执行安装程序组件的程序集的文件名。如果要使用 **/AssemblyName** 选项指定程序集的强名称，请忽略此参数。 |

表 2:表 2:选项

| [计]选项 | 描述 |
| **h[elp]**-或者-**/？** | 显示工具的命令语法和选项。 |
| /help 程序集-或者-/?装配 | 显示指定程序集中各个安装程序可识别的附加选项，以及 InstallUtil.exe 的命令语法和选项。此选项添加每个安装程序组件的安装程序返回的文本。属性添加到 InstallUtil.exe 的帮助文本中。 |
| /AssemblyName "assemblyName，Version = major . minor . build . revision，culture =本地，public token = public token " | 指定程序集的强名称，该名称必须在全局程序集缓存中注册。程序集名称必须完全由程序集的版本、区域性和公钥标记限定。完全限定名必须用引号括起来。例如，“myAssembly，区域性=中性，public key token = 0038 abc9 deabfle 5，Version=4.0.0.0”是完全限定的程序集名称。 |
| /InstallStateDir=[directoryName] | 指定的目录。包含用于卸载程序集的数据的 InstallState 文件。默认值是包含程序集的目录。 |
| /log file =[文件名] | 指定记录安装进度的日志文件的名称。默认情况下，如果省略**/日志文件**选项，将会出现一个名为*的日志文件*。InstallLog 已创建。如果省略*文件名*，则不会生成日志文件。 |
| /logtocconsole = { true &#124; false } | 如果为真，则向控制台显示输出。如果为 false(默认值)，禁止向控制台输出。 |
| /ShowCallStack | 如果安装过程中的任何时候发生异常，将调用栈输出到日志文件。 |
| /u [ninstall] | 卸载指定的程序集。与其他选项不同，/u 适用于所有程序集，无论该选项出现在命令行的什么位置。 |

评论

。NET Framework 应用程序由传统的程序文件和相关资源组成，如消息队列、事件日志和性能计数器，这些都是在部署应用程序时必须创建的。您可以使用程序集的安装程序组件在安装应用程序时创建这些资源，并在卸载应用程序时删除它们。Installutil.exe 检测并执行这些安装组件。

您可以在同一命令行上指定多个程序集。出现在程序集名称之前的任何选项都适用于该程序集的安装。除了 **/u** 和 **/AssemblyName** 之外，选项是累积的，但可以被覆盖。也就是说，为一个程序集指定的选项适用于所有后续程序集，除非该选项是用新值指定的。

如果在未指定任何选项的情况下对程序集运行 Installutil.exe，它会将以下三个文件放入程序集的目录中:

*   InstallUtil。安装日志–包含安装进度的一般描述
*   *装配名称*。安装日志–包含特定于安装过程提交阶段的信息
*   *装配名称*。安装状态–包含用于卸载程序集的数据

Installutil.exe 使用反射检查指定的程序集，并查找所有将`System.ComponentModel.RunInstallerAttribute` 属性设置为 **true** 的安装程序类型。然后，该工具在安装程序类型的每个实例上执行`Installer.Install` 或`Installer.Uninstall` 方法。Installutil.exe 以交易的方式进行安装；也就是说，如果其中一个程序集安装失败，它将回滚所有其他程序集的安装。卸载不是事务性的。

## BAT 安装文件

这个文件可以使用像记事本这样的文本编辑器来创建。一旦文件被创建，它应该看起来像下面的例子。

代码示例 23

```cs
          @ECHO OFF
          CLS
          ECHO Installing Windows Service
          INSTALLUTIL.EXE monitorservice.exe
          ECHO Service has been installed
          PAUSE

```

## BAT 卸载文件

同样，卸载过程可以使用. BAT 文件来执行，应该类似于下面的代码片段。

代码示例 24

```cs
          @ECHO OFF
          CLS
          ECHO Uninstalling Windows Service
          INSTALLUTIL.EXE /U monitorservice.exe
          ECHO Service has been uninstalled
          PAUSE

```

两个文件看起来几乎一样。唯一的区别是卸载文件中用于 INSTALLUITL.EXE 的/U 选项。

| ![](img/note.png) | 注意:为了确保正确部署服务，Installutil.exe 必须包含在服务分发包中。 |

## 服务分发包

要部署服务可执行文件，需要一个分发包。此包将包含在目标计算机上成功安装所需的文件。服务分发包中必须包含以下文件:

*   Installutil.exe(随 Visual Studio 一起提供)
*   Monitorservice.exe(服务可执行文件)
*   Ionic.Zip.dll(用于创建 ZIP 的库)
*   带有服务执行参数的 XML 文件
*   BAT 安装文件
*   BAT 卸载文件

| ![](img/tip.png) | 提示:为了便于分发，包可以以 zip 文件的形式发送，该文件可以在安装时在目标计算机中解压缩。 |

## 章节总结

msi 文件可能是在目标计算机中部署服务可执行文件的可靠方法，但是在安装工具中使用. BAT 命令文件是一种简单的方法。

安装工具(Installutil.exe)是一个命令行工具，允许您安装和卸载服务器资源。该工具与`System.Configuration.Install`命名空间结合使用。此工具是用 Visual Studio 自动安装的。

Installutil.exe 使用反射检查指定的程序集，并查找所有将`System.ComponentModel.RunInstallerAttribute` 属性设置为`true`的安装程序类型。该工具随后在每个`Installer`类型的实例上执行`Installer.Install` 或`Installer.Uninstall` 方法。

几个。BAT 文件必须包含在分发包中；一个用于安装服务可执行文件，另一个用于从目标计算机卸载可执行文件。