卸载时我似乎无法删除注册表项。请注意,这不是重复this https://stackoverflow.com/questions/3317281/wix-doesnt-remove-registrykey-on-uninstall问题,因为我不认为我有同样的问题。或者,如果我这样做,我想澄清一下原因。当我在新的虚拟机上安装时会发生此问题,因此这不像我是在同一 GUID 上安装的。
我正在做的是将用户的值(从 UI)放入某些属性中,然后通过自定义动作,然后我对这些值进行加密并将它们放入注册表项中。
我不使用 WiX 将值放入注册表项,而是通过 C# 代码进行操作。原因是我似乎无法将属性导入到 C# 自定义操作中,然后将同一代码中的值导出回 WiX(我可以单独执行每个操作,没有问题)。但这是另一个问题...
无论如何,我获取这些值,对它们进行加密,然后将它们放入注册表项中就可以了。我只是卸载时似乎无法删除注册表项。奇怪的是,它does删除键中除一个值之外的所有值,但不会删除整个键。
下面是应该删除该键(但没有)的 XML:
<Component Id="Component_CleanRegistryOnUninstall"
Directory="TARGETDIR"
Guid="{86D04E28-2EF8-4A6C-BB9B-577EA1597BB5}"
KeyPath="yes">
<RemoveRegistryKey Id="CleanupRegistry"
Root="HKLM"
Key="Software\...\...\InstallCfg"
Action="removeOnUninstall"/>
</Component>
以下是创建 C# 自定义操作的 XML:
<Fragment>
<Property Id="VAL1" Hidden="yes"/>
<Property Id="VAL2" Hidden="yes"/>
<Property Id="VAL3" Hidden="yes"/>
<Property Id="VAL4" Hidden="yes"/>
<SetProperty Id="CustomAction_PassProperty"
Value="VAL1=[VAL1];VAL2=[VAL2];VAL3=[VAL3];VAL4=[VAL4]"
Sequence="execute"
Before="CustomAction_PassProperty"/>
<Binary Id="Binary_PassProps"
SourceFile="$(var.CreateRegistryKey.TargetDir)CreateRegistryKey.CA.dll"/>
<!-- Note that 'Impersonate="no"' elevates the privilege of the C# code, needed to create keys -->
<CustomAction Id="CustomAction_PassProperty"
BinaryKey="Binary_PassProps"
DllEntry="CreateKeys"
Execute="deferred"
Impersonate="no"
Return="check"
HideTarget="yes"/>
<InstallExecuteSequence>
<Custom Action="CustomAction_PassProperty"
After="InstallInitialize"/>
</InstallExecuteSequence>
</Fragment>
这是 C# 本身:
[CustomAction]
public static ActionResult CreateKeys(Session session)
{
// encrypt and set set the registry keys
Registry.SetValue("HKEY_LOCAL_MACHINE\\SOFTWARE\\...\\...\\InstallCfg", "Val1", Encrypt(session.CustomActionData["VAL1"]));
Registry.SetValue("HKEY_LOCAL_MACHINE\\SOFTWARE\\...\\...\\InstallCfg", "Val2", Encrypt(session.CustomActionData["VAL2"]));
Registry.SetValue("HKEY_LOCAL_MACHINE\\SOFTWARE\\...\\...\\InstallCfg", "Val3", Encrypt(session.CustomActionData["VAL3"]));
Registry.SetValue("HKEY_LOCAL_MACHINE\\SOFTWARE\\...\\...\\InstallCfg", "Val4", Encrypt(session.CustomActionData["VAL4"]));
// also, set the "SettingsProcessed" key to false
Registry.SetValue("HKEY_LOCAL_MACHINE\\SOFTWARE\\...\\...\\InstallCfg", "SettingsProcessed", "false");
return ActionResult.Success;
}
设置的最终值(刚刚作为“false”而不是加密值传入的值)是一个标志,并且可能是问题的关键。
这是奇怪的行为:当我卸载时,密钥不会被删除,但它does删除所有值except未传递到 C# 函数中的一个值,即标志。它不会被删除。但是,即使我创建了一个属性,也将该属性赋予值“false”,并将其传递到 C# 中,如下所示:
Registry.SetValue("HKEY_LOCAL_MACHINE\\SOFTWARE\\...\\...\\InstallCfg", "SettingsProcessed", session.CustomActionData["SETTINGSPROCESSED"]);
同样的事情也会发生:除了它之外的所有其他值都被删除。我承认这可能是一个组件问题,答案可能在于this https://stackoverflow.com/questions/3317281/wix-doesnt-remove-registrykey-on-uninstall答案,但我无法弄清楚。
总结一下:注册表项已创建,但<RemoveRegistryKey>
卸载时不会删除它。
EDIT::
鲍勃从未得到过他的<RemoveRegistryKey>
元素来工作。他辞去了 IT 工作,搬到了奥马哈,在那里经营一家黎巴嫩/荷兰披萨店并练习班卓琴。
不,真的,我从来没有让它发挥作用。我最终创建了another删除密钥的自定义操作。这太令人沮丧了,让我想搬到奥马哈。