如果密钥包含 space,WIX 无法将值写入注册表

WIX cannot write value to registry if key contains space

我需要 enable IE feature WebBrowser 控件。要模拟 IE11,我需要向注册表项写入一个值

HKEY_CURRENT_USER\Software\Microsoft\Internet Explorer\Main\FeatureControl\FEATURE_BROWSER_EMULATION

此操作需要在安装期间完成。 这是我在 WIX 脚本中的代码:

<?define var.IEFeatureEmulationKey = "Software\Microsoft\Internet    Explorer\FeatureControl\FEATURE_BROWSER_EMULATION" ?>
....
<Fragment>            
  <DirectoryRef Id="TARGETDIR">            
    <Component Id="registryValues" Guid="{some-guid}" >
      <RegistryKey Root="HKCU" Key="$(var.IEFeatureEmulationKey)" Action="create">
        <RegistryValue Name="MyApp.EXE" Value="11000" Type="integer" Action="write"/>
      </RegistryKey>
    </Component>
</Fragment>      

此代码仅在 $(var.IEFeatureEmulationKey) 不包含空格时有效。但是我需要为这个特定的键写一个值。

请帮助,即使注册表项包含空格,如何告诉 WiX 将值写入注册表。

更新: 在 WiX 存储库

中添加了适当的 issue

This Blogpost 使用了一些我以前从未见过的特殊语法。它声明变量可以这样定义,即使它包含一个白色的 space 字符,如下所示:

<!–?define var.IEFeatureEmulationKey = "Software\Microsoft\Internet    Explorer\FeatureControl\FEATURE_BROWSER_EMULATION" ?>

!- 撇开不谈,它看起来和你得到的很相似。但是,您的值包含多个白色space。我不确定那是你真正想要的价值还是只是为了清楚地指出白色space...

仍然无法解决问题,但我想展示一个对我有帮助的解决方法。

我使用了 WiX 中允许的自定义操作。首先,我在其中添加了带有以下方法的自定义 .NET 程序集

[CustomAction]
public static ActionResult SetRegistryItems(Session session)
{
    session.Log("Begin SetRegistryItems");

    try
    {
        // this private method actually does manipulation with registry
        SetRegistry();
    }
    catch (Exception e)
    {
        session.Log(e.ToString());
    }

    return ActionResult.Success;
}

那么这个方法应该在WiX配置文件(.wxs)中被引用

<Fragment>    
  ...
  <CustomAction Id='SetRegistryItems' BinaryKey='<NameOfTheAssemblyWithoutExtension>' DllEntry='SetRegistryItems' Execute='immediate'/>
  ...
  <InstallExecuteSequence>
    ...
    <Custom Action="SetRegistryItems" Before="LaunchConditions"/> 
    ...
  </InstallExecuteSequence> 
  ...
</Fragment>