Tvd*_*Tvd 6 c# windows installer
我的应用程序有一个Windows Installer.应用程序包还包含Installer类,其中执行其他一些操作在"自定义操作"中执行.
安装程序在安装期间从安装程序安装另一个应用程序.我想知道这个应用程序是否已存在相同版本我不想安装或提供Messagebox asknig重新安装Y/N.
如果我的应用程序已经安装,并且我再次单击相同的安装程序,则会显示"修复"和"删除"选项.但是如果新构建了安装程序,我会收到一个对话框,指出"已经安装了另一个版本...使用"添加删除程序"删除..".所以我无法在没有卸载它的情况下更新exisitng版本.如何更新现有版本?
任何有关这两个查询的帮助或指导都非常感谢.我在网上寻找这些,但无法获得适当的答案.如果你能帮助我,那真的很棒.
码
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>
Run Code Online (Sandbox Code Playgroud)
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>
Run Code Online (Sandbox Code Playgroud)
更新: 我想安装XYZ,如果它不是安装在PC上的alerady.使用Above代码时,它不会安装为先决条件.在先决条件中,我选择我的应用程序(以及Windows Installer 3.1和.NET3.5),并选择"从与我的appli相同的位置下载prereq".在构建安装项目时,我在我的Rel中获得了3个文件夹(对于winIns,Net和我的应用程序将作为preq即XYZ安装).目前我的comp上没有安装XYZ - 因此找不到密钥.当我安装安装程序时,它会安装应用程序但不安装先决条件即XYZ.exe应用程序.我哪里错了?
谢谢 .
GetFileVersionInfo您可以使用WinAPI函数检查可执行文件的版本VerQueryValue(必须有 .Net 对应项)。
您可以ProductCode在每次生成 MSI 包时进行更改。升级必须包括当前版本,即您需要允许同一版本的软件包之间进行升级,而不更改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>
Run Code Online (Sandbox Code Playgroud)
我们使用上面的代码甚至可以在同一版本的应用程序之间执行升级。ProductVersion是一个 WiX 预处理器变量,包含产品的当前版本。PackageCode每个构建都会自动生成,并用作*.wsx 文件中的值。
使其工作的关键是IncludeMaximum="yes"第二个UpgradeVersion元素中的属性以及每个生成的包都有唯一的事实PackageCode。
| 归档时间: |
|
| 查看次数: |
1111 次 |
| 最近记录: |