以向VS 程序打包集成自动写入注册表功能为例,介绍如何实现自由控制安装过程

最近由于项目部署时需要更灵活的控制程序安装的流程以及自定义安装行为,特意研究了一下VS程序打包,把解决办法和大家分享一下。

以VS2010为例:

这是一个已经设置好最基本的Visual Studio Installer解决方案界面,以此生成的安装包,将会是一个最基本的安装功能。程序打包的详细教程网上很多,就不再赘述。

由于我的项目部署时,需要同时修改用户的注册表,而且是需要根据用户自己选的安装路径去修改注册表。于是VS的打包程序自带的加入注册表功能,并不适用于我的情况,因为这样注册表导入进去之后就没法改了,不能把安装路径再传到注册表里面去。

于是就需要我们自定义代码,通过安装程序的事件来控制安装流程。

解决方案->添加->新建项目->类库,命名为ExtensionLibrary,在项目ExtensionLibrary下面,删除Class1.cs,添加->新建项目->安装程序类(名称为InstallerDemo.cs),打开InstallerDemo.cs,这个class InstallerTest继承自System.Configuration.Install.Installer,里面就一个构造函数。现在安装程序不能完成的功能,都可以在这个类写代码来自己实现。

举例:在构造函数里面添上this.AfterInstall+= new InstallEventHandler(InstallerDemo_AfterInstall),实现方法InstallerDemo_AfterInstall(object sender, InstallEventArgs e),就可以完成程序在安装之后要做的事情了,Installer主要要用到的事件不外乎这几个:BeforeInstall,AfterInstall,AfterRollback,AfterUninstall,BeforeRollback,BeforeUninstall,很明显的意思。

现在我需要在安装完成之后,根据用户的安装路径,向系统注册表添加一些值:

  public InstallerDemo()
        {
            InitializeComponent();
            this.AfterInstall += new InstallEventHandler(InstallerDemo_AfterInstall);
        }

  private void InstallerDemo_AfterInstall(object sender, InstallEventArgs e)
        {
            string path = this.Context.Parameters["targetdir"];//获取用户设定的安装目标路径, 注意,需要在Setup项目里面自定义操作的属性栏里面的CustomActionData添加上/targetdir="[TARGETDIR]\"
            string [] commands=new string[4];
            commands[0] ="/c"+ " reg add HKCR\\renke /f /ve  /d \"URL:HyperText Transfer Protocol with Privacy\" ";
            commands[1] ="/c"+ " reg add HKCR\\renke /f /v \"URL Protocol\"  /d \"\" ";
            commands[2] ="/c"+ " reg add HKCR\\renke\\shell /f /ve  /d \"open\" ";
            commands[3] ="/c"+ " reg add HKCR\\renke\\shell\\open\\command /f /ve  /d \"\\\""+ path + "\\" + "Gyn5tDataAnalyze.exe\\\"  \\\"%1\\\"\" ";
            foreach (var command in commands)
            {
                Process p = new Process
                {
                    StartInfo =
                    {
                        FileName = "cmd.exe",
                        Arguments = command,
                        UseShellExecute = false,
                        RedirectStandardInput = true,
                        RedirectStandardOutput = true,
                        CreateNoWindow = true
                    }
                };
                p.Start();
                p.StandardInput.WriteLine("exit");
                p.Close();
            }
        }

完成了上面的自定义代码的InstallerDemo_AfterInstall方法,还是不够的,只是这样的话在安装之后是不会执行InstallerDemo_BeforeInstall中的代码的。还要用到“自定义操作编辑器”。项目SetupDemo->添加->项目输出->选择ExtensionLibrary后确定,你会发现,在项目SetupDemo下面多了一项“主输出来自ExtensionLibrary(活动)”的字样。

好,到正题了,来到“自定义操作”处,可以看到四个子项:安装,提交,回滚,卸载。在安装上面点击右键->添加自定义操作->选择“主输出来自ExtensionLibrary(活动)”。这样,重新生成后,安装之前就会执行InstallerDemo_BeforeInstall代码了。

另外,要取得用户的安装目录还需要注意,在自定义操作->安装->“主输出来自ExtensionLibrary(活动)”上面右键属性,在CustomActionData中填入/targetdir="[TARGETDIR]\", 然后在类InstallerDemo中用这句话this.Context.Parameters["targetdir"] 就可以取得安装的目录。

这样直接在安装之后调用控制台来执行添加注册表的操作,同时也能够根据用户选择不同的安装路径来配置注册表。

使用这种方法,可以在VS Installer 自带功能无法满足项目需求的情况下,更灵活的处理和应对安装包所需要的做到的各种事情。

后面有时间将会介绍怎么用BS系统里面调用本地CS程序并且向CS系统传递参数。

时间: 2024-08-05 02:32:34

以向VS 程序打包集成自动写入注册表功能为例,介绍如何实现自由控制安装过程的相关文章

SNF开发平台WinForm之十一-程序打包-SNF快速开发平台3.3-Spring.Net.Framework

1.安装NSIS 打开安装程序,按照指示安装即可 2. 安装完毕,打开NIS Edit,点击文件,选择新建脚本:向导(W),如下图所示. 3. 点击下一步,在这里相应更改: (1)将应用程序名称填写*.exe文件名: (2)软件版本.出版人.网站根据实际需要填写(若没有,则保留空白即可): (3)程序标志会在安装界面的底部显示(若不需要也可选择不显示文本).设置完成后选择下一步. 4. 在下图中将安装语言选择为“simple chinese”,同时设置安装程序显示的图标,接着点击下一步: 5.下

VS2010与水晶报表V13的打包集成小结

感谢孟子E章提供的技术咨询. 系统配置: Windows 7 + VS2010 , WinForm + DotNet4 + 水晶报表 这里说的打包集成,指的用VS2010的制作的安装包,在安装的时候可以顺带安装水晶报表V13,有这么三种方法: 一.使用水晶报表V13合并模块 举例:CRRuntime_13_0_1.msm 具体步骤请参考官方文档,网址如下: http://wiki.sdn.sap.com/wiki/display/BOBJ/Using+Crystal+Reports+for+Vi

将java应用程序打包成独立运行的.exe方法

对于windows用户来说,将java应用程序打包成.exe最好不过了,现在我介绍两个方法. 1.用专业的应用程序打包工具InstallAnywhere,这个软件几乎能在所有平台上运行,当然你要下载到你需要的那个平台的啦!而且它也能打包成各个平台的安装程序(当然不是免费的).我下载的是7.1 企业版我只提供一些注册码,安装程序大家在网上找.InstallAnywhere7.1注册码使用方法参考:具体 2.用MINI的免费的工具javalunch,JavaLauncher的下载网址是:http:/

在windows平台下electron-builder实现前端程序的打包与自动更新

由于8月份上旬公司开发一款桌面应用程序,在前端开发程序打包更新时遇到一些困扰多日的问题,采用electron-builder最终还是得到解决~ 以下是踩坑的过程及对electron打包与更新思路的梳理,electron打包与更新的正确姿势应该如下图所示 下面将逐一展开描述说明     一.windows系统下环境配置 NPM是随NodeJS一起安装的包管理工具,能解决NodeJS代码部署上的很多问题 允许用户从NPM服务器下载别人编写的第三方包到本地使用. 允许用户从NPM服务器下载并安装别人编

Qt5+opencv程序打包发布

编程环境为win7+QtCreator5.6+opencv3.0,总结,程序打包发布的方法: 第一步:使用windeployqt(转自http://tieba.baidu.com/p/3730103947,感谢楼主分享) Qt 官方开发环境使用的动态链接库方式,在发布生成的exe程序时,需要复制一大堆 dll, 如果自己去复制dll,很可能丢三落四,导致exe在别的电脑里无法正常运行. 因此 Qt 官方开发环境里自带了一个工具:windeployqt.exe. 以官方 Qt 5.4.0+MinG

C#windows应用程序打包(VS2010+SQLServer2008)

C#windows应用程序打包(VS2010+SQLServer2008) 开发环境:VS2010+SQL Server 2008 操作系统:win7_32bit 旗舰版 开发语言:C# 项目名称:学生寄宿管理系统 下面开始介绍:如何给windows应用程序打包? 第一步: 打开VS2010,打开你要打包的项目,然后右击"解决方案",”添加“,"新建项目",弹出如下图所示界面: 点击”安装和部署“左边的三角形,选择下面的”Visual studio Installe

QT5.4 计算器程序 打包&发布,解决dll的最新解决方案(图文并茂,很清楚)

QT写界面还是很不错,就是打包会比较麻烦,折腾了一天总算是打包完成了. QT软件的打包发布一个难点是必备dll文件的识别,现在高版本QT自带了一个windeployqt工具,直接会把需要的dll生成一份,放在软件的目录里面. 参考官方文档:http://doc.qt.io/qt-5/windows-deployment.html#application-dependencies 具体使用步骤如下: 1.添加qt的bin/目录进系统path变量.很简单,在系统属性里设置,添加D:\QT\QT5.4

QT5.4 计算器程序 打包&发布,解决dll的最新解决方案

QT写界面还是很不错,就是打包会比较麻烦,折腾了一天总算是打包完成了. QT软件的打包发布一个难点是必备dll文件的识别,现在高版本QT自带了一个windeployqt工具,直接会把需要的dll生成一份,放在软件的目录里面. 参考官方文档:http://doc.qt.io/qt-5/windows-deployment.html#application-dependencies 具体使用步骤如下: 1.添加qt的bin/目录进系统path变量.很简单,在系统属性里设置,添加D:\QT\QT5.4

平台安装时写入注册表的打包方法

最近根据客户要求,在用户下载办公系统安装包安装后,将直接从网页登陆,这需要在注册表中写入delit项,在此之前平台一直采用的是安装好后,从平台提供的登陆界面登陆然后在向注册表添加项. 要解决这个问题,只能在用户安装好客户端后就自动的向注册表写入delit项.下面是实现方法:1.我们使用下图中所示工具进行安装包打包: 2.具体打包步骤可以参照http://plat.delit.cn/article-1-167.html 3.点击安装之后--双击结束安装--点击操作--选择On Preload事件,