我卸载时似乎无法删除注册表项。请注意,这不是this问题的重复,因为我不认为我有同样的问题。或者,如果我这样做,我想澄清为什么。当我在一个新的VM上安装时会发生这个问题,所以它不像我在同一个GUID上安装。
我正在做的是将用户的值(从用户界面)放入一些属性中,通过 CustomAction 将这些值导入某些C#代码,然后我将这些值加密并将它们放入注册表项。
我不使用WiX将值放入注册表项,我是从C#代码中执行的。原因是我似乎无法将属性导入到C#Custom Action中,然后将相同代码中的值导回到WiX中(我可以单独执行每个操作都没有问题)。但这是一个不同的问题......
无论如何,我获取值,加密它们,并将它们放入注册表项中就好了。我卸载时似乎无法删除注册表项。奇怪的是, 删除键中的每个值,除了一个,但它不会删除整个键。
这是应删除密钥的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”而不是加密值 - 是一个标志,可能是问题的关键。
这是一个奇怪的行为:当我卸载时,密钥不会被删除,但它 删除所有值,除了一个值不是传入C#函数,标志。它没有被删除。但是,即使我创建了一个属性,也要给该属性赋值“false”,并将其传递给C#,如下所示:
Registry.SetValue("HKEY_LOCAL_MACHINE\\SOFTWARE\\...\\...\\InstallCfg", "SettingsProcessed", session.CustomActionData["SETTINGSPROCESSED"]);
同样的事情发生了:除了它之外,其他所有值都被删除了。我承认这可能是一个组件问题,答案可能在this回答,但我无法弄明白。
总结:注册表项已创建,但<RemoveRegistryKey>
在卸载时不会将其删除。
EDIT ::
鲍勃从未让他的<RemoveRegistryKey>
元素发挥作用。他退出IT并搬到奥马哈,在那里他经营一家黎巴嫩/荷兰披萨店并练习班卓琴。
不,真的,我从来没有工作过。我最终创建了另一个删除密钥的自定义操作。令人沮丧的是,我想搬到奥马哈。
答案 0 :(得分:1)
您需要设置一个条件,以便在卸载期间不运行CustomAction_PassProperty
。
像这样:
<InstallExecuteSequence>
<Custom Action="CustomAction_PassProperty"
After="InstallInitialize>NOT REMOVE="ALL"</Custom>
</InstallExecuteSequence>
它&#34;删除所有值&#34;除了硬编码之外,可能是因为你在卸载过程中重写了VAL1, VAL2...
的值,那时这些属性可能是空的(它们只在ui序列中安装时才设置?)。