WiX注册表值设置为null(值=“0”)

WiX注册表值设置为null(值=“0”),wix,Wix,我已经在一个WiX项目上工作了一段时间,使用安装程序初始化的注册表值被证明是“有趣的”。我在这里找一份精神检查 我的WiX脚本中有以下行创建注册表值: <RegistryValue Type="multiString" Name="polling_manifest" Value="" /> 在我看来,它就像一个字符串[2],其中包含两个空字符串。实际上,如果您使用以下内容打开此注册表值: public static string[] pollingManifestValue

我已经在一个WiX项目上工作了一段时间,使用安装程序初始化的注册表值被证明是“有趣的”。我在这里找一份精神检查

我的WiX脚本中有以下行创建注册表值:

<RegistryValue Type="multiString" Name="polling_manifest" Value="" />
在我看来,它就像一个字符串[2],其中包含两个空字符串。实际上,如果您使用以下内容打开此注册表值:

    public static string[] pollingManifestValue
    {
        get
        {
            return (string[])RegistryKey.OpenBaseKey(RegistryHive.LocalMachine, RegistryView.Registry64)
                .OpenSubKey(AppSettingsGet("RegPathKeyConary"))
                .GetValue(AppSettingsGet("rTISRegKeyPollingManifest"));
        }

        set
        {
            RegistryKey.OpenBaseKey(RegistryHive.LocalMachine, RegistryView.Registry64)
                .OpenSubKey(AppSettingsGet("RegPathKeyConary"), true)
                .SetValue(AppSettingsGet("rTISRegKeyPollingManifest"), value);
        }
    }
pollingManifestValue返回为null。因此,访问此构造的所有代码都必须具有“先检查null,然后访问属性”类型的代码


我知道这些检查是正确的,我不想在这里成为一个更懒惰的程序员。我正在寻找那些比我更有经验的WiX deep magic的人的想法和建议,因为我觉得我并没有做到最好。非常欢迎您提供任何代码审查/使用指南,我提前向您表示感谢。

使用此代码创建注册表项


要读取注册表,您可以使用如下所示的直接代码

string processor=System.Environment.GetEnvironmentVariable(“processor_架构”);
processor=processor.Substring(processor.Length-2,2);
如果(处理器=“86”)
{
regkey=Registry.LocalMachine.OpenSubKey(“软件\\ABC公司”);
}
其他的
{
regkey=Registry.LocalMachine.OpenSubKey(“软件\\Wow6432Node\\ABC公司”);
}
然后获取值

Registry.GetValue(regkey + "\\Services", "ServiceName", "0")

如果返回“0”,则该值不存在,否则它将为您提供服务名称。

在内部,
REG\u MULTI\u SZ
Type=“multiString”
)值由一系列以空字符串结尾的空字符串表示

虽然明确指出不可能在序列中包含零长度字符串,但像WiX这样的工具允许将空字符串写入注册表。注册表编辑器在某些地方正确显示这些值时,将在保存前删除空字符串

那么你的例子呢

<RegistryValue Type="multiString" Name="polling_manifest" Value="" />

为了使其意图更加明确,也可以写如下

<RegistryValue Type="multiString" Name="polling_manifest">
  <MultiStringValue></MultiStringValue>
</RegistryValue>

将以空字符串的形式写入注册表,后跟\0字符,后跟以\0字符结尾的序列。每个字符由两个字节表示,整个序列导出为
“polling_manifest”=hex(7):00,00,00,00

在测试时,我发现.NET(至少在版本4中)不使用c风格的字符串处理来读取
REG\u MULTI_SZ
值,并且可以清楚地处理空字符串。使用像您这样的代码显然返回了一个包含一个空字符串元素的字符串数组


我注意到您在代码中使用的是64位注册表视图,但是不清楚您的值是否会写入此注册表视图。此外,从配置中读取密钥路径和值名称;您确定它们是正确的吗?

请注意,根据建议,不建议直接使用
Wow6432Node
键。OP使用
RegistryKey.OpenBaseKey()
指定适当的值来访问备用视图的方法是非常好的。嗨,Thomas,Re:registry视图。是的,该应用程序是一个32位应用程序,在32位和64位系统上维护注册表的一部分,这两个系统也可由非Windows平台解决方案访问,因此,为了将内容保存在一个位置,无论Windows操作系统架构如何,我们使用了一个视图(HKLM\Software\Company\…)…输入键…抱歉。密钥路径和值名称很好,因为更新发生得很好。在我的代码中,我没有得到包含一个空字符串的字符串数组。我得到一个空字符串[]。对该对象的任何引用都会导致NullReferenceException。
<RegistryValue Type="multiString" Name="polling_manifest">
  <MultiStringValue></MultiStringValue>
</RegistryValue>