Wpf WiX安装程序可以';t打开配置文件

Wpf WiX安装程序可以';t打开配置文件,wpf,wix,windows-installer,Wpf,Wix,Windows Installer,我有一个WPF应用程序,我创建了一个MSI,用WixToolset 3.11和Visual Studio扩展2019安装它。我试图添加XmlFile或XmlConfig项来更改配置文件中的值。我得到以下错误: 无法打开XML文件C:\Program Files(x86)\CO Apps\Main App\OurApp.exe.config。系统错误:-2147024786 文件路径是完整的文件路径,因为我在尝试解决问题时为其提供了完整路径。以下是wxs文件的重要部分 <Wix xmlns=

我有一个WPF应用程序,我创建了一个MSI,用WixToolset 3.11和Visual Studio扩展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>

... DLL的更多文件项
因此,我尝试在安装时将“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在现有元素上没有setValue,我使用delete操作删除该项以用于开发,并插入一个新项。同样的错误。它以我自己或管理员身份登录。有人有WiX和WPF创建MSI的工作示例吗?我不是在找像WixBA这样复杂的东西。我只需要在安装时修改app.exe.config文件

谢谢, Mike

示例:虽然我很少使用此功能,但我这里有一个工作示例(我的XML测试项目):。示例和示例的片段

免责声明:我不确定是否遵循XML更新的最佳实践,因为我更喜欢从应用程序启动代码中进行XML更新—如果可能的话(单一源代码,更易于调试,通常对大多数开发人员来说更熟悉)

app.config/web.config appsettings:关于appsettings(看起来更好)-仅供参考,不一定是建议。将已部署的文件保持为只读有助于提高效率,并且安装程序可以保持您生成的文件不受影响(该文件与安装程序分离-它从不接触它们)。或者就像我写的:HKCU也可以用来写“你实际上必须改变的少数设置”。概念上不太好


云环境设置:我个人认为,在我们这个时代,云环境设置永远不应该是基于文件的,而应该是云环境(保存在远程数据库中)。我不知道这对你的应用有多现实。新的挑战和问题—毫无疑问(网络问题、防火墙、启动问题等),但好处是:版本化设置、恢复和管理(强制执行新设置)。不确定所有的实用性-从未涉及那么多,但希望摆脱设置文件-尤其是对于公司应用程序。然而,有时好的概念不能很好地符合现实——也许它太复杂了?

我不太使用这个功能,但我已经使用了。不确定它是否遵循了所有最佳实践。我更喜欢从应用程序启动代码进行XML更新(如果可能的话)。我想您也可以使用HKCU条目来设置某些设置?而且,在查看您的项目时,我注意到我使用的是[INSTALLDIR],而不是[INSTALLFOLDER]。如果你愿意将此作为答案发布,我很乐意接受。我已经按照你的要求添加了一个快速答案。我想几乎每个人都有你描述的问题——现在我想起来了。谢谢@stein asmul。当我比较你的和我的时,我注意到我使用了错误的文件夹名称,并且没有正确填写XmlFile元素的“Feature”属性。此外,用户属性的MyApp.exe.config文件的格式也有点像主文件。对于搜索此内容的任何人,您可以使用
ElementPath=“//configuration/userSettings/OurApp.Properties.Settings/Settings[\[]@name='AppMode'[\]]/value”value=“Main”