转自(http://blog.csdn.net/wenmang1977/article/details/7733685)

前些天想写一下制作安装程序,由于要写的内容比较多,一拖再拖,不过坚持就是胜利,今天终于写完了。

1概述

做应用软件制作安装程序是很必要的一件事情,本文主要介绍使用VS2010自带的打包组建来开发一个安装程序,用一个例子的形式一步一步的叙述其中的一些技巧。

2基本的安装

2.1HelloWorld

为了有一个安装的目标,使用VS2010创建一个HelloWorld的C# Windows Forms Application工程,Solution的名称也为HelloWorld,由于我所在项目的目标平台为x64,所以将HelloWorld编译为x64。

2.2MyInstaller

在HelloWorld Solution中加入一个新的VS Installer工程,命名为MyInstaller如下图:

左键单击MyInstaller工程在打开的Properties中简单进行一下设置,由于我所在的项目目标平台为x64所以TargetPlatform选择x64,如下图:

通过MyInstaller工程的右键菜单我们可以看到VS Installer为我们提供了File System、Registry、File Types等几个视图:

在File System视图中设置目标机中的安装位置及需要创建的目录结构,其中Application Folder是程序在目标机的安装位置,我们在Application Folder下创建一个bin目录和一个data目录,在bin目录中加入一个File,选择HelloWorld.exe。User’s Programs Menu是安装程序的系统菜单项,我们在之下创建一个HelloWorld目录,并在其中加入一个Shortcut,并选择HelloWorld.exe,完成后大体结构如下图:

打开Register视图在注册表中再写些东西,大体如图:

这样一个简单的安装程序就做成了,编译并进行安装,则相应的快捷方式,注册表将会依据设置进行创建。

在编译的时候经常会遇到类似于下面“ERROR: Build could not create 'C:\Users\xxx \work\test\HelloWorld\x64\Debug\MyInstaller.tmp' 'The Windows Installer service failed to start. Contact your support personnel.'”的错误,这个错误比较折磨人,不是代码的问题但是影响工作,可以尝试几种方法进行解决:

1, Build->Clean Solution,然后重新编译

2, 删除Debug目录下所有文件,然后重新编译

3, 重新启动VS2010后重新编译

4, 更改Debug目录的属性去掉只读,然后重新编译(这个方法很好用)

3Custom Action

3.1Custom Action Library

有很多时候我们需要安装程序做更多的事情,例如依据用户的一些选择创建文件夹或者配置文件等,这样我们就需要使用Custom Action了,不明思议就是定制的一些操作。我们在HelloWorld Solution中Add一个新C# Class Library工程,如下:

在Custom Action工程中加入一个Installer Class,可以看到MyHelloWorldInstaller类继承至Installer,我们可以重写Installer中的函数来达到定制化的一些目的。

我们的目的是在安装的时候在data目录中创建一个配置文件,这样我们需要override一下Install函数,这个函数在安装时将被安装程序调用,并且能够传入一些安装信息,代码如下:

publicoverridevoid Install(IDictionary stateSaver)

{

base.Install(stateSaver);

strInstallPath = this.Context.Parameters["path"];

FileStream fs = newFileStream(strInstallPath+@"data\hello.txt",FileMode.OpenOrCreate);

StreamWriter fw = newStreamWriter(fs);

fw.WriteLine("my test string");

fw.Close();

fs.Close();

}

3.2Installer设置

Custom Action准备好之后,需要安装程序进行一些设置将安装程序和Custom Action关联起来,右键单击MyInstaller工程,然后Add->Project Output… 选择MyCustomAction Project和Primary output,点击OK完成,如图:

打开MyInstaller的Custom Actions视图,选择Install->Add Custom Actions…,在Application Folder中选择Primary output from MyCustomAction:

为了把安装路径传入CustomAction需要设置一下Action属性中的CustomActionData,具体如下图:

再重新编译MyInstaller并进行安装,这样就会在安装目录的data目录下发现一个hello.txt文件。

4Shell Extension

有些时候我们还需要更近一步,让我们的程序能够关联到Windows系统菜单中,像winzip等软件一样,单纯的使用注册表就不能满足这个要求了,我们需要使用ShellExtension技术来完成。

关于如何进行ShellExtension编程可以参考http://www.codeproject.com/Articles/441/The-Complete-Idiot-s-Guide-to-Writing-Shell-Extens,这里介绍的C++版本的,由于我们使用的是C#,所以希望这里也使用C#,关于C#如何实现可以参考http://1code.codeplex.com/wikipage?title=WinShell

下面我们就在之前例子上在系统右键菜单中加入我们自己的菜单。首先下载参考中的ShellExt.zip工程,找到其中的ShellExtLib.cs和FileContextMenuExt.cs加到MyCustomAction中,ShellExtLib.cs主要把ShellExtension的C++接口映射为C#,FileContextMenuExt.cs是实现类,功能代码放到这里。在QueryContextMenu中加入菜单的生成代码,在InvokeCommand中加入消息响应代码,在Register和Unregister中分别加入菜单关联的注册代码。然后需要在Install函数中加入COM的注册代码,如下:

publicoverridevoid Install(IDictionary stateSaver)

{

base.Install(stateSaver);

strInstallPath = this.Context.Parameters["path"];

FileStream fs = newFileStream(strInstallPath+@"data\hello.txt",FileMode.OpenOrCreate);

StreamWriter fw = newStreamWriter(fs);

fw.WriteLine("my test string");

fw.Close();

fs.Close();

//Shell Ext for context menu

// Call RegistrationServices.RegisterAssembly to register the classes in

// the current managed assembly to enable creation from COM.

RegistrationServices regService = newRegistrationServices();

regService.RegisterAssembly(this.GetType().Assembly,AssemblyRegistrationFlags.SetCodeBase);

}

有注册就需要卸载,我们重载一下Uninstall函数,代码如下:

publicoverridevoid Uninstall(IDictionary savedState)

{

base.Uninstall(savedState);

//Shell Ext

// Call RegistrationServices.UnregisterAssembly to unregister the classes

// in the current managed assembly.

RegistrationServices regService = newRegistrationServices();

regService.UnregisterAssembly(this.GetType().Assembly);

}

为了Uninstall被调用需要在MyInstaller工程的Custom Actions视图中的Uninstall加入一个Action与之前的Install相同。由于x64位系统注册需要一些特殊的处理,不过这个在ShellExt的例子中也已经实现了,只要把Fix64bitInstallUtilLib.js和InstallUtilLib.dll拷贝到MyInstaller目录,然后在工程属性的PostBuildEvent中加入"$(ProjectDir)Fix64bitInstallUtilLib.js" "$(BuiltOuputPath)" "$(ProjectDir)" ,编译并进行安装。则在.cs文件的右键菜单中加入了一项,如图:

这个例子只是给出了一个创建一级菜单的代码,像Winzip这种是一个Popupmenu,需要使用CreatePopupMenu API,在HelloWorld的例子中我已经引入了这个API,其他的就和Win32编程创建菜单相同了。

5定制安装界面

通过User Interface视图的Add Dialog我们可以看到系统为我们提供了一些安装过程中能够使用的对话框,如图:

这些对话框比较有限,而且界面的元素都是固定的,有些时候我们需要定制一些安装界面,这个需求可以通过Orca这个工具来完成,可以通过Orca打开想应该Dialog的.wid文件进行修改,wid文件一般在VS的安装目录下,我的机器在如下目录中Microsoft Visual Studio 10.0\Common7\Tools\Deployment\VsdDialogs\1033。使用Orca修改Dialog也不是很方便,容易出现问题,关于Orca这里就不介绍了,可以参考网上的其他文档。

6Launch Condition

有些时候我们的软件需要依赖于其他的一些库或者其他的软件才可以运行,如果Installer不能够自动检测出来就需要我们手动的添加一些安装条件。例如我们的软件依赖于libxxx.lib文件才可以运行,如何检测这个文件在系统中是否存在哪?打开MyInstaller的Launch Conditions视图,在Search Target Machine中Add File Search,其属性设置如图:

然后在Launch Conditions中加入一个XXX的Launch Condition,其属性设置如图:

就写到这里吧,虽然VS上自带的安装程序制作组件不十分强大,但是也能够满足我们日常的需要。

例子

http://download.csdn.net/detail/wenmang1977/4422079

VS2010制作安装程序的更多相关文章

  1. Wix打包系列(一)如何使用wix制作安装程序

    原文:Wix打包系列(一)如何使用wix制作安装程序 最近由于项目需要,需要给客户制作安装程序,一开始使用vs2005自带的打包工程来打包,但用了一段时间发现vs打包太死板,而且使用起来问题很多.收费 ...

  2. 使用好压(HaoZip)软件打包EverEdit制作安装程序

    最近使用EverEdit,使用原始的安装程序安装后,需要重新安装插件,对配置文件进行了修改,定制了工具栏.将安装后的程序目录进行打包,制作新的安装包,便于携带. 以下为打包制作过程: 打包原料:Eve ...

  3. vs.net应用程序图标以及制作安装程序快捷方式图标设置

           我们通常在开发软件完毕后需要打包制作安装程序,这个时侯一般都会需要设置应用程序的图标,使用默认的图标一般都比较难看,那么我们应该怎样设置自定义的图标呢? 我现在要讲的图标设置有两种情况, ...

  4. Unity 制作安装程序和卸载程序

    1.最简单的方式通过winrar制作 但是做出来的页面好low的感觉 参考链接:https://www.cnblogs.com/fetty/p/5185913.html 2.通过inno制作安装程序: ...

  5. 使用WINRAR来制作安装程序

    1. WINRAR版本 2. 将所有文件放在同一个文件夹下 3. 选中所有文件点击右键 -> Add to archive 4. General设置 5. Advanced 设置 6. 确定开始 ...

  6. C#打包制作安装程序过程全记录

    该文是根据网上的文章并结合自己实际打包的过程而整理的. 开发平台:VisualStudio2005中文版. 步骤如下: 1. 创建一个安装向导项目或安装部署项目 新建项目-〉其他项目类型-〉安装与部署 ...

  7. 利用ASP.NET操作IIS (可以制作安装程序)

    很多web安装程序都会在IIS里添加应用程序或者应用程序池,早期用ASP.NET操作IIS非常困难,不过,从7.0开始,微软提供了 Microsoft.Web.Administration 类,可以很 ...

  8. 如何给自己的PHP项目制作安装程序

    最近很是激动啊,现在的自己还是和当初刚刚学习程序的时候一样,虽然现在回头一看自己写过的程序,都非常的小孩子和漏洞百出,也没有太多的考虑效率和安全,但是还是每次写出了新的程序或系统,都是抱着一种马上拿着 ...

  9. VS2010关于WindowsService 制作安装程序包,无法自动install的问题解决方法

    当添加了 安装项目后,需要做2个步骤的操作,第一是 右键点击 “视图”---“文件系统”,添加“项目输出“,好了后,再右键点击 “视图”---“自定义操作” 在安装中添加自定义操作,将刚才的”项目输出 ...

随机推荐

  1. Mysql 5.7 主从复制

    配置思路1. 修改master和slave的配置文件,使用二进制日志,指定serverid目的是让各自都有了自己的唯一标示,并以二进制文件格式进行交流2. master中创建授权用户,查看二进制日志文 ...

  2. 资料:mnist.pkl.gz数据包的下载以及数据内容解释

    deeplearning.net/data/mnist/mnist.pkl.gz The MNIST dataset consists of handwritten digit images and ...

  3. [转]将Eclipse设置为黑色主题 方式一

    将Eclipse设置为黑色主题 觉得黑色的主题&配色很高大上,于是花了点时间实践出下面一种方法. 修改代码编辑区配色 修改整个软件主题 先上成果图: 但是进度条依旧是白色的,不知道怎么弄了╮( ...

  4. RocEDU.阅读.写作《苏菲的世界》书摘(二)

    "迷信",多么奇怪的一个名词.如果你信基督教或伊斯兰教,这就叫"信仰",但如果你相信占星术或十三号星期五不吉利,就是迷信.谁有权利说别人相信的东西就是" ...

  5. linux内核第二周

    chapter 1 知识点梳理 (一)计算机是如何工作的?(总结)——三个法宝 ①存储程序计算机工作模型,计算机系统最最基础性的逻辑结构: ②函数调用堆栈,高级语言得以运行的基础,只有机器语言和汇编语 ...

  6. 单调队列:temperature

    题目大意:某国进行了连续n天的温度测量,测量存在误差,测量结果是第i天温度在[l_i,r_i]范围内. 求最长的连续的一段,满足该段内可能温度不降. 第一行n下面n行,每行l_i,r_i 1<= ...

  7. openwrt下如何只编译linux内核

    答:make target/linux/install V=s (此操作也会将最终镜像打包好,V=s会输出日志) 拓展 清空内核: make target/linux/clean V=s 解压内核: ...

  8. ISSCC 2017论文导读 Session 14 Deep Learning Processors,A 2.9TOPS/W Deep Convolutional Neural Network SOC

    最近ISSCC2017大会刚刚举行,看了关于Deep Learning处理器的Session 14,有一些不错的东西,在这里记录一下. A 2.9TOPS/W Deep Convolutional N ...

  9. 从零开始玩转JMX(一)——简介和Standard MBean

    JMX的全称为Java Management Extensions. 顾名思义,是管理Java的一种扩展.这种机制可以方便的管理.监控正在运行中的Java程序.常用于管理线程,内存,日志Level,服 ...

  10. 微信JS-SDK接口,分享到朋友圈”按钮点击状态及自定义分享内容接口

    jssdk.php 接口文件class JSSDK { private $appId; private $appSecret; public function __construct($appId, ...