如果密钥包含空格

时间:2016-10-18 11:27:34

标签: c# internet-explorer wix registry webbrowser-control

我需要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如何向注册表写入值。

UPD: 在WiX存储库中添加了适当的issue

2 个答案:

答案 0 :(得分:0)

This Blogpost使用了一些前所未见的特殊语法。它声明变量可以这种方式定义,即使它包含像这样的空格字符:

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

!-放在一边,它看起来与你得到的非常相似。但是,您的值包含多个空格。我不确定这是否是您真正想要的价值,或者仅仅是为了清楚地指出空白......

答案 1 :(得分:-1)

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

我使用了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>