以向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文件 ...
随机推荐
- C# 在腾讯的发展
本文首发我的微信公众号"dotnet跨平台", 内容得到大家热烈的欢迎,全文重新发布在博客,欢迎转载,请注明出处. .NET 主要的开发语言是 C# , .NET 平台泛指遵循EC ...
- 关于.NET异常处理的思考
年关将至,对于大部分程序员来说,马上就可以闲下来一段时间了,然而在这个闲暇的时间里,唯有争论哪门语言更好可以消磨时光,估计最近会有很多关于java与.net的博文出现,我表示要作为一个吃瓜群众,静静的 ...
- 百度推出新技术 MIP,网页加载更快,广告呢?
我们在2016年年初推出了MIP,帮助移动页面加速(原理).内测数据表明,MIP页面在1s内加载完成.现在已经有十多家网站加入MIP项目,有更多的网站正在加入中.在我们收到的反馈中,大部分都提到了广告 ...
- ThreadLocal简单理解
在java开源项目的代码中看到一个类里ThreadLocal的属性: private static ThreadLocal<Boolean> clientMode = new Thread ...
- 解决PHP-问题:Class 'SimpleXMLElement' not found in
1.问题 在ubuntu 16.10中,学习PHP,学习到PHP如何生成XML文件时候,碰到了这个问题: PHP Fatal error: Class 'ClassName\SimpleXMLElem ...
- QT5利用chromium内核与HTML页面交互
在QT5.4之前,做QT开发浏览器只能选择QWebkit,但是有过使用的都会发现,这个webkit不是出奇的慢,简直是慢的令人发指,Release模式下还行,debug下你就无语了,但是webkit毕 ...
- UWP开发必备:常用数据列表控件汇总比较
今天是想通过实例将UWP开发常用的数据列表做汇总比较,作为以后项目开发参考.UWP开发必备知识点总结请参照[UWP开发必备以及常用知识点总结]. 本次主要讨论以下控件: GridView:用于显示数据 ...
- potrace源码分析一
1 简介 potrace是由Dalhousie University的Peter Selinger开发一款位图轮廓矢量化软件,该软件源码是可以公开下载的,详细见项目主页:http://potrace. ...
- 前端HTML5几种存储方式的总结
接下来要好好总结一些知识,秋招来啦...虽然有好多知识都不大会,但是还是要努力一下,运气这种东西,谁知道呢~ 总体情况 h5之前,存储主要是用cookies.cookies缺点有在请求头上带着数据,大 ...
- nodejs操作arduino入门(javascript操作底层硬件)
用Javascript来操作硬件早就不是一件稀奇的事情了. 所以作为一名电子专业出身的FE,我也打算尝试一下用js来驱动arduino: 要想操作这些底层硬件,肯定是需要一些工具的,我这里介绍的工具主 ...