为C#应用程序创建Visual Studio安装项目生成MSI包安装程序
介绍
微软提供了很多为Windows程序创建安装文件的方法.
在我打算创建安装文件时,不知如何下手。我在网络上找到很多文章介绍如何创建安装项目,可是行不通,有些也没有实例可以参考。
我的 QC 团队促使我写下这篇文章.
本文中我将一步步介绍创建一个Windows程序和安装文件的流程。
开始行动
首先,创建一个只有一个窗体的应用程序,包含一个文本框和一个按钮,真的很简单。
我将程序命名为 CreatingInstaller,当然你可以命名其它名字。
创建好的窗体如下:
写一些简单的代码,点击按钮显示文本框内容:
主要任务
Windows程序完成了,我们为其添加一个安装项目:
在解决方案上点击右键选择添加新项目,在弹出的创建项目窗口选择 "Other Project Types" -> "Setup and Deployment" -> "Visual Studio Installer":
项目添加之后,在项目上点击右键,选择查看->文件系统。打开如下界面,你可以看到应用程序文件夹、用户桌面和用户程序菜单 。
右键点击Application Folder并选择添加->项目输出;选择要创建安装文件的项目:
选择"CreatingInstaller",即 "Add Output Project Group" 窗口选择要做安装文件的项目,将其作为主输出,然后点击 "Ok".
添加结果如下图:
现在将Windows程序的功能扩展一下,点击按钮后读取一个文件,将文件内容显示出来。在 "bin\debug\Input" 添加名为Sample.txt的文件夹,其中Input文件夹是用来放txt文件的。
完成功能代码:
运行程序。
在安装程序中添加文件夹和文件,以便满足程序的要求。
右键点击Application Folder,添加一个文件夹。此文件夹将创建到Application Folder,将其命名为Input。
右键点击文件夹,在属性中,将 Always Create属性设为True. 这样在安装程序时将创建此文件夹。
创建快捷方式
为Windows程序设置一个图标:
右键点击 Input选择添加文件,浏览到 Sample.txt后将其添加进来.
在 主输出上点击右键,选择 "Create Shortcut to Primary Output", 将其命名为 CreatingInstaller.
在其属性面板为Icon属性选择一个图标。此图标将创建到桌面,下图演示如何添加图标:
将Application Folder 中的快捷方式剪切出来,粘贴到 User's Desktop文件。这样为程序在桌面创建快捷方式的工作就完成了.
在程序菜单创建快捷方式的流程和上面类似,如下图所示:
创建程序文件夹 CreatingInstaller.
创建新的快捷方式
添加图标
右键点击 Application folder选择属性,设定安装位置:
卸载
在程序菜单添加卸载功能,这样无需到控制面板卸载软件了.
Step 1
右键点击File System on the target Machine 选择"Add Special Folder" -> "System Folder" :
Step 2
右键点击创建的system folder将 msiexec.exe文件(在System.Windows32 文件夹下)添加进来..
将此文件的属性设置为如下图所示:
Step 4
为此文件在程序菜单创建快捷方式,命名为 "Uninstall".
Step 5
查看setup project的属性。可以自定义如产品名称、作者、安装位置等属性。
J选择 product code。我们需要它作为msiexec的参数来实现卸载功能。
Step 6
右键点击Uninstall 快捷方式,设置其 arguments属性如下:
/x {product code} /qr
/x的意思是卸载.
具体内容请查看 http://technet.microsoft.com/en-us/library/cc759262(v=ws.10).aspx,
Step 7
保存并重新编译 setup project.
任务完成 !
运行生成的安装文件:
在桌面和程序菜单可看到我们创建的快捷方式
浏览程序文件夹,可看到 Input 文件夹和 Sample.txt 文件.运行程序,结果和在VS中运行时是一样的。
点击卸载,执行卸载操作:
Custom Actions
Custom actions 是在安装或卸载过程中执行自定义操作。比如当程序运行时,执行了卸载,由于程序已经在内存运行,因此卸载完成,而程序还在运行。我们可以在卸载时判断程序是否在运行,如果运行可先将其关闭然后再卸载。
1. 在Windows程序中添加Installer类,其中为 Installation, Uninstallation, Rollback,Commit指定了自定义行为事件.
我们需要为uninstallation写一些代码。
代码中的逻辑是找到正在运行的程序,将其关闭。这里不做具体解释,只是为了演示如何使用自定义行为。
using System;
using System.Collections;
using System.Collections.Generic;
using System.ComponentModel;
using System.Configuration.Install;
using System.Diagnostics;
using System.Linq;
namespace CreatingInstaller
{
[RunInstaller(true)]
public partial class Installer1 : System.Configuration.Install.Installer
{
public override void Install(IDictionary savedState)
{
base.Install(savedState);
//Add custom code here
}
public override void Rollback(IDictionary savedState)
{
base.Rollback(savedState);
//Add custom code here
}
public override void Commit(IDictionary savedState)
{
base.Commit(savedState);
//Add custom code here
}
public override void Uninstall(IDictionary savedState)
{
Process application = null;
foreach (var process in Process.GetProcesses())
{
if (!process.ProcessName.ToLower().Contains("creatinginstaller")) continue;
application = process;
break;
}
if (application != null && application.Responding)
{
application.Kill();
base.Uninstall(savedState);
}
}
}
}
2. 在CreatingInstallerSetup项目上选择 Custom Actions Editor.
3. 右键点击,选择添加自定义行为,然后选择Application Folder中的主输出
4. 任务完成了。
.Net Framework
如果按照软件的电脑上没有 .Net Framework怎么办? 我们可以选择自己的包,这样程序无需依赖客户电脑的 .Net Framework。
打开安装程序的属性窗口.
点击 Prerequisites 按钮,在弹出的窗口中 选择需要的.Net Framework,然后选择第二个单选按钮,点击确定。
浏览安装程序的Debug文件夹,多了两个子文件夹.
需要的文件都包含进来了.
结论
此指南给出了创建安装程序的基本步骤,没有深入解释如注册表、 license agreements . 还有很多需要继续深入的,不过有了这些已经可以完成基本的任务了!