如果密钥包含 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>
我需要 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 存储库
中添加了适当的 issueThis 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>