最近由于项目部署时需要更灵活的控制程序安装的流程以及自定义安装行为,特意研究了一下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 程序打包集成自动写入注册表功能为例,介绍如何实现自由控制安装过程的更多相关文章

  1. Qt程序打包,自动拷贝依赖文件

    版权声明:若无来源注明,Techie亮博客文章均为原创. 转载请以链接形式标明本文标题和地址: 本文标题:Qt程序打包,自动拷贝依赖文件     本文地址:http://techieliang.com ...

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

    原来我们用的是微软自带的打包工具去打包,但感觉好像也是第三方做的打包并且很是麻烦,还有时不成功报错.那综合考虑就找一个简单实用的打包工具吧,就找到了NSIS这个.具体打包步骤如下: 1.安装NSIS ...

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

    感谢孟子E章提供的技术咨询. 系统配置: Windows 7 + VS2010 , WinForm + DotNet4 + 水晶报表 这里说的打包集成,指的用VS2010的制作的安装包,在安装的时候可 ...

  4. Python - 使用Setuptools进行程序打包

    1- Setuptools简介 通过Setuptools可以更方便的创建和发布Python包,特别是那些对其它包具有依赖性的状况: Python打包用户指南(Python Packaging User ...

  5. WinForm程序打包工具InnoSetup使用说明图文教程

    WinForm程序打包工具InnoSetup使用说明图文教程 WinForm程序开发测试好了,如果将Debug/Release里面的文件发给客户使用,会让客户觉得你不够专业,但是使用VS自带的打包工具 ...

  6. C# Winform打包部署时添加注册表信息实现开机自启动

    1.原理:需要开机自启动的程序,需要将其启动程序的路径写到注册表中指定的文件夹下 2. 写入注册表的方式有两种 a.在生成安装程序时配置 b.在程序运行时,动态配置 方法一:使用VS2010自带的打包 ...

  7. ArcGIS AddIN开发之COM对象写入注册表

    做一个交互式绘制文字的工具,希望这次设置的Symbol,下次打开ArcMap时自动调用这个Symbol,并支持对其进行修改. 解决方法是将这个Symbol写入注册表中,每次自动读取上一次设置的Symb ...

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

    由于8月份上旬公司开发一款桌面应用程序,在前端开发程序打包更新时遇到一些困扰多日的问题,采用electron-builder最终还是得到解决~ 以下是踩坑的过程及对electron打包与更新思路的梳理 ...

  9. Installshield 打包安装程序时写入注册表,及运行bat文件

    一.写入注册表 1. 打开project assistant –> Project Registry 可以像注册表里一样操作,其中[INSTALLDIR]是指的安装路径   二. 运行bat文件 ...

随机推荐

  1. Android Studio配置 AndroidAnnotations——Hi_博客 Android App 开发笔记

    以前用Eclicps 用习惯了现在 想学学 用Android Studio 两天的钻研终于 在我电脑上装了一个Android Studio 并完成了AndroidAnnotations 的配置. An ...

  2. 6.DNS公司PC访问外网的设置 + 主DNS服务器和辅助DNS服务器的配置

    网站部署之~Windows Server | 本地部署 http://www.cnblogs.com/dunitian/p/4822808.html#iis DNS服务器部署不清楚的可以看上一篇:ht ...

  3. shiro权限管理框架与springmvc整合

    shiro是apache下的一个项目,和spring security类似,用于用户权限的管理‘ 但从易用性和学习成本上考虑,shiro更具优势,同时shiro支持和很多接口集成 用户及权限管理是众多 ...

  4. Nginx如何处理一个请求

    看了下nginx的官方文档,其中nginx如何处理一个请求讲解的很好,现在贴出来分享下.Nginx首先选定由哪一个虚拟主机来处理请求.让我们从一个简单的配置(其中全部3个虚拟主机都在端口*:80上监听 ...

  5. 源码分析netty服务器创建过程vs java nio服务器创建

    1.Java NIO服务端创建 首先,我们通过一个时序图来看下如何创建一个NIO服务端并启动监听,接收多个客户端的连接,进行消息的异步读写. 示例代码(参考文献[2]): import java.io ...

  6. Android 工具-adb

    Android 工具-adb 版权声明:本文为博主原创文章,未经博主允许不得转载. Android 开发中, adb 是开发者经常使用的工具,是 Android 开发者必须掌握的. Android D ...

  7. FullCalendar日历插件说明文档

    FullCalendar提供了丰富的属性设置和方法调用,开发者可以根据FullCalendar提供的API快速完成一个日历日程的开发,本文将FullCalendar的常用属性和方法.回调函数等整理成中 ...

  8. 程序员必须要知道的Hadoop的一些事实

    程序员必须要知道的Hadoop的一些事实.现如今,Apache Hadoop已经无人不知无人不晓.当年雅虎搜索工程师Doug Cutting开发出这个用以创建分布式计算机环境的开源软...... 1: ...

  9. C语言中如何判断文件是否存在

    方法一:access函数判断文件夹或者文件是否存在 函数原型: int access(const char *filename, int mode); 所属头文件:io.h filename:可以填写 ...

  10. centos6.5 nginx-1.8.0和ftp搭建图片服务器

    一.Nginx的安装步骤 1.Nginx安装环境: gcc: 安装nginx需要先将官网下载的源码进行编译,编译依赖gcc环境,如果没有gcc环境,需要安装gcc:yum install gcc-c+ ...