在msi升级期间更新配置时无法打开XML文件错误

时间:2017-09-28 07:13:35

标签: xml wix web-config windows-installer

所以我有一个wix安装程序在全新安装时运行良好但是当我从以前的版本升级到我正在更改配置值的新版本时,我收到以下错误并且安装程序回滚:

ExecXmlFile: Configuring Xml File: ExecXmlFile: Error 0x8007006e: failed to load XML file: Error 25531. Failed to open XML file , system error: -2147024786 MSI (s) (2C:5C) [14:45:21:281]: Product: MyProduct -- Error 25531. Failed to open XML file , system error: -2147024786 CustomAction ExecXmlFile returned actual error code 1603 (note this may not be 100% accurate if translation happened inside sandbox) Action ended 14:45:21: InstallExecute. Return value 3.

这是我的xml文件,我想从4.5更改为4.6.2

<?xml version="1.0" encoding="utf-8"?>
<configuration>
  <appSettings>  
  </appSettings>
<startup><supportedRuntime version="v4.0" sku=".NETFramework,Version=v4.5" /></startup>
  <runtime>
    ...
  </runtime>
</configuration>

这是我相应的wix变化

  <!--XML config file upgrade change-->
    <Component Id="ServiceConfigUpgrades" Guid="{guid3}">
                      <Condition><![CDATA[(INSTALLDIR <> "") AND NOT REMOVE]]></Condition>
                      <CreateFolder />
                      <util:XmlFile Id="UpdateServiceVersion"
                        File="[#fil2]"
                        Action="setValue"
                        Name="sku"
                        Value=".NETFramework,Version=v4.6.2"                  
                        ElementPath="configuration/startup/supportedRuntime" />
    </Component>

这可能与我的元素路径有关吗?请注意,<startup><suuportedRuntime>位于同一行。不确定这是否重要,但任何帮助都会很棒。

发现这个观察结果,也许我错了,但如果xml路径是这样的,ElementPath,你可以告诉我下面sku的{​​{1}}会改变它的值吗?和startup标签在一行中:

supportedRuntime

3 个答案:

答案 0 :(得分:1)

我还没有使用过这种方法,但有三件事对我来说很突出:

  1. 错误0x8007006e(也是-2147024786)似乎归结为错误110:

      

    系统无法打开指定的设备或文件

  2. 您引用的第一行是

      

    ExecXmlFile:配置Xml文件:

    但不会在冒号后列出文件名。第二行是类似的。

  3. 第三行和第四行在文件和逗号之间有一个空格。

      

    无法打开XML文件,系统错误:-2147024786

    这四种情况看起来都应该告诉我们它试图打开的文件的名称。其中一个或两个是拼写错误或误解是合理的,但三个都告诉我它没有得到你的文件名。

  4. 所以,假设情况如此,那有什么不对?您已将其配置为引用文件密钥(File="[#fil2]"),这似乎应该有效....如果您的文件密钥实际上是fil2,其余部分已遵循对Formatted (Windows)的限制。首先验证文件密钥,其组件的安装状态以及与成本核算相关的操作顺序。

      

    如果找到[# filekey ]形式的子字符串,则将其替换为文件的完整路径,并将值 filekey 用作键入File table。 [# filekey ]的值保持空白,在安装程序运行CostInitialize actionFileCost actionCostFinalize action之前,路径不会替换为路径。 [# filekey ]的值取决于文件所属组件的安装状态。如果组件是从源运行的,则该值是文件源位置的路径。如果组件在本地运行,则该值是安装后文件的目标位置的路径。如果组件的操作状态为不存在,则组件的已安装状态用于确定[# filekey ]值。如果组件的已安装状态也不存在或为null,则[# filekey ]将解析为空字符串,否则将根据组件的已安装状态解析为该值。有关检查组件安装状态的更多信息,请参阅Checking the Installation of Features, Components, Files

    如果这没有帮助,this WiX tutorial中的示例会在文件中使用格式化字符串,但会使用[INSTALLDIR]settings.xml等引用路径。也许您应该尝试[INSTALLDIR]config.xml或类似。

    (或者,至少,输入一些硬编码的文件值,看看日志行是否证实了我的怀疑。)

答案 1 :(得分:0)

我遇到了同样的问题,并通过这种方式解决

</Component>
      <Component Id="ChangeConfig" Guid="b11556a2-e066-4393-af5c-9c9210187eb3">
        <File Id='Config' DiskId='1' Name="app.config" Vital="yes" KeyPath="yes" Source='$(sys.CURRENTDIR)\app.config'/>
      <util:XmlFile Id="AppConfigSetConnStr" Action="setValue" Permanent="yes" File="[INSTALLLOCATION]app.config"            
                    ElementPath="configuration/startup/installationPath" Name="path" 
                    Value="[INSTALLLOCATION]" />
      </Component>

希望它会对您有所帮助。

答案 2 :(得分:0)

因为我错误地引用了 .wxs 文件中的 File Id,所以我遇到了同样的错误。区分大小写在这里很重要!

失败了:

<File Id="WEBSERVICE.XML" Name="WebService.xml" Source="WebService.xml" />
<util:XmlFile Id="UpdateAppDir" File="[#WebService.xml]" ... />

那行得通:

<File Id="WEBSERVICE.XML" Name="WebService.xml" Source="WebService.xml" />
<util:XmlFile Id="UpdateAppDir" File="[#WEBSERVICE.XML]" ... />