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

时间:2017-02-15 17:55:16

标签: xml wix registry uninstall registrykey

我卸载时似乎无法删除注册表项。请注意,这不是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并搬到奥马哈,在那里他经营一家黎巴嫩/荷兰披萨店并练习班卓琴。

不,真的,我从来没有工作过。我最终创建了另一个删除密钥的自定义操作。令人沮丧的是,我想搬到奥马哈。

1 个答案:

答案 0 :(得分:1)

您需要设置一个条件,以便在卸载期间不运行CustomAction_PassProperty。 像这样:

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

它&#34;删除所有值&#34;除了硬编码之外,可能是因为你在卸载过程中重写了VAL1, VAL2...的值,那时这些属性可能是空的(它们只在ui序列中安装时才设置?)。