您好,欢迎来到世旅网。
搜索
您的当前位置:首页C#winform程序打包详细教程

C#winform程序打包详细教程

来源:世旅网
一、 基础打包操作

1. 新建打包工程

文件->新建->项目,选择其他项目类型->安装项目,命名项目并选择存放目录。

一个打包工程建立好以后,点击项目上方,会看到打包工程主要操作的功能项,从左到右依次包括文件系统、注册表项、文件类型编辑、用户界面编辑、自定义操作编辑、和启动条件编辑。

其中通过文件系统操作可以设置应用程序的安装路径,用户文件夹以及桌面快捷方式等;

通过修改注册表项可以定义在安装过程中,需要向注册表添加的注册表项目;

通过用户界面编辑可以设置和修改各种安装过程中的操作界面,如欢迎界面以及用户自定义的操作界面等;

自定义操作编辑允许通过写代码的方式,干预安装过程,可以更加灵活的在安装过程中的几个关键时刻加入自定义的操作过程

(比如融入注册表检查和操作、文件读写、数据库建表等),总之通过控制代码可以进行任何可能的操作。

启动条件编辑定义了程序的整体可运行环境。

一个安装工程建立以后,可以设置相应的属性信息。比较常用的如生产商,产品名称以及版本号等。

2. 建立应用程序文件夹

打开“文件系统”视图,添加文件。

应用程序文件夹:通过点击右键弹出菜单,可以添加安装目录下对应的子目录,或者向安装目录或者子目录中添加文件。 用户的程序菜单:添加应用程序安装后,windows应用程序菜单中对应的文件夹,以及文件夹中的快捷方式等。

用户桌面:添加应用程序安装后,桌面上建立的文件夹以及其中的快捷方式。

3. 设置安装路径

点击应用程序文件夹,查看属性面板中对应的属性,在DefaultLocation中设置默认的程序安装路径。

其中的ProctName是点击打包工程弹出的属性框中,ProductName(产品名称)设置的产品名称。

4. 添加被打包的文件

在建立安装文件夹中,点击右键菜单,选择添加文件,从本地选择已经生成并需要进行打包的文件,并将文件添加到安装文件夹中。

5. 添加快捷方式

可以点击应用程序exe文件并将快捷方式剪切到对应的“程序菜单”或“桌面”文件夹中。

选中已经建立的快捷方式,并将该快捷方式对应的图标添加好,图标是ICO格式文件。

6. 添加卸载

无论是添加还是卸载,其实调用的都是微软自带的windows Installer应用程序,安装时点击生成的Setup或者XXX.msi文件会自动启动msiexec.exe应用程序执行安装过程。在系统文件夹system32中可以找到。

首先,先在系统中找到msiexec文件,然后将其添加到项目文件中;选中该文件可以命名为其他名称,如Uninstall.exe。 最后,针对该exe,可以按照之前的方式再建立快捷方式,并将快捷方式对应的图标建立好。 最关键的一步是需要在该快捷方式上设置卸载是传入的命令行参数,如图:

7. 支持升级覆盖安装

在打包工程的设置选项中,有一项是RemovePreviousVersion选项,该选项的含义是在安装新程序时是否移除旧版本。如果一个产品已经被安装过,在进行重复安装的时候,系统会给出如下提示:

此时用户只有两个选择,一是修复,而是删除。

但是如果选择RemovePreviousVersion为TRUE,则可以再安装新的版本的时候,将旧版本删除,再安装新的版本。但是这就需要启用安装包的版本号:

首先需要升级版本号,之后会给出提示,如图:

点击“是”后,新的productCode会自动生成,同时不要忘记更新卸载快捷方式中对应的卸载参数中的productcode,否则之后升级安装可以成功,但是却无法进行产品卸载。

8. 添加系统的依赖项

对于.net程序,在运行程序期间需要先安装运行环境,对于.net3.5程序,至少需要windows installer和.net framework3.5的框架程序。打包时可以选择是否将这些运行依赖项目一起整合到安装包中。

点击安装工程,选中右键菜单的”属性”,点击”系统必备”,显示系统必备窗体。

选择第二项会把安装程序打包到安装程序对应的同级目录中。

打包后,生成的打包结果中,会有对应的系统必备项目录。

9. 生成打包工程

所有的程序集、依赖项、必须文件被添加完成,安装以及卸载的快捷方式都已经建立后,就可以生成打包工程了。

可以在打包工程项目中的属性页中设置打包程序生成的路径:

项目生成后,会在对应的目录中生成XXX.msi文件以及对应的setup文件,如果选择过系统必备,还会生成对应的系统必备项。

10. 进行安装测试

进行测试时候,需要在不同的操作系统环境中对安装包进行测试。

二、 高级打包操作

1. 添加自定义操作概述

在安装过程中添加自定义操作允许用户在安装过程中添加其他的操作,甚至可以通过写代码的方式在安装过程中添加其他操作。 用户可以干预的安装过程有四个时机,分别是:安装、提交、回滚和卸载。 在安装过程中添加自定义操作的应用场景是非常广泛的:

1、 在安装过程中,整个安装其他的应用程序,实现应用以及相关程序的一键安装。 2、 在安装过程中,需要检查注册表,如果必要,需要对注册表进行操作。 3、 在安装过程中。需要进行文件的相关操作。(文件的拷贝、复制和删除等操作)

1.1 通过添加自定义操作的方式,在安装过程中整合安装其他内容

下面以在安装过程中整合一个驱动安装为例,说明如何在安装过程中添加自定义操作。

1.1.1 把将需要安装的项目打入安装包

首先需要把安装文件打包到安装项目中,请参照添加被打包的文件,将需要被安装的驱动程序打包到相应的安装目录下。

1.1.2 打开自定义操作视图

选中安装项目,点击<自定义操作视图>,打开自定义操作视图。

从视图中可以看到,能够通过自定义操作干预安装过程中的四个点,分别是:安装、提交、回滚和卸载;这四个过程可以添加自定义操作。右键单击某一个过程,在弹出式菜单中选中<添加自定义操作>,会弹出添加对话框。

从该对话框中可以看出,添加的自定义操作支持*.exe *.dll *.vbs以及*.js格式的文件;其中比较常用的是添加.exe以及.dll操作。其中需要注意的是:添加自定义操作的选择范围仅限于通过文件系统范围中的文件选择,也就是说是安装目录的范围内选择。(这个可以理解,毕竟安装过程中操作的是安装目标客户机的安装目录中的内容,所以不可能从其他目录选择)

1.1.3 添加自定义操作

然后再添加自定义操作中,在安装过程中,选中驱动安装的.exe执行文件即可。

添加自定以操作成功后,被添加的文件会有以下属性:

1.1.4 验证安装过程

安装过程中,会自动安装选中的驱动,如图:

1.2 通过写代码的方式,在安装过程中加入自定义操作

以下以安装过程中,需要注册OCX控件;卸载之后,需要注销OCX控件的操作为例,描述如何通过写代码的方式添加安装过程中的自定义操作。

1.2.1 新建自定义项目

右键点击解决方案管理器,在弹出菜单中选择<新建项目>

添加安装类:和向代码中添加一个新类的过程是一样的,但是一定要选择安装项目类;该类添加以后,从代码上看实际上该类是继承自Installer类的,有关该类的信息,可以参照MSDN中的信息。 [RunInstallerAttribute(true)]

public partial class MyInstaller : Installer

{。。。 }

这个自定义操作的核心方法全在这个类中,该DLL由安装进程直接调用,主要需要重载以下几个方法: protected override void OnBeforeInstall(IDictionary savedState) protected override void OnAfterInstall(IDictionary savedState) protected override void OnBeforeUninstall(IDictionary savedState) protected override void OnAfterUninstall(IDictionary savedState) protected override void OnBeforeRollback(IDictionary savedState) protected override void OnAfterRollback(IDictionary savedState) protected override void OnCommitting(IDictionary savedState) protected override void OnCommitted(IDictionary savedState)

之前在自定义操作中提到了四个时机,在以上重载的几个函数中都有体现,也就是说,自定义安装过程可以通过重写以上8个函数,干预8个过程点。

1.2.2 添加自定义操作过程代码

由于我们需要在安装过程中注册OCX控件,卸载过程中注销OCX控件,因此我们需要在安装之后以及卸载之后做注册和注销控件的操作,参考如下代码: 安装之后注册控件:

protected override void OnAfterInstall(IDictionary savedState) {

base.OnAfterInstall(savedState);

try {

m_Log.WriteLog(\"系统主程序安装过程完成\"); m_Log.WriteLog(\"准备语音控件注册过程\");

OCXControlRegister.RegisterOCX(m_strInstallPath,m_Log);

m_Log.WriteLog(\"系统注册语音控件完成\");

}

catch (System.Exception ex) {

m_Log.WriteLog(\"安装过程出现异常\"+ex.Message); }

finally {

m_Log.WriteLog(\"系统安装成功结束\"); } }

卸载之后注销控件:

protected override void OnAfterUninstall(IDictionary savedState) {

//_asm int 3;

//System.Diagnostics.Debugger.Launch(); base.OnAfterUninstall(savedState);

//CTIOCX控件反注册 try {

m_Log.WriteLog(\"系统主程序卸载完成\");

//卸载语音控件

OCXControlRegister.UnRegisterOCX(m_strInstallPath, m_Log);

m_Log.WriteLog(\"系统卸载语音控件完成\");

DelSubFoldersAndFiles(); }

catch (System.Exception ex) {

m_Log.WriteLog(\"系统过程出现异常。\"+ex.Message); }

finally {

m_Log.WriteLog(\"系统卸载成功结束\"); } }

至于如何注册以及卸载OCX控件,不在本文的讨论范围,所以其详细的代码也没有列在本文中。

写完安装代码之后,进行编译,保证工程没有问题。

调整该自定义项目的生成路径,便于之后找到这个生成项目,注意该项目是要添加到打包工程中的。

这是一个比较特殊的工程,并没有main函数,这个DLL在被添加到自定义操作以后,是由安装进程进行调用的。

1.2.3 将生成的自定义安装过程添加到安装目录中

有两种方式,

一种是添加项目输出:先在安装目录中添加项目输出,再选需要输出的项目即可。

另外一种方式是:将之前设置生成好的DLL,直接以程序集的方式添加到项目中。

选中添加程序集,然后根据之前设置好的生成路径,将该程序集添加到应用程序文件夹中

1.2.4 添加自定义过程的过程以及传递的参数,最常传递的参数是安装路径

添加自定义操作,将之前已经添加到应用程序文件夹中的程序集或者项目输出,添加自定义操作中,由于我们需要在安装和卸载的过程中进行操作,所以需要在<安装>和<卸载>中都添加自定义操作。

之后是非常关键的一个步骤,需要为自定义操作传递参数,这里以传递安装路径为参数,说明如何传递参数

还可以传递其他参数,详情请参照MSDN说明。

1.2.5 如何调试自定义过程中的代码

由于自定义操作的DLL是有安装程序调用的,可以通过以下几种方式对该过程进行调试: 1、 添加mesagebox进行调试;

2、 通过写log文件的方式进行调试; 3、 内部发消息

在您的代码中添加对 System.Diagnostics.Debugger.Launch() 的调用。该方法会打开实时调试,并允许您将新的调试器附加到您的代码。

4、 想办法中断处理过程,然后附加进程。 5、 配置调试入口

将调试首选项设置为启动 InstallUtil.exe(位于 \\winnt\\Microsoft.net\\Framework\\version )并将其作为参数传递给程序集。按 F5 时,命中断点。InstallUtil.exe 运行自定义操作的方式将和 MSI 一样。

1.2.6 打包测试

找一台真实环境的电脑或者虚拟机进行测试,测试的时候注意需要在不同的安装环境中测试,如XP32位,win7 X86,win7X64等环境,保证安装和卸载在不同的环境下都可正确运行。

2. 添加注册表:(待续)

3. 添加安装过程用户自定义界面(待续)

三、 注意事项

1. 托管代码的依赖项会自动检测,非托管以及第三方.net库有可能无法自动检测依赖项,

默认的情况下,一个.netEXE程序的被添加到应用程序文件夹中,会自动将依赖项也添加进来,但是不是都有的依赖项都可

以添加。有以下几下几种情况是无法检查到的: 1、 间接引用的DLL不会被检测到:

例如,exe依赖DLLB,但是DLLB依赖DLLA,但是打包的时候只有DLLB会被自动引入进来,DLLA是无法被自动添加进来的所有需要手动添加DLLA。

2、 第三方的.net库可能出现不被引用的情况,需手动添加。

3、 非托管库一定不会被引入进来,必须手动添加。如调用C/C++的DLL,Com组件等。

4、 应用程序中很可能包括的一些非程序资源,如声音文件、图片文件等,这些都不会被检测成为程序的依赖项,需要手动

添加。

因此打包的时候只靠默认依赖项打包有可能会造成打包文件的丢失,造成安装后程序出现无法使用的情况。因此最好的方式是手动将每个需要的程序集添加到应用程序文件夹中,并在打包之后进行严格的安装测试。

2. 在不同的环境中,测试打包程序

需要在32位和64位,XP和win7等不同的操作系统环境中进行安装包的测试。(例如32位和64位程序的注册表的位置是不同的,不测试会出现问题的)

3. 在自定义操作中如何获取安装路径?

如何得到用户所选安装路径?在实现代码的时候,用户所选安装路径大多数情况下都要用到,怎么得到他的值呢?在自定义操作->安装->“主输出来自Library(活动)”上面右键属性,在CustomActionData中填入/targetdir=\"[TARGETDIR]\\\",然后在类InstallerTest中用这句话this.Context.Parameters[\"targetdir\"] 就可以取得安装的目录了。

这里一定要注意\"[TARGETDIR]\\\"后面最后的斜杠,如果忘记了,安装过程中,在调用DLL的时候会出现异常的,导致整个安装过程失败。

8、右键单击解决方案中的PicShowSetupSolution项目,选择视图->用户界面

可修改已有窗口的文字显示、进度条显示、图片等信息

安装过程中需要输入验证码、用户名等信息时,可以添加新的窗口 待补充

9、右键单击解决方案中的PicShowSetupSolution项目,选择视图->自定义操作

右键单击安装,添加操作,在系统安装文件夹中选择文件

安装:在安装客户端完成后、安装结束前,执行该文件 提交:跟安装类似 回滚:?

卸载:卸载客户端时,执行改文件

10、自定义操作可添加执行文件类型限于exe\\dll\\vbj\\js,对于.bat脚本文件执行,可以通过编码方式添加。 添加新的类库项目

添加安装项目类

该类继承自Install类,有AfterInstall、BeforeInstall、AfterCommit、AfterUnInstall等多个事件,在对应事件中,通过编码完成安装过程中需要执行的文件。

返回到步骤9中添加自定义操作的界面,选择添加输出->主输出,把上面创建的MyLibiary.dll添加的应用程序文件夹,并选择该dll文件

MyLibrary库可以在安装、提交、回滚、卸载中都添加,根据MyInstall.cs文件中得事件选择添加位置。

MyLibrary获取启动项目录位置的方法: string path = Assembly.GetExecutingAssembly().Location;

path = path.Remove(path.LastIndexOf(\"\\\\\"));//应用程序文件夹根目录 string command = path + “文件在安装根路径的相对位置”;

System.Diagnostics.Process p = new System.Diagnostics.Process(); p.StartInfo = new System.Diagnostics.ProcessStartInfo(command); p.StartInfo.UseShellExecute = false;

p.StartInfo.RedirectStandardInput = true; p.StartInfo.RedirectStandardOutput = true; p.StartInfo.CreateNoWindow = true;

p.Start();//启动新进程执行

四、 知识附录

1. 有关msiexec程序

.net安装过程中,需要调用到msiexec程序,该程序的位置在system32系统目录中。 可以通过命令行的方式对msiexec可传入的参数进行查看:C:\\Users\\IBM>msiexec ?

通过查看命令行参数,可以知道传入/x productCode是进行卸载的选项。 其中还有几个比较常用的功能,例如静默安装,升级安装,修复等功能。

2. 有关C#工程编译时的生成事件:

生成事件用于在工程生成以后,进行的一系列的自定义操作,例如文件拷贝操作等。

例如,如果将某一个工程的生成事件的命令行参数设置如下,需求是将工程生成路径下的所有内容copy到一个目标目录下: xcopy \"$(TargetDir)*\" \"C:\\UpdateRun\" /e /y /i

其中类似<$(TargetDir)>标示符的含义请参照MSDN文档中的《预生成事件/生成后事件命令行对话框》中的一节,有明确的说明。

3. 有关安装过程中的自定义操作的基础知识

请参考MSDN中<自定义操作>一节的内容,里边有详细的介绍。

因篇幅问题不能全部显示,请点此查看更多更全内容

Copyright © 2019- esig.cn 版权所有

违法及侵权请联系:TEL:199 1889 7713 E-MAIL:2724546146@qq.com

本站由北京市万商天勤律师事务所王兴未律师提供法律服务