InstallShield 2018同时打包32位和64位

InstallShield可谓打包神器,之前用的是2013版的,作为VS的一个项目模板使用,这次尝试了下2018版的,显然,功能更强大了。
由于现在的电脑系统都分64位和32位,这就要求打包的时候可能需要针对两种不同的系统打包,过去,我们不得不通过InstallShield新建两个项目各自打包,现在,我们可以利用InstallShield 2018的Features(其实我也不知道Features是哪一版引进的= =)特性在同一个项目里打出一个包,由用户选择安装32位还是64位的。

话不多说,如图新建项目:
InstallShield 2018同时打包32位和64位
Project Name和Location按需填写,建议Location在默认路径下加一层目录,这样区分不同的客户端产品。

进入Installation Designer面板,打包90%的工作都将在这个面板完成。
1.进入General Information填写应用的基本信息,比如Product Name/Produc Version等,注意Product Code和Upgrade Code是设计到更新版本时用的,最好记下来,下次打更新包的时候,只需更新Product Code即可做到覆盖安装。
2.进入Organization-Components,新建2个Component,一个32位,一个64位,在Component的基本信息面板里指定安装路径Destination,正常都放在ProgramFilesFolder下,首先将这个目录下不用的路径删掉,然后新建自己需要的路径。
InstallShield 2018同时打包32位和64位
在各自的Files里Add File,将自己开发的exe以及依赖的dll都添加进来。此时有个问题,如果我需要打包文件夹呢?右击发现除了Add File外还有一个Dynamic File Linking,尝试下来发现,这个功能也只是把链接的文件夹里的文件加进来,而不是把文件夹加进来,显然不符合要求。经过几番周折与尝试,发现Component其实就是文件夹的概念,那么就多建几个Component,分别将文件添加进来,在指定Destination时将这些Component的路径分别放到32位和64位两个主Component下。
InstallShield 2018同时打包32位和64位
Browse for Directory里的目录就是最终安装的目录,需要注意的一点是,弹出框最下面有个Directory Identifier,这相当于是各个目录的一个“主键”,比如,两个包下面有都有x64路径,如果把Identifier都指定为x64的话,就会报错。
还有一个很重要的点,就是安装目录权限的问题,由于安装程序是以管理员权限安装的,但是使用客户端的用户并不一定有管理员权限,此时客户端不能够在安装目录下进行“写”操作,包括写Config文件,这种情况下,可以在程序app.manifest里添加<requestedExecutionLevel level="requireAdministrator" uiAccess="false" />
这行代码会在用户运行客户端的时候索取管理员权限,只有当用户点击了允许之后,程序才可以继续运行。但是这个方法有两个比较大的缺陷:
(1)每次打开客户端读弹出UAC确认框,严重影响用户体验。
(2)程序是以管理员权限运行的,其它无管理员权限的程序就无法对本程序生成的文件进行“写”操作;如果你的程序使用了拖拽功能,那么从无管理员权限的程序里也无法拖拽文件进入我们的程序了。这篇文章介绍了拖拽跟UAC的关系,https://blogs.msdn.microsoft.com/patricka/2010/01/28/q-why-doesnt-drag-and-drop-work-when-my-application-is-running-elevated-a-mandatory-integrity-control-and-uipi/
说到底,都是UAC在作祟,那么有没有其他方法可以解决呢?答案是肯定的。只需要在打包的时候设置一下安装路径的访问权限就行了。
InstallShield 2018同时打包32位和64位
3.进入Organization-Features,新建两个Feature,分别对应32位和64位,在General面板里按需填入相关信息。
InstallShield 2018同时打包32位和64位
4. 进入Organization-Setup Design,这里其实是跟Features挂钩的,右击将对应的Component关联(Associate)进来就行了。其实也可以在Setup Design里新建Features和Components,系统会自动在各自的tab里生成相应文件。

此时已经可以编译了,通常会用到下面3个按钮
InstallShield 2018同时打包32位和64位
第1个是Release,会最终打成一个安装包;第2个是Build,会有一些编译文件;第3个是打开包目录,打包的时候这个目录记得关掉哦,这个懂的自然懂。
Release的时候一路下一步就行了,记得选一下Compress all files,这个大家多多尝试、多多体会。
第一次Release完了之后,按下图设置一下Cache MSI Locally,这个是安装完了之后,再次安装,安装包会提示修复,但是修复会出错,设置了这个后再修复就没问题了。
InstallShield 2018同时打包32位和64位

安装的时候,会让用户选择我们设定好的Features
InstallShield 2018同时打包32位和64位

最后,给应用设置一个图标咯,分别对应开始菜单和桌面图标
InstallShield 2018同时打包32位和64位

tips:
开发的时候,也要针对不同的包引用不同的dll,怎么样操作最快捷方便呢?
可以巧妙利用Release和Debug环境,在项目属性-生成事件里,编辑后期生成事件命令行:

if /i $(ConfigurationName)==Debug (
cd /d $(ProjectDir)Dependents\dllimport\x86
xcopy "livingStream\*.dll"  /d /e /r  "$(TargetDir)livingStream\"
for %%i in (*.dll) do copy /Y %%i $(TargetDir)
)else (
cd /d $(ProjectDir)Dependents\dllimport\x64
for %%i in (*.dll) do copy /Y %%i $(TargetDir)
)

如果是Debug环境,则复制x86和 livingStream下的dll,如果是Release环境,则复制x64下的dll。
注意命令行的一些空格和换行哦,很严谨,调了我老半天= =