目前的项目开发的程序是有两个依赖程序(A,B),第三方软件公司开发好了依赖程序的独立安装包A.exe 和B.exe,目前的项目方要求将我们自己开发的主程序和依赖的第三方程
序安装包打包在一起通过我们的安装包直接将其也安装了。本人初次开发做安装包,没有经验,因为之前做的测试版安装包并没有包含第三方软件的安装,且是用VS Installer 制
作,故还是想通过VS Installer来实现这一功能。摸索了一下午,基本解决这个问题,通过 VS Installer 提供的自定义操作来实现,一下是具体步骤:
第一步:先写个包含检测和调用A.exe和B.exe的win32程序,首先通过读写注册表来判断是否已经安装了所依赖的程序A和B。需要读的注册表项
为:HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\App Paths
或HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall
App Paths的子键值只包括可执行程序的名称,而Uninstall 子键值 包含软件的详细信息,包括软件名称、路径、版本等,可以根据实现功能的复杂度来遍历哪个键值。主要通
过Registry类和Process类来操作,如何使用很简单,网上到处都是,这就不贴代码了。 写个流程
该程序写好之后,假设命名为SoftwareDetection ,将SoftwareDetection.exe 文件和使用到的资源文件 (如A和B的安装包程序)放在主程序的Debug目录下或其子目录下
第二步:写一个win32引导程序LeadSD,用来引导SoftwareDetection.exe,因为如果检测到本地计算机没有安装依赖程序A和B,我们将调用A和B程序的安装包,而安装包程序
是不可以几个同时安装的,但有人会问你不是使用了Process类的WaitForExist () 方法,不就是使这个安装的关联线程执行完毕后才继续主线程吗?不可能同时有两个安装进程
A和B。没错,A和B安装进程不会同时执行,在两个都触发的情况下,只会一个执行完再执行下一个。但现在是因为我们的SoftwareDetection.exe 程序是在 自定义操作 的元素
“安装”下触发,也就是说是我们的主安装进程和A或B的安装进程可能造成冲突导致 A或B的安装进程无法正确执行。因此我们需要写一个引导程序LeadSD,这样主安装程序触
发LeadSD后,LeadSD再触发SoftwareDetection.exe,LeadSD执行完毕后,主安装进程就能退出,与SoftwareDetection.exe 的执行就没有关系了,不会影响A或B的安装进
程。而LeadSD的程序就一句话:Process.Start(System.Windows.Forms.Application.StartupPath + "\\SoftwareDetection.exe");
注:System.Windows.Forms.Application.StartupPath 是获取启动了应用程序的可执行文件的路径。
同理将LeadSD.exe文件也放在主程序的Debug目录下或其子目录下(注意路径)
第三步:在 “解决方案 ”下 安装项目上右击 “ 视图 ” 选择 “自定义操作”
关于“自定义操作”可以去MSDN 上查看详细描述,一下摘自MSDN,简单描述下 自定义操作的各个元素的触发时间
我们在”安装“的元素上 右击 添加自定义操作 ,将我们第二步写的程序LeadSD.exe添加进来,并将其属性值InstallerClass修改为False,否则无法触发LeadSD.exe
生成安装项目,大功告成,因为包含了第三方的两个安装包所以这个安装包比较大几百兆。