WiX 安装程序无法打开配置文件
WiX installer can't open config file
我有一个 WPF 应用程序,我创建了一个 MSI 以使用 WixToolset 3.11 和 Visual Studio Extension 2019 安装它。我正在尝试添加 XmlFile 或 XmlConfig 项以更改配置中的值文件。我收到以下错误:
无法打开 XML 文件 C:\Program Files(x86)\CO Apps\Main App\OurApp.exe.config。系统错误:-2147024786
文件路径是完整的文件路径,因为我给了它完整的路径来尝试解决问题。这是wxs文件的重要部分
<Wix xmlns="http://schemas.microsoft.com/wix/2006/wi"
xmlns:wixutil="http://schemas.microsoft.com/wix/UtilExtension">
<Product Id="9E76F000-5525-4BDF-8262-AE46B035D9CE"
Name="Our App"
Language="1033"
Version="2.0.0.0"
Manufacturer="CO Apps"
UpgradeCode="7CFB1B51-F5D5-4AD4-A509-F5C9BC05F875">
<Package Id="*" InstallerVersion="200" Compressed="yes" InstallScope="perMachine" Description="Our production application." />
<Directory Id="ProgramFilesFolder">
<Directory Id="VTAPPSDIR" Name="CO Apps">
<Directory Id="INSTALLFOLDER" Name="Our App">
<Component Id="MainExecutable" Guid="748368D7-7581-4809-A8FE-DFB1093D6A02">
<File Id="MainFile" Name="$(var.OurApp.TargetFileName)" DiskId="1" Source="$(var.OurApp.TargetDir)OurApp.exe" KeyPath="yes"></File>
<File Id="OurApp.exe.config" ReadOnly="no" Source="$(var.OurApp.TargetDir)OurApp.exe.config"></File>
... More File items for DLLs
<wixutil:XmlFile Id="SetAppMode" Action="setValue" File="C:\Program Files (x86)\CO Apps\Our App\OurApp.exe.confg" ElementPath="configuration/userSettings/OurApp.Properties.Settings/setting/AppMode/value" Value="Main" />
</Directory>
</Directory>
</Directory>
所以我试图在安装时将“AppMode”值设置为“Main”。我要设置的不是它似乎无法找到或打开文件的重点。我试过将 XmlFile 放在它自己的组件中。我尝试了多种文件路径变体,包括 [INSTALLDIR] 和 [INSTALLLOCATION] 以及文件名本身。没有那条线,一切都很好。有了那一行,我得到了错误,它回滚了安装。我还尝试了 XmlConfig 而不是 XmlFile:
<wixutil:XmlConfig Id="ClearConfigAppMode" Action="delete" File="[INSTALLLOCATION]OurApp.exe.config" ElementPath="userSettings/OurApp.Properties.Settings" Name="AppMode" />
<wixutil:XmlConfig Id="SetAppMode" Action="create" File="[INSTALLLOCATION]OurApp.exe.config" ElementPath="userSettings/OurApp.Properties.Settings" On="install" Node="element">
<wixutil:XmlConfig Id="SetConfigAppModeName" ElementId="SetAppMode" File="[INSTALLLOCATION]OurApp.exe.config" Name="name" Value="AppMode" />
<wixutil:XmlConfig Id="SetConfigAppModeSerializeAs" ElementId="SetAppMode" File="[INSTALLLOCATION]OurApp.exe.config" Name="serializeAs" Value="String" />
</wixutil:XmlConfig>
<wixutil:XmlConfig Id="SetAppModeValue" Action="create" File="[INSTALLLOCATION]OurApp.exe.config" ElementPath="userSettings/OurApp.Properties.Settings" On="install" Node="element" Sequence="2">
<wixutil:XmlConfig Id="SetAppModeVAlueMain" ElementId="SetAppModeValue" File="[INSTALLLOCATION]OurApp.exe.config" Name="Value" Value="Main" />
</wixutil:XmlConfig>
由于 XmlConfig 在现有元素上没有设置值,我使用删除操作删除了用于开发的项目并插入了一个新元素。同样的错误。它恰好以我自己或管理员身份登录。有没有人有使用 WPF 创建 MSI 的 WiX 工作示例?我不是在寻找像 WixBA 这样复杂的东西。我只需要在安装时修改应用程序。exe.config 文件。
谢谢,
麦克
示例:虽然我很少使用这个功能,但我这里有这个工作示例(我的 XML 测试项目): https://github.com/glytzhkof/WiXUpdateXmlFile. Snippets of the sample here and here.
免责声明:我不确定是否遵循 XML 更新的最佳实践,因为我更喜欢 XML 改为从应用程序启动代码更新 - 如果可能(单一来源、更容易调试并且通常对大多数开发人员来说更熟悉的领域)。
app.config/web.config appsettings: Maybe check out this answer regarding appsettings or this answer (looks better) - just for your review, not necessarily a suggestion. Keeping deployed files read-only helps a lot to overwrite them reliably during updates 并且您生成的文件可以保持不变由安装程序(该文件与安装程序分离 - 它从不接触它们)。或者如我所写:HKCU 也可用于编写“您实际上必须更改的少数设置”。概念上不太好?
Clouded Settings:我个人认为设置永远不应该是基于文件的,而是在我们这个时代是云化的(保存在远程数据库)。 See section 6 and 7 here。我不知道这对您的应用程序有多现实。新的挑战和问题——毫无疑问(网络问题、防火墙、启动问题等),但好处是:版本化设置、恢复和管理(强制执行新设置)。不确定所有的实用性 - 从来没有涉及那么多,但很想摆脱设置文件 - 特别是对于公司应用程序。然而,有时好的概念并不能很好地符合现实——也许是太复杂了?
我有一个 WPF 应用程序,我创建了一个 MSI 以使用 WixToolset 3.11 和 Visual Studio Extension 2019 安装它。我正在尝试添加 XmlFile 或 XmlConfig 项以更改配置中的值文件。我收到以下错误:
无法打开 XML 文件 C:\Program Files(x86)\CO Apps\Main App\OurApp.exe.config。系统错误:-2147024786
文件路径是完整的文件路径,因为我给了它完整的路径来尝试解决问题。这是wxs文件的重要部分
<Wix xmlns="http://schemas.microsoft.com/wix/2006/wi"
xmlns:wixutil="http://schemas.microsoft.com/wix/UtilExtension">
<Product Id="9E76F000-5525-4BDF-8262-AE46B035D9CE"
Name="Our App"
Language="1033"
Version="2.0.0.0"
Manufacturer="CO Apps"
UpgradeCode="7CFB1B51-F5D5-4AD4-A509-F5C9BC05F875">
<Package Id="*" InstallerVersion="200" Compressed="yes" InstallScope="perMachine" Description="Our production application." />
<Directory Id="ProgramFilesFolder">
<Directory Id="VTAPPSDIR" Name="CO Apps">
<Directory Id="INSTALLFOLDER" Name="Our App">
<Component Id="MainExecutable" Guid="748368D7-7581-4809-A8FE-DFB1093D6A02">
<File Id="MainFile" Name="$(var.OurApp.TargetFileName)" DiskId="1" Source="$(var.OurApp.TargetDir)OurApp.exe" KeyPath="yes"></File>
<File Id="OurApp.exe.config" ReadOnly="no" Source="$(var.OurApp.TargetDir)OurApp.exe.config"></File>
... More File items for DLLs
<wixutil:XmlFile Id="SetAppMode" Action="setValue" File="C:\Program Files (x86)\CO Apps\Our App\OurApp.exe.confg" ElementPath="configuration/userSettings/OurApp.Properties.Settings/setting/AppMode/value" Value="Main" />
</Directory>
</Directory>
</Directory>
所以我试图在安装时将“AppMode”值设置为“Main”。我要设置的不是它似乎无法找到或打开文件的重点。我试过将 XmlFile 放在它自己的组件中。我尝试了多种文件路径变体,包括 [INSTALLDIR] 和 [INSTALLLOCATION] 以及文件名本身。没有那条线,一切都很好。有了那一行,我得到了错误,它回滚了安装。我还尝试了 XmlConfig 而不是 XmlFile:
<wixutil:XmlConfig Id="ClearConfigAppMode" Action="delete" File="[INSTALLLOCATION]OurApp.exe.config" ElementPath="userSettings/OurApp.Properties.Settings" Name="AppMode" />
<wixutil:XmlConfig Id="SetAppMode" Action="create" File="[INSTALLLOCATION]OurApp.exe.config" ElementPath="userSettings/OurApp.Properties.Settings" On="install" Node="element">
<wixutil:XmlConfig Id="SetConfigAppModeName" ElementId="SetAppMode" File="[INSTALLLOCATION]OurApp.exe.config" Name="name" Value="AppMode" />
<wixutil:XmlConfig Id="SetConfigAppModeSerializeAs" ElementId="SetAppMode" File="[INSTALLLOCATION]OurApp.exe.config" Name="serializeAs" Value="String" />
</wixutil:XmlConfig>
<wixutil:XmlConfig Id="SetAppModeValue" Action="create" File="[INSTALLLOCATION]OurApp.exe.config" ElementPath="userSettings/OurApp.Properties.Settings" On="install" Node="element" Sequence="2">
<wixutil:XmlConfig Id="SetAppModeVAlueMain" ElementId="SetAppModeValue" File="[INSTALLLOCATION]OurApp.exe.config" Name="Value" Value="Main" />
</wixutil:XmlConfig>
由于 XmlConfig 在现有元素上没有设置值,我使用删除操作删除了用于开发的项目并插入了一个新元素。同样的错误。它恰好以我自己或管理员身份登录。有没有人有使用 WPF 创建 MSI 的 WiX 工作示例?我不是在寻找像 WixBA 这样复杂的东西。我只需要在安装时修改应用程序。exe.config 文件。
谢谢, 麦克
示例:虽然我很少使用这个功能,但我这里有这个工作示例(我的 XML 测试项目): https://github.com/glytzhkof/WiXUpdateXmlFile. Snippets of the sample here and here.
免责声明:我不确定是否遵循 XML 更新的最佳实践,因为我更喜欢 XML 改为从应用程序启动代码更新 - 如果可能(单一来源、更容易调试并且通常对大多数开发人员来说更熟悉的领域)。
app.config/web.config appsettings: Maybe check out this answer regarding appsettings or this answer (looks better) - just for your review, not necessarily a suggestion. Keeping deployed files read-only helps a lot to overwrite them reliably during updates 并且您生成的文件可以保持不变由安装程序(该文件与安装程序分离 - 它从不接触它们)。或者如我所写:HKCU 也可用于编写“您实际上必须更改的少数设置”。概念上不太好?
Clouded Settings:我个人认为设置永远不应该是基于文件的,而是在我们这个时代是云化的(保存在远程数据库)。 See section 6 and 7 here。我不知道这对您的应用程序有多现实。新的挑战和问题——毫无疑问(网络问题、防火墙、启动问题等),但好处是:版本化设置、恢复和管理(强制执行新设置)。不确定所有的实用性 - 从来没有涉及那么多,但很想摆脱设置文件 - 特别是对于公司应用程序。然而,有时好的概念并不能很好地符合现实——也许是太复杂了?