VS.NET
安装部署深入研究
Minbear (
熊伟
)
相信很多人都做过安装程序,目前最大功能最全的当属
InstallShield
,但是
InstallShield
的语法学习起来实在费劲,相对而言
vs.net
自带的安装部署短小精悍,且使用
C#
语法,对于一般
C#
开发者来说使用起来就极为简便,在对其作了一些研究之后,发现
vs.net
的安装部署项目的功能也已经非常好用,一般的程序安装都可以轻松实现,当然,在研究的过程中也发现了一些缺陷,这个后面再提。下面就向大家介绍一下
ASP.NET
安装部署项目的一些复杂应用实现:
首先我们假设存在一个已经完工的
web
项目
eHRM
,其文件列表如图
![](https://p-blog.csdn.net/images/p_blog_csdn_net/wai631/42531cd2aa6441d98359db8a1328a571.jpg)
其中 web.config 中存在我们的数据库连接及系统的一些其他配置,如数据库类型等,这些配置需要在安装时进行修改。
OK ,知道了我们的安装对象,现在开始做安装部署程序,首先,在解决方案中添加一个新项目,如图,项目类型为 Web 安装项目,项目名称 eHRMSetUp 。
![](https://p-blog.csdn.net/images/p_blog_csdn_net/wai631/63f6dd38fe8149658fd75ce51799c2f7.jpg)
项目添加完毕,选中 eHRMSetUp ,会发现工具栏发生了一些变化,如图所示:
![](https://p-blog.csdn.net/images/p_blog_csdn_net/wai631/88ee8757febb4fb696eded8e39f0e267.jpg)
主要有 6 个工具按钮,分别代码安装部署的 6 大编辑器:
1 、
表示文件系统编辑器,主要用于目标机器的文件安装操作。
2 、
表示注册表编辑器,用于目标机器的注册表操作。
3 、
表示文件类型编辑器,用于向目标机器安装新的文件类型。
4 、
用户界面编辑器,用于确定安装过程中所用到的一些界面。
5 、
自定义操作编辑器,调用用户自定义的操作代码。
6 、
启动条件编辑器,用于设置安装程序的启动条件。
这 6 个编辑器不一定全部会用到,我们的 demo 安装就只需要用到 1/4/5 大部分的安装包属性均存在于 eHRMSetUp 项目的属性中,属性界面如图:
![](https://p-blog.csdn.net/images/p_blog_csdn_net/wai631/cace1f2f886943409de94be6b8130fa1.jpg)
在这里可以设置产品名称( eHRMSetUp ),产品编号( ProductCode )以及安装包全球化类型 (Localization) 等相关的安装程序属性。除了 eHRMSetUp 安装部署项目,我们还需要添加一个 eHRMSetUpCompenent 项目,用来自定义安装操作,在 eHRMSetUpCompenent 项目中添加一个新的安装程序类,如图:
![](https://p-blog.csdn.net/images/p_blog_csdn_net/wai631/8c663b837ba9435eaab04f03040bad9f.jpg)
名称为 eHRMInstaller.cs ,在其中添加如下代码:
protected override void OnAfterInstall(IDictionary savedState) {
base.OnAfterInstall (savedState);
}
public override void Install(IDictionary stateSaver) {
base.Install (stateSaver);
}
protected override void OnBeforeInstall(IDictionary savedState) {
base.OnBeforeInstall (savedState);
}
public override void Uninstall(IDictionary savedState) {
base.Uninstall (savedState);
}
public override void Rollback(IDictionary savedState) {
base.Rollback (savedState);
}
这些代码将主要负责对于安装中的操作进行自定义处理,包括建数据库,配置 web.config 等。为了在安装部署中调用项目 eHRMSetUpCompenent 定义的操作,需要在项目 eHRMSetUp 中添加 eHRMSetUpCompenent 的主输出和项目 eHRM 的内容输出,具体操作是选择 eHRMSetUp 项目后右键 —— 添加 —— 项目输出 —— 选择项目 eHRMSetUpCompenent 的主输出,添加完毕后如图:
![](https://p-blog.csdn.net/images/p_blog_csdn_net/wai631/8170ee3b00764e99814f46954947af81.jpg)
现在回到项目 eHRMSetUp ,打开文件系统编辑器,点击 Web 应用程序文件夹,编辑其属性,属性界面如下:
![](https://p-blog.csdn.net/images/p_blog_csdn_net/wai631/900496251cfb48c3a97c29393c1da91a.jpg)
其中比较重要的就是 VirtualDirectory 属性,表示安装后建立的虚拟目录名称,其他属性视具体情况而定。下面通过用户界面编辑器来配置用户的安装界面, vs.net2003 目前所提供的窗口比较少,如图:
![](https://p-blog.csdn.net/images/p_blog_csdn_net/wai631/2ad0bb1ca0724ea1a9405a5bf98af048.jpg)
基本是几个比较简单的配置窗口,所以如果需要用到一些复杂的配置,那么这些窗口就远远不够用了,不过我们可以进行部分的扩展来实现这些复杂的配置,具体方法如下:
1 、在项目 eHRMSetUpCompenent 中添加一个 windows 窗口 FrmConfig.cs ,设计我们需要用的界面。
2 、修改 eHRMInstaller.cs 中的代码如下:
protected override void OnAfterInstall(IDictionary savedState) {
FrmConfig _FC = new FrmConfig();
_ FC.ShowDialog();
base.OnAfterInstall (savedState);
}
3 、这样,在安装的过程中会中断并弹出 FrmConfig 让用户进行配置。最后就是通过自定义操作编辑器来设置安装过程中的自定义操作,从 web 应用程序文件夹选择主输出来自 eHRMSetUpCompenent (活动),添加完毕如图所示:
分别设置
4
个主输出的
CustomActionData
属性为:
/LogicDir=[TARGETDIR] /VitualDir=[TARGETVDIR][TARGETDIR]
和
[TARGETVDIR]
是系统部署自带属性,分别表示安装物理目录地址和虚拟目录地址。设置完这些自定义操作的传入参数后就可以直接在
eHRMSetUpCompenent
项目的代码中进行调用,调用代码如下:
public override void Install(IDictionary stateSaver)
{
// 安装物理目录
string LogicDir = Context.Parameters["LogicDir"];
// 安装虚拟目录
string VitualDir = Context.Parameters["VitualDir"];
// 根据配置安装操作
base.Install (stateSaver);
}
最后需要做的就是卸载时的一些文件处理:
public override void Uninstall(IDictionary savedState) {
// 安装物理目录
string LogicDir = Context.Parameters["LogicDir"];
// 安装虚拟目录
string VitualDir = Context.Parameters["VitualDir"];
// 处理自定义部分的安装内容,如数据库等
base.Uninstall (savedState);
}
完成了这一系列动作后,整个程序的安装雏形已经基本 OK ,只要在相应的地方加入实际安装中所需要进行的一系列 Action 就可以制作一个完整的安装部署程序。
注意事项:
1 、 Resource 文件属于项目的源文件,而非内容文件,所以如果项目中有 Resource 文件存在,则需要添加项目的源文件输出,同时利用排除筛选器设置好对 *.cs 文件和 *.resx 文件的过滤。
2 、 Bin 目录默认不在 web 项目中,所以打包还需要加入 web 项目的主输出或直接把 bin 目录下的文件加入到 web 项目中,这样生成的 dll 会包含在内容文件输出中。
3 、安装制作过程中某些目录可能会无法创建(偶没能找到具体原因,估计是因为文件依赖性的缘故),则可以手工在 Web 应用程序文件夹中直接创建。
![](https://p-blog.csdn.net/images/p_blog_csdn_net/wai631/42531cd2aa6441d98359db8a1328a571.jpg)
其中 web.config 中存在我们的数据库连接及系统的一些其他配置,如数据库类型等,这些配置需要在安装时进行修改。
OK ,知道了我们的安装对象,现在开始做安装部署程序,首先,在解决方案中添加一个新项目,如图,项目类型为 Web 安装项目,项目名称 eHRMSetUp 。
![](https://p-blog.csdn.net/images/p_blog_csdn_net/wai631/63f6dd38fe8149658fd75ce51799c2f7.jpg)
项目添加完毕,选中 eHRMSetUp ,会发现工具栏发生了一些变化,如图所示:
![](https://p-blog.csdn.net/images/p_blog_csdn_net/wai631/88ee8757febb4fb696eded8e39f0e267.jpg)
主要有 6 个工具按钮,分别代码安装部署的 6 大编辑器:
1 、
![](https://p-blog.csdn.net/images/p_blog_csdn_net/wai631/efbc09c737374410a3daf154869ca08f.jpg)
2 、
![](https://p-blog.csdn.net/images/p_blog_csdn_net/wai631/3bb189c769b0417ab9aa5e9eadd151ac.jpg)
3 、
![](https://p-blog.csdn.net/images/p_blog_csdn_net/wai631/ad04067d48e74e0da293f53415a1f210.jpg)
4 、
![](https://p-blog.csdn.net/images/p_blog_csdn_net/wai631/d4fb1dcd33464fd497b7912467d40384.jpg)
5 、
![](https://p-blog.csdn.net/images/p_blog_csdn_net/wai631/0155f9c4dcee4be886e499037081006e.jpg)
6 、
![](https://p-blog.csdn.net/images/p_blog_csdn_net/wai631/5a492f0667564eb89ac5300d9be02f9e.jpg)
这 6 个编辑器不一定全部会用到,我们的 demo 安装就只需要用到 1/4/5 大部分的安装包属性均存在于 eHRMSetUp 项目的属性中,属性界面如图:
![](https://p-blog.csdn.net/images/p_blog_csdn_net/wai631/cace1f2f886943409de94be6b8130fa1.jpg)
在这里可以设置产品名称( eHRMSetUp ),产品编号( ProductCode )以及安装包全球化类型 (Localization) 等相关的安装程序属性。除了 eHRMSetUp 安装部署项目,我们还需要添加一个 eHRMSetUpCompenent 项目,用来自定义安装操作,在 eHRMSetUpCompenent 项目中添加一个新的安装程序类,如图:
![](https://p-blog.csdn.net/images/p_blog_csdn_net/wai631/8c663b837ba9435eaab04f03040bad9f.jpg)
名称为 eHRMInstaller.cs ,在其中添加如下代码:
protected override void OnAfterInstall(IDictionary savedState) {
base.OnAfterInstall (savedState);
}
public override void Install(IDictionary stateSaver) {
base.Install (stateSaver);
}
protected override void OnBeforeInstall(IDictionary savedState) {
base.OnBeforeInstall (savedState);
}
public override void Uninstall(IDictionary savedState) {
base.Uninstall (savedState);
}
public override void Rollback(IDictionary savedState) {
base.Rollback (savedState);
}
这些代码将主要负责对于安装中的操作进行自定义处理,包括建数据库,配置 web.config 等。为了在安装部署中调用项目 eHRMSetUpCompenent 定义的操作,需要在项目 eHRMSetUp 中添加 eHRMSetUpCompenent 的主输出和项目 eHRM 的内容输出,具体操作是选择 eHRMSetUp 项目后右键 —— 添加 —— 项目输出 —— 选择项目 eHRMSetUpCompenent 的主输出,添加完毕后如图:
![](https://p-blog.csdn.net/images/p_blog_csdn_net/wai631/8170ee3b00764e99814f46954947af81.jpg)
现在回到项目 eHRMSetUp ,打开文件系统编辑器,点击 Web 应用程序文件夹,编辑其属性,属性界面如下:
![](https://p-blog.csdn.net/images/p_blog_csdn_net/wai631/900496251cfb48c3a97c29393c1da91a.jpg)
其中比较重要的就是 VirtualDirectory 属性,表示安装后建立的虚拟目录名称,其他属性视具体情况而定。下面通过用户界面编辑器来配置用户的安装界面, vs.net2003 目前所提供的窗口比较少,如图:
![](https://p-blog.csdn.net/images/p_blog_csdn_net/wai631/2ad0bb1ca0724ea1a9405a5bf98af048.jpg)
基本是几个比较简单的配置窗口,所以如果需要用到一些复杂的配置,那么这些窗口就远远不够用了,不过我们可以进行部分的扩展来实现这些复杂的配置,具体方法如下:
1 、在项目 eHRMSetUpCompenent 中添加一个 windows 窗口 FrmConfig.cs ,设计我们需要用的界面。
2 、修改 eHRMInstaller.cs 中的代码如下:
protected override void OnAfterInstall(IDictionary savedState) {
FrmConfig _FC = new FrmConfig();
_ FC.ShowDialog();
base.OnAfterInstall (savedState);
}
3 、这样,在安装的过程中会中断并弹出 FrmConfig 让用户进行配置。最后就是通过自定义操作编辑器来设置安装过程中的自定义操作,从 web 应用程序文件夹选择主输出来自 eHRMSetUpCompenent (活动),添加完毕如图所示:
![](https://p-blog.csdn.net/images/p_blog_csdn_net/wai631/922d1606548548f7a22cf51f4eff6331.jpg)
public override void Install(IDictionary stateSaver)
{
// 安装物理目录
string LogicDir = Context.Parameters["LogicDir"];
// 安装虚拟目录
string VitualDir = Context.Parameters["VitualDir"];
// 根据配置安装操作
base.Install (stateSaver);
}
最后需要做的就是卸载时的一些文件处理:
public override void Uninstall(IDictionary savedState) {
// 安装物理目录
string LogicDir = Context.Parameters["LogicDir"];
// 安装虚拟目录
string VitualDir = Context.Parameters["VitualDir"];
// 处理自定义部分的安装内容,如数据库等
base.Uninstall (savedState);
}
完成了这一系列动作后,整个程序的安装雏形已经基本 OK ,只要在相应的地方加入实际安装中所需要进行的一系列 Action 就可以制作一个完整的安装部署程序。
注意事项:
1 、 Resource 文件属于项目的源文件,而非内容文件,所以如果项目中有 Resource 文件存在,则需要添加项目的源文件输出,同时利用排除筛选器设置好对 *.cs 文件和 *.resx 文件的过滤。
2 、 Bin 目录默认不在 web 项目中,所以打包还需要加入 web 项目的主输出或直接把 bin 目录下的文件加入到 web 项目中,这样生成的 dll 会包含在内容文件输出中。
3 、安装制作过程中某些目录可能会无法创建(偶没能找到具体原因,估计是因为文件依赖性的缘故),则可以手工在 Web 应用程序文件夹中直接创建。