我想将 VC++ Redistributable 2013 添加到现有的工作 WiX 项目中。该项目由一个带有一个<Product>元素的主文件组成,其中包含一个<Feature>和一个<InstallExecuteSequence>元素以及其他一些元素。
我发现您可以使用<ExePackage>fromBurn来安装.exe文件(在我的例子中是可再发行文件)。我形成了一个片段,如下所示(在此处的帮助下):
<Fragment>
<PackageGroup Id="VC13RedistX86">
<ExePackage
Cache="no"
Compressed="yes"
PerMachine="yes"
Permanent="yes"
Vital="yes"
Name="Resources\vcredist_x86.exe"
SourceFile="Resources\vcredist_x86.exe"
InstallCommand="/install /quiet /norestart">
<!-- -->
<ExitCode Value="3010" Behavior="forceReboot"/>
<!-- Ignore "Newer version installed" error -->
<ExitCode Value="1638" Behavior="success"/>
</ExePackage>
</PackageGroup>
</Fragment>
Run Code Online (Sandbox Code Playgroud)
我想知道是否有办法将其纳入我现有的 WiX 产品中?如果没有办法,如何将原始安装程序和<ExePackage>?
经过一番谷歌搜索后,我想出了一个配置,该配置应该允许我仅安装包的较新版本(它确实如此),同时替换旧的、已安装的版本(它没有)
我的wxs文件如下:
<Wix xmlns="http://schemas.microsoft.com/wix/2006/wi">
<Product Id="*"
Name="Gdml File Viewer" Language="1033"
UpgradeCode="5fb07c15-32a5-4b8a-9794-e4425bfc2eea"
...>
<Package InstallerVersion="200"
Compressed="yes"
InstallScope="perMachine" Platform="x64" />
<MajorUpgrade Schedule="afterInstallValidate"
DowngradeErrorMessage="A later version of [ProductName] is already installed"
AllowSameVersionUpgrades="no"
AllowDowngrades="no" />
...
Run Code Online (Sandbox Code Playgroud)
正如预期的那样,它确实允许我安装较新的版本,但旧版本未卸载。它仍然显示在“应用程序和功能”列表中:

(另一个实例的版本为2019.14.181.35181)
我有一个.Net程序,我想在终端服务器上安装.在过去,我已经创建了安装程序项目并生成了一个MSI.但是,终端服务器要求在运行MSI之前将所有用户都关闭,我想避免这种情况.有没有办法在没有MSI的情况下进行安装?
有时对于某些用户帐户,我只需复制.exe并使用它.但是对于其他用户而言,这样做会对显然存在的文件引发奇怪的"文件未找到"错误.(显然,如果没有通过MSI"正式"安装exe,那么运行.net exe必须存在的注册表设置可能存在也可能不存在?)
我们通过NSIS生成的Windows安装程序分发由我的小组创建的软件.我们从不再与我们合作的开发人员编写的python脚本生成我们的NSIS配置文件,因此我们目前没有任何人知道如何编写NSIS配置文件.我的任务是修改此脚本,在安装程序中添加一个部分,在执行实际安装之前显示我们的许可信息.
NSIS配置文件中的这样一个部分是什么样的?
我的电脑msvcp80.dll在不同的目录中有这么多.并且有不同的版本:
8.00.50727.762
8.00.50727.1433
...
Run Code Online (Sandbox Code Playgroud)
我还找到了msvcp80.dll的副本c:\windows\system32.
c:\windows\system32\msvcp80.dll吗?感谢您的回答和评论提前.
我想知道您是否可以共享您认为与学习Windows Installer最相关的一些(可信)信息源(书籍,URL).它们可以用于开始这项技术,也可以用于高级或专业级别的知识.
未来的部署工程师可以从哪里开始,他/她可以在哪里继续保持正确的方向(一步一步)?
当我安装.msi文件时,我在开始菜单和桌面上生成快捷方式,但是当我卸载桌面快捷方式时,会删除但是开始菜单.我的代码是吼叫.请帮我解决我的问题.我花了差不多一天的时间.
<Directory Id="ProgramMenuFolder">
<Directory Id="ProgramMenuSubfolder" Name="Kiosk">
<Component Id="ApplicationShortcuts" Guid="12345678-1234-1234-1234-333333333333">
<Shortcut Id="ApplicationShortcut1" Name="Kiosk" Description="Solusoft Product" Target="[INSTALLDIR]AMP\1.0.0.0\mpkiosk.exe" WorkingDirectory="INSTALLDIR"/>
<RegistryValue Root="HKCU" Key="Software\Kiosk" Name="installed" Type="integer" Value="1" KeyPath="yes"/>
<RemoveFolder Id="ApplicationShortcut1" On="uninstall"/>
</Component>
</Directory>
</Directory>
Run Code Online (Sandbox Code Playgroud) 我在从快捷方式运行的卸载序列中显示对话框时遇到问题,并使用基本UI添加/删除程序.它似乎正在跳过修改和安装期间显示的InstallUISequence:
<!--Displays uninstall options before uninstall progress dialog WixUI_InstallMode = "Remove"-->
<InstallUISequence>
<Show Dialog="UninstallDialog" Before="ProgressDlg">WixUI_InstallMode = "Remove"</Show>
</InstallUISequence>
Run Code Online (Sandbox Code Playgroud)
但是,重要的是我在基本卸载序列期间运行此对话框也很重要.是否可以从InstallExecuteSequence的C#自定义操作运行中显示在WiX中定义的对话框?如果是这样,我该怎么做呢?有没有教程?我想要显示的对话框如下所示:
<!--Dialog used to obtain uninstall options from user-->
<Dialog Id="UninstallDialog" Width="120" Height="100" Title="Options">
<Control Id="DelDatabaseCheckBox" Type="CheckBox"
X="15" Y="10" Width="90" Height="17" Property="DELDATABASE"
CheckBoxValue="1" Text="Delete Database"/>
<Control Id="DelSettingsCheckBox" Type="CheckBox"
X="15" Y="30" Width="90" Height="17" Property="DELSETTINGS"
CheckBoxValue="1" Text="Delete Settings"/>
<Control Id="DelErrorLogCheckBox" Type="CheckBox"
X="15" Y="50" Width="90" Height="17" Property="DELERRORLOG"
CheckBoxValue="1" Text="Delete Error Log"/>
<Control Id="ConfirmUninstall" Type="PushButton" X="22" Y="75" Width="70" Height="17" Text="Ok">
<Publish Event="EndDialog" Value="Return">1</Publish>
</Control>
</Dialog>
Run Code Online (Sandbox Code Playgroud) 我在Stack Overflow搜索了几个问题,但没有任何帮助.问题是:
我在注册表中查找了一些值(我知道该怎么做).我知道如何设置财产.但是我找不到如何在WiX中编写这个表达式的方法.这是我想用伪代码写的:
if(registryvalue contains substring1)
set property to value1
if(registryvalue contains substring2)
set property to value2
Run Code Online (Sandbox Code Playgroud)
必须在运行时评估此条件.有没有办法写这个条件?一些示例代码会是什么样的?