制作c#安装程序/使用安装服务类自定义安装事件

时间:2022-08-30 20:48:30

第一步:建立工程 
1.打开vs,新建项目->其他项目类型->安装和部署(),新建安装项目,命名为SetupTest。 2.新建工程后,可以在“解决方案资源管理器”里面看到子项:文件系统编辑器,注册表编辑器,文件类型编辑器,用户界面编辑器,自定义操作编辑器,启动条件编辑器。下面将会举例来说明各个地方怎么使用。 
3.最简单的一个安装程序:点击“文件类型编辑器”,找到“应用程序文件夹”,添加->文件,选择你要打包的程序文件(譬如我的程序有run.exe和lib.dll组成),确定。在项目“SetupTest”上点击生成,一个简单的安装包就做好了。生成后,点击安装,如果没有错误的话,你现在可以看到你的安装包的效果了。 
4.如何自定义代码?在制作过程中,这些简单的功能不能满足你的要求,那么就自己写代码来完成吧。 
解决方案->添加->新建项目->类库,命名为Library,在项目Library下面,删除Class1.cs,添加->新建项目->安装程序类(名称为InstallerTest.cs),打开InstallerTest.cs,你会发现这个class InstallerTest继承自Installer,里面就一个构造函数。好了,现在安装程序不能完成的功能,你可以在这个类写代码来自己实现了。     举例:在构造函数里面添上this.BeforeInstall += new InstallEventHandler(InstallerTest_BeforeInstall),实现方法
InstallerTest_BeforeInstall(object sender, InstallEventArgs e),就可以完成程序在安装之前要做的事情了,Installer主要要用到的事件不外乎这几个:BeforeInstall,AfterInstall,AfterRollback,AfterUninstall,BeforeRollback,BeforeUninstall,很明显的意义,就不用解释了吧 
 
5.完成了4中的InstallerTest_BeforeInstall事件,是不是在安装之前就要执行
InstallerTest_BeforeInstall中的代码呢,答案是不行。还要用到“自定义操作编辑器”。项目SetupTest->添加->项目输出->选择Library->选择主输出和内容文件后确定,你会发现,在项目SetupTest下面多了一项“主输出来自Library(活动)” 和一项“内容文件来自
Library(活动)”的字样。好,到正题了,来到“自定义操作”处,可以看到四个子项:安装,提交,回滚,卸载。在安装上面点击右键->添加自定义操作->选择“主输出来自Library(活动)”。这样,重新生成后,安装之前就会执行InstallerTest_BeforeInstall代码了。(当然,如果你在要在卸载前后做一些事情,就必须在“卸载”处也把自定义操作添加进去,否则即使监听了事件AfterUninstall,也不会执行的,完全之策是在安装,提交,回滚,卸载里面都把主输出来自Library(活动)添加进去就不怕了,嘿嘿) 
  
6.如何得到用户所选安装路径?在实现代码的时候,用户所选安装路径大多数情况下都要用到,怎么得到他的值呢?在自定义操作->安装->“主输出来自Library(活动)”上面右键属性,在CustomActionData中填入/targetdir="[TARGETDIR]\", 然后在类InstallerTest中用这句话this.Context.Parameters["targetdir"] 就可以取得安装的目录了。 
 
7.如何得到用户在安装的时候输入的更多的信息?用户在安装的时候,还有可能塡很多其他的信息,比如我以前做的一个安装文件中包含安装数据库,安装的时候用户就要填写数据库密码,用户名等信息。实现如下:用户界面->安装->启动->右键->添加对话框->选择"文本框(A)",可以看到文本框(A)有很多属性,如:Edit1Label,Edit1Property,Edit1Value,Edit1Visible等,Edit1Label就是這個输入框所要输入的内容的提示语,Edit1Value就是所输入的内容。 例如:将Edit1Label内容填上“请输入数据库用户名:”,将Edit1Property内容填上DBUSER,Edit1Visible选问true,另外在6中所提到的CustomActionData中,添加上 /dbuser="[DBUSER]",再在InstallerTest中用这句话this.Context.Parameters["dbuser"] 就可以或得用户在安装的时候所填写的用户名了(其他的单选框,复选框,button按钮框都差不多获取值的方法,不再累赘).总之,添加了一些对话框后,把属性好,还要在CustomActionData添加一个/parm="[属性值]",才能在代码中获取改值。 

注:如果想要在CustomActionData中添加多个参数,则用空格隔开,如果参数是路径,格式为/parm="[属性值]\" 
8.删除安装文件。上面的都做好了,一个安装程序就基本完成了。运行刚做好的安装程序,提示安装完成,这时如果你打开安装目录会发现许多.tmp文件。这是安装时用到的临时文件,在最后应该删掉。仿照4添加一个InstallerTest_AfterInstall事件,在事件中写删除代码。思路:取出安装目录下的所有文件,筛选出.tmp文件并将它们删除。下面是我的作法: 
File.Delete(this.Context.Parameters["targetdir"]+"test"); string[] filenames = 
Directory.GetFiles(this.Context.Parameters["targetdir"]); int i = 0; 
while (i<filenames.Length&& filenames[i] != null)                 { 
if (filenames[i].Substring(filenames[i].Length - 3, 3)=="tmp")                     { 
File.Delete(filenames[i]);                     } i++; 
                } 
注意:要引入System.IO命名空间。