我有我的应用程序的Windows安装程序。 应用程序包还包含“安装程序”类,其中执行的某些操作在“自定义操作”中执行。
安装过程中,安装程序将从“自定义操作”安装另一个应用 我想知道,如果这个应用程序已经存在相同的版本,我不想安装或提供一个Messagebox asknig来重新安装Y / N。
如果我的应用程序已经安装,并再次单击相同的安装程序,我会得到“修复”和“删除”选项。 但是,如果安装程序是新build的,我会得到一个对话框,指出“另一个版本已经安装…删除使用添加删除程序..”。 所以我不能更新现有版本而不卸载它。 我如何更新现有的版本?
任何帮助或指导这两个查询,高度赞赏。 我看了这些networking,但不能得到apropriae答案。 如果你能帮助我,那真是太好了。
码
prouct.xml
<?xml version="1.0" encoding="utf-8" ?> <Product xmlns="http://schemas.microsoft.com/developer/2004/01/bootstrapper" ProductCode="My.Bootstrapper.ABC"> <!-- Create Package, Product Manifest http://msdn.microsoft.com/en-us/library/ee335702.aspx Schema Reference : http://msdn.microsoft.com/en-us/library/ms229223.aspx --> <PackageFiles> <PackageFile Name="XYZ.exe"/> </PackageFiles> <InstallChecks> <!-- If its installed, it will be in Uninstall. DisplayName will be XYZ2.1_rc22 Can still get values of DisplayVersion (2.1_rc22) & UninstallString from this key --> <RegistryCheck Property="IS_XYZ_INSTALLED" Key="HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall\XYZ" Value="DisplayName"/> </InstallChecks> <Commands> <Command PackageFile="XYZ.exe" Arguments="/Install"> <InstallConditions> <BypassIf Property="IS_XYZ_INSTALLED" Compare="ValueEqualTo" Value="XYZ2.1_rc22"/> // tHIS IS THE DISPLAYNAME, THAT I SEE IN REGISTY <FailIf Property="AdminUser" Compare="ValueNotEqualTo" Value="True" String="NotAnAdmin"/> </InstallConditions> <ExitCodes> <ExitCode Value="0" Result="Success"/> <ExitCode Value="1641" Result="SuccessReboot"/> <ExitCode Value="3010" Result="SuccessReboot"/> <DefaultExitCode Result="Fail" String="GeneralFailure"/> </ExitCodes> </Command> </Commands> </Product>
package.xml中
<?xml version="1.0" encoding="utf-8" ?> <Package xmlns="http://schemas.microsoft.com/developer/2004/01/bootstrapper" Name="DisplayName" Culture="Culture"> <!--Check for XYZversion 2.1_rc22 --> <Strings> <String Name="DisplayName">Install My XYZ</String> <String Name="Culture">en</String> <String Name="NotAnAdmin">Administrator permissions are required to install XYZ.Contact your administrator.</String> <String Name="GeneralFailure">A general error has occurred while installing this package.</String> </Strings> </Package>
更新:我想安装XYZ,如果它不是恶意软件安装在PC上。 使用上面的代码,它不会作为先决条件安装。 在先决条件中,我select了我的应用程序(以及Windows Installer 3.1和.NET3.5),并select了“从我的应用程序的相同位置下载prereq”。 在安装项目的构build,我得到3个文件夹在我的Rel(对于winIns,networking和我的应用程序o被安装为preq即XYZ)。 目前XYZ没有安装在我的回合 – 所以密钥将不会被发现。 当我安装安装程序时,它会安装应用程序,但不安装prereq ie XYZ.exe应用程序。 我哪里错了?
谢谢 。
您可以使用GetFileVersionInfo
和VerQueryValue
WinAPI函数(必须有.Net对应项)来检查可执行文件的版本。
您可以在每次生成MSI软件包时更改ProductCode
。 升级必须包括当前版本,即您需要允许在相同版本的软件包之间进行升级,而不必更改ProductVersion
。
然而,我会推荐以下Cosmin的建议 。
更新 :回答评论。
<Upgrade Id="Your-Upgrade-GUID"> <UpgradeVersion Minimum="$(var.ProductVersion)" IncludeMinimum="no" OnlyDetect="yes" Language="1033" Property="NEWPRODUCTFOUND" /> <!-- NEWPRODUCTFOUND property is set if a newer product version is installed. It is used to prevent downgrades. --> <UpgradeVersion Minimum="1.0.0" IncludeMinimum="yes" Maximum="$(var.ProductVersion)" IncludeMaximum="yes" Language="1033" Property="UPGRADEFOUND" /> <!-- UPGRADEFOUND property is set if older product version is installed or the same as the value of ProductVersion variable --> </Upgrade>
我们使用上面的代码甚至在相同版本的应用程序之间执行升级。 ProductVersion
是包含当前版本的产品的WiX预处理器变量。 PackageCode
是每个构建自动生成的,使用*
作为其在.wsx文件中的值。
使其工作的关键IncludeMaximum="yes"
第二个UpgradeVersion
元素中的IncludeMaximum="yes"
属性,以及每个生成的包都具有唯一的UpgradeVersion
的事实。
安装过程中,安装程序将从“自定义操作”安装另一个应用 我想知道,如果这个应用程序已经存在相同的版本,我不想安装或提供一个Messagebox asknig来重新安装Y / N。
而不是自定义操作,您应该使用先决条件。 如果您正在使用Visual Studio安装项目,则可能会有所帮助: 将自定义预置添加到Visual Studio安装项目
如果您正在使用其他安装创作工具,则应该了解它是否支持先决条件。
如果我的应用程序已经安装,并再次单击相同的安装程序,我会得到“修复”和“删除”选项。 但是,如果安装程序是新建的,我会得到一个对话框,指出“另一个版本已经安装…删除使用添加删除程序..”。 所以我不能更新现有版本而不卸载它。 我如何更新现有的版本?
发生这种情况是因为您修改了包而不增加ProductVersion并修改ProductCode。 如果你想自动升级,你需要修改它们。
但是,如果您只是测试并且不想增加ProductVersion,则需要在安装新软件包之前手动卸载旧软件包。 这是Windows Installer升级的工作方式。