转载地址:http://www.tzwhx.com/newOperate/html/1/11/112/18823.html
<!--[if !supportLists]-->1. <!--[endif]-->新建一个Class Library, 例如Name 为 CustomAction. 这个就是一个自定义安装行为的类。
<!--[if !vml]--><!--[endif]-->
<!--[if !supportLists]-->2. <!--[endif]-->添加安装类。在新建的Library里面添加一个 Installer Class,名字我暂时定为MyInstallerClassDll
<!--[if !vml]--><!--[endif]-->
<!--[if !supportLists]-->3. <!--[endif]-->重写基类的函数
Commit
Install
OnAfterInstall
OnAfterRollback
OnAfterUninstall
OnBeforeInstall
OnBeforeRollback
OnBeforeUninstall
OnCommitted
OnCommitting
Rollback
Uninstall
每个函数对应的是安装过程中的不同时期。
我暂时重写了Commit函数,但是还没有自己的实现。
public override void Commit(System.Collections.IDictionary savedState)
{
base.Commit(savedState);
}
<!--[if !supportLists]-->4. <!--[endif]-->新建一个setup工程,在Other Project Types里面,并且下拉框选中Add to Solution。我暂时命名为setup. 当然这个前提是你有一个想安装的程序。或者有你想制作安装程序的编译后的文件。
<!--[if !vml]--><!--[endif]-->
<!--[if !supportLists]-->5. <!--[endif]-->添加源程序文件。
切换Setup工程的视图为File System
<!--[if !vml]--><!--[endif]-->
左键点击Application Folder.这个文件夹就是放源程序文件的。User’s Desktop是放桌面快捷方式的,User’s Programs Menu是定义开始菜单的。
<!--[if !vml]--><!--[endif]-->
在右边空白的地方右键选中添加项目输出文件
<!--[if !vml]--><!--[endif]-->
下面下来列表选中你要安装的程序,比如我要安装的是WpfSetup。按住Ctrl键选中Primary output和 Contetn Files,点击OK键。这样就把需要安装的程序的编译后的主要文件都添加进来了。当然也可以手动添加进来如上图选中Add->File然后浏览到你的release或者是debug后的文件夹,然后选中主要文件添加进来。
<!--[if !vml]--><!--[endif]-->
<!--[if !supportLists]-->6. <!--[endif]-->创建快捷方式。在刚刚添加的Primary output from WpfSetup(Active)上面点击右键,选择创建快捷方式,然后重命名。
<!--[if !vml]--><!--[endif]-->
<!--[if !vml]--><!--[endif]-->
把这个重命名的文件用鼠标左键托到User’s Desktop文件夹里面,这样的话就会在桌面上面生成一个快捷方式,然后再自定义开始菜单的结构,安装通常的做法,我们在User’s Programs Menu文件夹里面新建一个文件夹用于放置我们安装卸载以及帮助手册之类的快捷方式。我定义的文件夹是WPFSample,快捷方式的添加参照User’s Desktop里面快捷方式的添加。
这样的话安装程序的文件结构已经完成了。
7. 设置系统必备属性。
在setup工程上面点击右键选择属性。
<!--[if !vml]--><!--[endif]-->
点击Prerequisites,在弹出的对话框里面选择如下图所示的选项,一定要选择Download prerequisites from the same location as my application. 当然你也可以根据你的SDK选择不不同的版本。如果你选择的是3.5 Sp1。
<!--[if !vml]--><!--[endif]-->
如果在编译的过程中出现了The install location for prerequisites has not been set to 'component vendor's web site' and the file 'dotNetFx35setup.exe' in item 'Microsoft.Net.Framework.3.5.SP1' cannot be located on disk.这样的错误你就需要进行如下操作:
<!--[if !supportLists]-->1. <!--[endif]-->打开[Program Files]/Microsoft SDKs/Windows/v6.0A/Bootstrapper/Packages/
DotNetFx35SP1 文件夹,在x64 操作系统上是 %ProgramFiles(x86)%/Microsoft SDKs/Windows/v6.0A/Bootstrapper/Packages/DotNetFx35SP1
<!--[if !supportLists]-->2. <!--[endif]-->修改Product.xml文件,在<PackageFiles>节点里面添加下列内容,然后保存。
<PackageFile Name="TOOLS/clwireg.exe" />
<PackageFile Name="TOOLS/clwireg_x64.exe" />
<tPackageFile Name="TOOLS/clwireg_ia64.exe" />
<!--[if !supportLists]-->3. <!--[endif]-->打开这个网址http://go.microsoft.com/fwlink?LinkID=118080,下载dotNetFx35.exe
<!--[if !supportLists]-->4. <!--[endif]-->打开命令提示符窗口(DOS窗口),并且进入你下载的dotNetFx35.exe的文件夹
<!--[if !supportLists]-->5. <!--[endif]-->执行下面这个命令dotNetFx35.exe /x:。注意/x后面有个冒号呢。
<!--[if !supportLists]-->6. <!--[endif]-->把解压后的WCU/dotNetFramework里面的文件(如下图)拷贝到上面路径提到的DotNetFx35SP1文件夹下面
如果还有问题
1. 在Product.xml找到<PackageFile Name="dotNetFX30/XPSEPSC-x86-en-US.exe" 然后修改 PublicKey 的值为: 3082010A0282010100A2DB0A8DCFC2C1499BCDAA3A34AD23596BDB6CBE2122B794C8EAAEBFC6D526C232118BBCDA5D2CFB36561E152BAE8F0DDD14A36E284C7F163F41AC8D40B146880DD98194AD9706D05744765CEAF1FC0EE27F74A333CB74E5EFE361A17E03B745FFD53E12D5B0CA5E0DD07BF2B7130DFC606A2885758CB7ADBC85E817B490BEF516B6625DED11DF3AEE215B8BAF8073C345E3958977609BE7AD77C1378D33142F13DB62C9AE1AA94F9867ADD420393071E08D6746E2C61CF40D5074412FE805246A216B49B092C4B239C742A56D5C184AAB8FD78E833E780A47D8A4B28423C3E2F27B66B14A74BD26414B9C6114604E30C882F3D00B707CEE554D77D2085576810203010001
2.找到<PackageFile Name="dotNetFX30/XPSEPSC-amd64-en-US.exe" 按照上面的步骤修改。
<!--[if !vml]--><!--[endif]-->
8.设置安装程序的属性
在setup工程上面右键点击选择属性。如下图。可以选择需要修改的属性,比如语言,作者和制造商以及安装程序的名字等等。
<!--[if !vml]--><!--[endif]-->
9.Rebuild 这个安装部署工程,然后在debug或者release文件里面找到安装文件,比如我的是WPFSample.msi. 双击就可以运行了。
10. 自定义安装界面
在setup工程上面点击右键选择用户界面视图
<!--[if !vml]--><!--[endif]-->
打开后如下图,可以看到安装分下面三个部分,Start, Progress, End.我们可以在任意一个部分添加任意一个窗口。有些窗口需要用户输入参数的,这样的话就需要在后台获得这些参数,这样就需要我们开始建立的CustomAction类了。
<!--[if !vml]--><!--[endif]-->
11. 自定义安装行为,选中一个你添加的对话框,比如我选中的是TextBoxes (A),它有四个输入框
我只需要两个所以第三个和第四个的Visible属性都是false. 然后定义第一个和第二个输入框的属性名字,我定义的是NAME和PASSWORD。
<!--[if !vml]--><!--[endif]-->
切换到Customs Actions视图
<!--[if !vml]--><!--[endif]-->
在Install和Commit文件上面右键添加上面定义的那个Custom Action.当然这个Primary output已经添加到了Application Folder里面了(添加方法参照上文)。这个也可以就是那个工程的.dll文件。
<!--[if !vml]--><!--[endif]-->
选择Install或者Commit文件里面的CustomAction文件,查看属性
<!--[if !vml]--><!--[endif]-->
在CustomActionData属性里面输入参数名称和值例如/name=[NAME]这个表达式的意思就是定义一个变量名字是name值是前面添加的那个对话框的属性名称并用[]括起来。这样就可以在自定义安装类里面得到了。方法如下:
string name = this.Context.Parameters["name"].ToString();
string pass = this.Context.Parameters["password"].ToString();
这样就得到了输入框的值。然后在进行一些逻辑操作。也可以抛出一个异常来终止安装过程,并回滚。
throw new Exception("Invalidate name");
回滚和卸载的程序我们也可以自定义,道理都是一样的。
12. 实现卸载
找到msiexec.exe这个文件,通常在C:/WINDOWS下面
添加到Application Folder里面修改名字为Uninstall.exe(也可以不修改)。
创建快捷方式,移到User’s Programs Menu下面的自定义的那个文件夹下面如WPFSample文件下面
然后打开属性窗口,设置Arguments值为 /x ProductCode <!--[if !vml]--><!--[endif]-->
这个ProductCode值在Setup工程的属性页可以看到
<!--[if !vml]--><!--[endif]-->
这样就完成了卸载程序了。