代码改变世界

使用Custom Action制定VS Setup Project的自定义操作

2011-07-24 16:21 by gnorts, ... 阅读, ... 评论, 收藏, 编辑

       当我们使用Visual Studio自带的Setup Project来生成安装包时,我们可以很方便的将项目的输出部署到目标机器。然而在程序的运行过程中,可能创建了一些文件或者目录,而这些文件和目录在程序卸载的时候,这些文件将不会被删出,这无疑将造成用户信息的泄露。

       Visual Studio中为我们提供了一种叫做Custom Action的机制,它能够在Install, uninstall, repair, commit期间定义用户自己的操作。例如在安装自后打开某个网页等都能用Custom Action来实现。而本文所要阐述的是,怎样使用Custom Action在程序卸载期间,删除特定的文件。

       Custom Action的原理是在用户需要的时候执行某个可执行文件或者可执行脚本,它所支持的文件类型有exe, dll, vbs等。而使用可执行脚本执行相应操作有较多的局限性,不能详细定义脚本执行的具体时刻。本文主要着眼于dll类型的custom Action。

       下图中我们可以看到,这是一个名为TestApplication的项目以及他的部署安装项目TestApplicationSetup:

捕获

       我们在TestApplication中添加一个installer(安装程序类),Installer默认继承System.Configuration.Install.Installer,而这个类中提供了一系列接口

View Code
 1 public virtual void Commit(IDictionary savedState);        
2 public virtual void Install(IDictionary stateSaver);
3 protected virtual void OnAfterInstall(IDictionary savedState);
4 protected virtual void OnAfterRollback(IDictionary savedState);
5 protected virtual void OnAfterUninstall(IDictionary savedState);
6 protected virtual void OnBeforeInstall(IDictionary savedState);
7 protected virtual void OnBeforeRollback(IDictionary savedState);
8 protected virtual void OnBeforeUninstall(IDictionary savedState);
9 protected virtual void OnCommitted(IDictionary savedState);
10 protected virtual void OnCommitting(IDictionary savedState);
11 public virtual void Rollback(IDictionary savedState);
12 public virtual void Uninstall(IDictionary savedState);

       用户可以更具自己的需要选择具体实现那个接口,在这里我们选择实现Uninstall接口,下面是installer的具体代码:

View Code
 1 using System;
2 using System.Collections;
3 using System.Collections.Generic;
4 using System.ComponentModel;
5 using System.Configuration.Install;
6 using System.Linq;
7 using System.IO;
8 namespace TestApplication
9 {
10 [RunInstaller(true)]
11 public partial class Installer : System.Configuration.Install.Installer
12 {
13 public Installer()
14 {
15 InitializeComponent();
16 }
17 public override void Uninstall(IDictionary savedState)
18 {
19 base.Uninstall(savedState);
20 DirectoryInfo dir = new DirectoryInfo("D:\test");
21 if (dir.Exists)
22 {
23 dir.Delete(true);
24 }
25 }
26 }
27 }

       之后我们需要在Setup Project中新建custom action,因为我们需要在uninstall的时候做以上这些操作,我们需要在uninstall节点下添加新的custom action,并在弹出的窗口中选择主项目的输出:

TM截图未命名

       网上也有些大神说需要重新建立一个项目,在新建的项目中建立这样一个installer,并将这个项目的Primary Output添加到Setup Project的输出中。其实没有必要,完全可以在主项目中添加installer,经过测试这样完全能够实现在安装或卸载期间自定义操作的需求。

      测试环境:VS2010/VS2008 .NET Framework 2.0