C# 如果项包含空间,WIX无法将值写入注册表

C# 如果项包含空间,WIX无法将值写入注册表,c#,internet-explorer,wix,registry,webbrowser-control,C#,Internet Explorer,Wix,Registry,Webbrowser Control,我需要为WebBrowser控制做准备。为了模拟IE11,我需要向注册表项写入一个值 HKEY_CURRENT_USER\Software\Microsoft\Internet Explorer\Main\FeatureControl\FEATURE_BROWSER_EMULATION 此操作需要在安装过程中完成。 以下是我在WIX脚本中的代码: <?define var.IEFeatureEmulationKey = "Software\Microsoft\Internet Ex

我需要为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存储库中添加了一些我以前也没有见过的特殊语法。它声明变量可以这样定义,即使它包含如下空白字符:

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


-抛开它不谈,它看起来与您得到的非常相似。但是,您的值包含多个空格。我不确定这是否是您真正想要的值,或者只是为了清楚地指出空白…

使用了一些我以前也没有见过的特殊语法。它声明变量可以这样定义,即使它包含如下空白字符:

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


-抛开它不谈,它看起来与您得到的非常相似。但是,您的值包含多个空格。我不确定这是否是您真正想要的值,或者只是为了清楚地指出空白…

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

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


...
...
...
...
...

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

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


...
...
...
...
...

您是否尝试过使用
 这是我在转义空间后在注册表中获得的即时消息-好的,划掉它;)你找到解决办法了吗@Valentine我刚刚使用了在C#上编写的自定义程序集,对注册表名和值没有这样的限制。您是否尝试过使用
 这是我在转义空间后在注册表中获得的即时消息-好的,划掉它;)你找到解决办法了吗@Valentine我刚刚使用了在C#上编写的自定义程序集,对于注册表名和值没有这样的限制。不确定它是否有用。首先-此语法使VisualStudio在开始标记下面加红线。第二,这看起来不像变量的更改值。当您试图访问名称中带有空格的目录时,WiX的行为类似于cmd shell。为了克服cmd中的这个问题,通常使用引号(例如“dir name”)。WiX脚本中有类似的语法吗?“但是,您的值包含多个空格”这是因为SO编辑器中的格式设置,在代码中只有一个空格我知道您可以通过cmd params传递这些预处理器变量,这也可以在VS(项目设置)中永久设置。也许这是一个解决办法。。。我还读到一些人对这种问题有疑问,并将整个cmd参数用引号括起来……不确定它是否有用。首先-此语法使VisualStudio在开始标记下面加红线。第二,这看起来不像变量的更改值。当您试图访问名称中带有空格的目录时,WiX的行为类似于cmd shell。为了克服cmd中的这个问题,通常使用引号(例如“dir name”)。WiX脚本中有类似的语法吗?“但是,您的值包含多个空格”这是因为SO编辑器中的格式设置,在代码中只有一个空格我知道您可以通过cmd params传递这些预处理器变量,这也可以在VS(项目设置)中永久设置。也许这是一个解决办法。。。我还读到一些人对这种问题有疑问,并将整个cmd参数用引号括起来。。。。