WiX工具集(以前称为Windows Installer XML)是一个工具集,可以从XML源代码构建Windows安装包和WiX引导程序。该工具集支持一个命令行环境,开发人员可以将其集成到他们的构建过程中,以构建MSI和MSM安装程序包以及EXE引导程序。对于基于云的Web开发平台,请使用[wixcode]标记。
我尝试了各种“解决方案”来解决这个问题,但没有成功。现在我的设置是这样的: 我尝试了各种“解决方案”来解决这个问题,但没有成功。现在我的设置是这样的: <Fragment> <CustomAction Id="BatchCmd" ExeCommand="[INSTALLFOLDER]registerDLL.bat" Directory="INSTALLFOLDER" Execute="deferred" Return="asyncWait" /> <InstallExecuteSequence> <Custom Action="BatchCmd" After="InstallFiles">NOT Installed</Custom> </InstallExecuteSequence> </Fragment> registerDLL 文件是在文件中其他位置定义的 WIX 组件的一部分。它已正确复制到 INSTALLFOLDER 目录中。 批处理文件根本不执行。而且我真的不知道如何调试这个。我的意思是天哪,运行一个简单的批处理文件再复杂不过了。 在 WIX 中运行批处理文件的最简单方法是什么? 本身并不完全是一个解决方案,尽管它是解决我的具体问题。 https://stackoverflow.com/a/1165130/5088769
WIX CustomAction - 如何在安装/日志中获取更多信息
有人告诉我,WIX 中的 CustomAction 有一种方法可以在控制台日志中显示输出。我包含一个名为 XmlPreprocess.exe 的 .exe 来操作我的 web.config,基于 ...
如何在 WIX Api 中使用 $in 运算符按订单号过滤订单
我目前正在开发一个项目,我需要使用 $in 运算符根据订单号从 Wix API 检索订单。但是,我遇到了过滤器的问题,我正在接收......
我有一个 WiX 安装程序,需要将文件安装到两个目录。在一个目录中,我们需要安装该文件的 32 位版本,在另一个目录中安装 64 位版本。 然而,这些文件有...
我有大量使用相同文件的 msi 项目。文件引用已在每个项目中明确定义。我创建了一个 wixlib 项目,对文件进行热收集,r...
我正在尝试设置通过 Wix 4 安装应用程序的文件夹的 ACL 权限。我希望所有用户都能够读/写它,即使他们没有管理员访问权限。 以下是我的
我有一个安装程序需要更改 app.config 中的 bindingRedirect 值。目前,我有: 我有一个安装程序需要更改 app.config 中的 bindingRedirect 值。目前,我有: <util:XmlFile Id="Config" Action="setValue" ElementPath="configuration/runtime/assemblyBinding/dependentAssembly/assemblyIdentity[\[]@publicKeyToken='89845dcd8080cc91'[\]]/bindingRedirect/@newVersion" File="[INSTALLFOLDER]\app.config" Value="13.0.0.0"/> 但这会引发错误,因为它找不到节点。我猜这是因为 BindingRedirect 不是 assemblyIdentity 的子元素。 我将如何更新 newVersion 字段? 谢谢 您的元素路径不正确。这不是有效的 XPath 查询(具有特定于 msi 的转义)。您可能需要一个前导的正斜杠。 这就是这个问题的解决方案,如果其他人也遇到这个问题! <util:XmlFile Id="Config" Action="setValue" ElementPath="configuration/runtime/assemblyBinding/dependentAssembly[\[]assemblyIdentity/@publicKeyToken='89845dcd8080cc91'[\]]/bindingRedirect/@newVersion" File="[INSTALLFOLDER]\app.config" Value="13.0.0.0"/> 并且配置文件中的 assemblyBinding xmlns="urn:schemas-microsoft-com:asm.v1" 需要更改为 assemblyBinding @JWoodley13,你是我的英雄,非常感谢你的回答。 为了使其与 WiX v4.0.2 一起使用,我还需要安装全局工具并安装 WixToolset.Util.wixext 扩展,然后才能在 .wixproj 中将其作为 PackageReference 引用。 在命令行上: dotnet tool install --global wix --version 4.0.2 wix extension add -g WixToolset.Util.wixext 在.wixproj中: <ItemGroup> <PackageReference Include="WixToolset.Util.wixext" Version="4.0.2" /> </ItemGroup> 在 .wxs 文件中,导入更新的 wxs 和 wxs/util 命名空间: <Wix xmlns="http://wixtoolset.org/schemas/v4/wxs" xmlns:util="http://wixtoolset.org/schemas/v4/wxs/util"> 我也调整了 xpath 以使用包名称: <Component Id="ChangeConfig" Guid="18C80C2F-D0CC-486D-A80A-23646BBAB8FF"> <util:XmlFile Id="Config" Action="setValue" ElementPath="configuration/runtime/assemblyBinding/dependentAssembly[\[]assemblyIdentity/@name='Newtonsoft.Json'[\]]/bindingRedirect/@newVersion" File="[INSTALLFOLDER]\app.config" Value="13.0.0.0"/> </Component>
如何从yml文件中的nuget恢复任务中过滤.wixproj?
在我的 yml 构建文件中,我有一个 nuget 任务,它可以恢复我的 sln 的所有 nuget 包,但是该 sln 中有一个 wix 项目引发以下错误。 “NU1503:跳过恢复
我正在使用自定义 HTML 和 javascript 开发一个 wix 网站。 虽然我知道块的 id 是 html2,但我无法从其下面的 javascript 更新 insidehtml。它不会更新。 我知道价值是
尝试使用 ProjectReference 将应用程序发布为独立的,以便在 WiX v4 项目中使用
我正在尝试使用 WiX v4 创建安装,它将发布另一个 C# 项目,收获其文件,然后将其打包到安装程序中。我能够让它工作,但问题是......
我尝试使用CMAKE + WIX构建安装包。 WIX 的最新版本是 v4。 不幸的是,CPack 失败了,因为它正在寻找一个工具 Candle.exe,该工具已在 WIX v4 中删除,如 oppo...
如何在 MSI 文件属性中显示产品版本(如 Windows 资源管理器所示)? 我们的安装程序是使用 WiX 创建的。我们所看到的只是显示为修订版本的产品 GUID
WIX 工具集 - 自定义操作命令无法正确检测 Windows 10 版本
我有一个安装程序,可以部署并运行单独的 .exe 文件以将驱动程序部署到系统。不幸的是,微软似乎在 Windows 10 及更高版本中放弃了对 VersionNT 宏的支持......
从 Rust 自定义操作内部读取时,Wix CustomActionData 属性值 10 次中有 2 次为空
在 WIX 代码中,我们声明了延迟的自定义操作,该操作将保护凭证和 辅助自定义操作,为其设置 CustomActionData 值,如下所示: 在 WIX 代码中,我们声明了延迟的自定义操作,该操作将保护凭证和 辅助自定义操作,为其设置 CustomActionData 值,如下所示: <CustomAction Id="SetUserNamePasswordForDefferedAction" Property="HandleAccountInfoCustomAction" Value="[ACCOUNT_USERNAME],[ACCOUNT_PASSWORD],[INSTALLLOCATION],[SERVICEACCOUNT]" HideTarget="no" Return="check" /> <CustomAction Id="HandleAccountInfoCustomAction" DllEntry="handle_account_info" BinaryKey="service_account_dll" Execute="deferred" HideTarget="no" Impersonate="no" Return="check"/> <Binary Id="service_account_dll" SourceFile="service_account.dll" /> <InstallExecuteSequence> <Custom Action="HandleAccountInfoCustomAction" Before="InstallFinalize">NOT Installed</Custom> <Custom Action="SetUserNamePasswordForDefferedAction" Before="HandleAccountInfoCustomAction">NOT Installed</Custom> </InstallExecuteSequence> service_account_dll 在 Rust 中实现,但以 C 格式导出入口点 handle_account_info。读取自定义操作数据的 Rust 代码如下: unsafe fn retrieve_property_from_msi_db( h_install: MSIHANDLE, property_name_str: &str, ) -> StdResult<String, u32> { let property_name = get_ptr_to_cstring(property_name_str); custom_action_log(&format!("Retrieve {property_name_str} from MSI db")); let mut msi_get_property_call_count = 0usize; let mut res; let mut req_status; let mut buff = [0u8; BUFFER_SIZE]; res = 0u32; req_status = 234u32; // ERROR_MORE_DATA while (WIN32_ERROR(req_status) == ERROR_MORE_DATA || res == 0) && msi_get_property_call_count < 5 { res = buff.len() as u32; req_status = MsiGetPropertyA( h_install, PCSTR::from_raw(property_name), PSTR::from_raw(buff.as_mut_ptr()), Some(&mut res as *mut u32), ); if msi_get_property_call_count > 0 && WIN32_ERROR(req_status) == ERROR_MORE_DATA { // Register the occurrence of a known race condition in MSI custom_action_log(format!("WARN: Multiple calls to MsiGetPropertyA ({msi_get_property_call_count}) returned ERROR_MORE_DATA.").as_str()); } if res == 0 { custom_action_log(format!("WARN: MsiGetPropertyA returned 0 bytes for property {property_name_str}.").as_str()); std::thread::sleep(Duration::from_millis(10)); } msi_get_property_call_count += 1; if res as usize > BUFFER_SIZE { custom_action_log(format!("Custom action buffer size is too small: Needed {res}/available {BUFFER_SIZE}.").as_str()); return Err(ERROR_INSTALL_FAILED.0); } } if ERROR_SUCCESS != WIN32_ERROR(req_status) { custom_action_log(format!("Failed to retrieve user name from MSI:WIN_32ERROR {:?}, req_status: {req_status}", WIN32_ERROR(req_status)).as_str()); return Err(ERROR_INSTALL_FAILED.0); } let property = std::str::from_utf8_unchecked(&buff[..res as usize]); Ok(property.to_string()) } 十分之二或三我在自定义操作日志中收到以下内容: 2023-11-14 13:29:47 - Retrieve CustomActionData from MSI db 2023-11-14 13:29:47 - WARN: MsiGetPropertyA returned 0 bytes for property CustomActionData. 2023-11-14 13:29:47 - WARN: MsiGetPropertyA returned 0 bytes for property CustomActionData. 2023-11-14 13:29:47 - WARN: MsiGetPropertyA returned 0 bytes for property CustomActionData. 2023-11-14 13:29:47 - WARN: MsiGetPropertyA returned 0 bytes for property CustomActionData. 2023-11-14 13:29:47 - WARN: MsiGetPropertyA returned 0 bytes for property CustomActionData. 2023-11-14 13:29:47 - service_account CustomActionData data retrieved from MSI db. 2023-11-14 13:29:47 - TROUBLESHOOTING: CustomActionData: 2023-11-14 13:29:47 - CustomActionData property is not in the expected format 成功运行会产生以下日志: 2023-11-14 13:28:48 - Retrieve CustomActionData from MSI db 2023-11-14 13:28:48 - service_account CustomActionData data retrieved from MSI db. 2023-11-14 13:28:48 - TROUBLESHOOTING: CustomActionData: ,,C:\MyApp,NT Authority\Local Service 请帮忙:-) 我通过改变策略解决了自己的问题。长话短说,自定义操作现在是一个独立的可执行文件,其中参数通过命令行传递,而不是在 DLL 中实现并由 wix 安装程序应用程序加载的自定义操作。 Wix 支持在不记录命令行参数的情况下执行此操作,因此不会记录密码。基本上,我遵循了这篇文档文章,特别是WixSilentExec风格。 我对为什么从 Wix 直接访问 dll 变得不稳定的理解是,通过 MSI 数据库中的 CustomActionData 属性传递参数值的机制很容易出现竞争条件。
安装完成后,我需要以提升用户(管理员)身份启动 GUI 应用程序,并且我还想检查应用程序的退出代码。 我知道在 CustomAction 上你可以设置 Imperson...
我已经使用 WiX Burn 创建了一个安装程序包,但遇到了一个问题,即安装程序在安装过程中不显示任何类型的任务栏图标。这使得它如此点击......
我正在使用 WiX 为 32 位和 64 位系统构建 MSI 安装程序。该软件包有一些先决条件,需要在安装之前检查,以便用户更容易知道发生了什么
我们有 JavaFx 项目,我们想为 Windows 中的应用程序创建一个安装程序。因此,我们使用 JDK 17 - JPackage 和 WIX 3.x 来创建安装程序。但我们注意到许可证...
应如何修改下面的 wxs 代码以使 WiX 3.11 仅运行自定义操作? (无需任何安装) ` 应如何修改下面的 wxs 代码以使 WiX 3.11 仅运行自定义操作? (无需任何安装) `<?xml version="1.0" encoding="UTF-8"?> <Wix xmlns="http://schemas.microsoft.com/wix/2006/wi"> <Product Id="*" Name="RunNotepad" Language="1033" Version="1.0.0.0" Manufacturer="YourManufacturer" UpgradeCode="{E7A6D8C2-9F05-4A0F-B7C2-91A3B9D35F25}"> <Package InstallerVersion="200" Compressed="yes"/> <Media Id="1" Cabinet="media1.cab" EmbedCab="yes"/> <Directory Id="TARGETDIR" Name="SourceDir"> <Directory Id="ProgramFilesFolder"> <Directory Id="INSTALLFOLDER" Name="RunNotepad"/> </Directory> </Directory> <Feature Id="ProductFeature" Title="RunNotepad" Level="1"> <ComponentGroupRef Id="ProductComponents"/> </Feature> </Product> <Fragment> <DirectoryRef Id="INSTALLFOLDER"/> </Fragment> <Fragment> <ComponentGroup Id="ProductComponents" Directory="INSTALLFOLDER"> <Component Id="RunNotepadComponent" Guid="{E7A6D8C2-9F05-4A0F-B7C2-91A3B9D35F25}"> <File Source="tinytask.exe"/> </Component> </ComponentGroup> <InstallExecuteSequence> <Custom Action="RunNotepad" Before="InstallFinalize">NOT Installed</Custom> </InstallExecuteSequence> </Fragment> <Fragment> <CustomAction Id="RunNotepad" Directory="INSTALLFOLDER" ExeCommand="[SourceDir]PL\PL.exe" Execute="deferred" Impersonate="no" Return="asyncNoWait"/> </Fragment> </Wix>` 因为这是 .msi 的非标准使用,谷歌搜索没有给我任何帮助( 我已经成功地通过从 [CURRENTDIRECTORY] 运行的 VBScript 实现了该功能。这是在任何安装开始之前可用的属性值
我有 WiX 4.0.3 版本,我找不到将它们添加到 WiX 4.0.3 的 PATH 的二进制文件。我在哪里可以找到它们? 有人能帮我吗? 控制台返回: ` 运行蜡烛.exe [11:39:19.574]jdk。