gpt4 book ai didi

xml - WiX RemoveRegistryKey 元素的行为与广告不符

转载 作者:行者123 更新时间:2023-12-04 17:53:39 25 4
gpt4 key购买 nike

卸载时我似乎无法删除注册表项。请注意,这不是 this 的重复问题,因为我不认为我有同样的问题。或者,如果我这样做了,我想澄清一下原因。当我在新的 VM 上安装时会发生这个问题,所以这不像我是在同一个 GUID 上安装的。

我正在做的是将来自用户(来自 UI)的值放入一些属性中,通过 CustomAction 将这些值导入到一些 C# 代码中,然后我对这些值进行加密并将它们放入一个注册表项中。

我不使用 WiX 将值放入注册表项中,而是从 C# 代码中完成的。这样做的原因是我似乎无法将属性导入 C# 自定义操作,然后将相同代码中的值导出回 WiX(我可以单独执行每个操作,没问题)。但这是一个不同的问题......

无论如何,我获取值,加密它们,然后将它们放入注册表项中就好了。卸载时我似乎无法删除注册表项。奇怪的是,它确实删除了键中除一个之外的所有值,但它不会删除整个键。

这是应该删除 key (但不会)的 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;
}

设置的最终值——刚刚作为“假”而不是加密值传入的值——是一个标志,可能是问题的关键。

这是一个奇怪的行为:当我卸载时,键不会被删除,但它会删除所有值,除了一个没有传递到 C# 函数的值,即标志。它不会被删除。但是,即使我创建了一个属性,也要将该属性的值设为“false”,并将其传递到 C# 中,如下所示:
Registry.SetValue("HKEY_LOCAL_MACHINE\\SOFTWARE\\...\\...\\InstallCfg", "SettingsProcessed", session.CustomActionData["SETTINGSPROCESSED"]);

同样的事情发生了:除它之外的所有其他值都被删除。我承认这可能是组件问题,答案可能在 this答案,但我无法弄清楚。

总结一下:创建了注册表项,但 <RemoveRegistryKey>卸载时不会删除它。

编辑::

鲍勃从未得到他的 <RemoveRegistryKey>元素工作。他退出 IT 并搬到奥马哈,在那里经营一家黎巴嫩/荷兰比萨店并练习类卓琴。

不,真的,我从来没有让它起作用。我最终创建了另一个删除 key 的自定义操作。这太令人沮丧了,让我想搬到奥马哈。

最佳答案

你需要设置一个条件不运行CustomAction_PassProperty在卸载过程中。
像这样:

  <InstallExecuteSequence>
<Custom Action="CustomAction_PassProperty"
After="InstallInitialize>NOT REMOVE="ALL"</Custom>
</InstallExecuteSequence>

除了硬编码的值之外,它“删除所有值”可能是您重写 VAL1, VAL2... 的值的结果。在卸载期间,这些属性可能是空的(它们仅在 ui 序列中的安装过程中设置,对吗?)。

关于xml - WiX RemoveRegistryKey 元素的行为与广告不符,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42256748/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com