以向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[];
commands[] ="/c"+ " reg add HKCR\\renke /f /ve /d \"URL:HyperText Transfer Protocol with Privacy\" ";
commands[] ="/c"+ " reg add HKCR\\renke /f /v \"URL Protocol\" /d \"\" ";
commands[] ="/c"+ " reg add HKCR\\renke\\shell /f /ve /d \"open\" ";
commands[] ="/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系统传递参数。
以向VS 程序打包集成自动写入注册表功能为例,介绍如何实现自由控制安装过程的更多相关文章
- Qt程序打包,自动拷贝依赖文件
版权声明:若无来源注明,Techie亮博客文章均为原创. 转载请以链接形式标明本文标题和地址: 本文标题:Qt程序打包,自动拷贝依赖文件 本文地址:http://techieliang.com ...
- SNF开发平台WinForm之十一-程序打包-SNF快速开发平台3.3-Spring.Net.Framework
原来我们用的是微软自带的打包工具去打包,但感觉好像也是第三方做的打包并且很是麻烦,还有时不成功报错.那综合考虑就找一个简单实用的打包工具吧,就找到了NSIS这个.具体打包步骤如下: 1.安装NSIS ...
- VS2010与水晶报表V13的打包集成小结
感谢孟子E章提供的技术咨询. 系统配置: Windows 7 + VS2010 , WinForm + DotNet4 + 水晶报表 这里说的打包集成,指的用VS2010的制作的安装包,在安装的时候可 ...
- Python - 使用Setuptools进行程序打包
1- Setuptools简介 通过Setuptools可以更方便的创建和发布Python包,特别是那些对其它包具有依赖性的状况: Python打包用户指南(Python Packaging User ...
- WinForm程序打包工具InnoSetup使用说明图文教程
WinForm程序打包工具InnoSetup使用说明图文教程 WinForm程序开发测试好了,如果将Debug/Release里面的文件发给客户使用,会让客户觉得你不够专业,但是使用VS自带的打包工具 ...
- C# Winform打包部署时添加注册表信息实现开机自启动
1.原理:需要开机自启动的程序,需要将其启动程序的路径写到注册表中指定的文件夹下 2. 写入注册表的方式有两种 a.在生成安装程序时配置 b.在程序运行时,动态配置 方法一:使用VS2010自带的打包 ...
- ArcGIS AddIN开发之COM对象写入注册表
做一个交互式绘制文字的工具,希望这次设置的Symbol,下次打开ArcMap时自动调用这个Symbol,并支持对其进行修改. 解决方法是将这个Symbol写入注册表中,每次自动读取上一次设置的Symb ...
- 在windows平台下electron-builder实现前端程序的打包与自动更新
由于8月份上旬公司开发一款桌面应用程序,在前端开发程序打包更新时遇到一些困扰多日的问题,采用electron-builder最终还是得到解决~ 以下是踩坑的过程及对electron打包与更新思路的梳理 ...
- Installshield 打包安装程序时写入注册表,及运行bat文件
一.写入注册表 1. 打开project assistant –> Project Registry 可以像注册表里一样操作,其中[INSTALLDIR]是指的安装路径 二. 运行bat文件 ...
随机推荐
- Npm包的开发
个人开发包的目录结构 ├── coverage //istanbul测试覆盖率生成的文件 ├── index.js //入口文件 ├── introduce.md //说明文件 ├── lib │ ...
- C语言 · 判定数字
编写函数,判断某个给定字符是否为数字. 样例输入 9 样例输出 yes #include<stdio.h> int main(){ char c; scanf("%c" ...
- 利用CSS中的:after、: before制作的边三角提示框
小颖昨天分享了一篇参考bootstrap中的popover.js的css画消息弹框今天给大家再分享一篇使用:before和:after伪元素画消息弹框的CSS. 画出来是介个酱紫的: 有没有觉得画的萌 ...
- 简单搭建 nuget 内部服务器
搭建 nuget 内部服务器,最好的方式是使用 ProGet,参考博文<用 ProGet 搭建内部的 NuGet 服务器>,好处非常多,但需要使用 SQL Server 数据库,如果不想使 ...
- 香蕉云APP,2016下半年开发日记
2016-6-17 数据库设计不应该过多依赖范式,适度的冗余可以加快搜索速度,在服务器的配置还可以的情况下,可以采用冗余来解决查找慢的问题.还一个是要选择好数据库引擎,例如 InnoDB 和 myi ...
- pdo的使用
PHP 数据对象 (PDO) 扩展为PHP访问数据库定义了一个轻量级的一致接口. PDO 提供了一个数据访问抽象层,这意味着,不管使用哪种数据库,都可以用相同的函数(方法)来查询和获取数据. PDO随 ...
- 编写自己的PHP MVC框架笔记
1.MVC MVC模式(Model-View-Controller)是软件工程中的一种软件架构模式,把软件系统分为三个基本部分:模型(Model).视图(View)和控制器(Controller). ...
- BZOJ 1597: [Usaco2008 Mar]土地购买 [斜率优化DP]
1597: [Usaco2008 Mar]土地购买 Time Limit: 10 Sec Memory Limit: 162 MBSubmit: 4026 Solved: 1473[Submit] ...
- 札记:Java异常处理
异常概述 程序在运行中总会面临一些"意外"情况,良好的代码需要对它们进行预防和处理.大致来说,这些意外情况分三类: 交互输入 用户以非预期的方式使用程序,比如非法输入,不正当的操作 ...
- ASP.NET 5运行时升级到Beta5
在Visual Studio 2015 RTM和Windows 10正式发布之前,微软把开源.NET升级到了beta5,带来了一些增强和改变.和Visual Studio 2015 RC一起安装的AS ...