由于CustomAction

时间:2017-02-17 22:14:03

标签: wix installer uninstall custom-action

我有一个使用两个CustomActions的MSI。第一个添加一些东西到注册表。它在卸载期间每次之外运行。第二个删除注册表中的一个键,以便在卸载期间仅运行

两个CustomActions都可以正常工作,只是现在MSI不会卸载。

“它不会卸载”我的意思是,在运行卸载时,既不会删除已安装的文件,也不会从程序和功能中删除MSI。卸载过程中唯一的事就是从注册表中删除内容的自定义操作。

请注意,问题发生在一台全新的虚拟机上,因此它不像是有旧版本,其中包含不同的GUID。

此外我认为功能没有问题,因为只有一个功能 - 文本文件安装(这是一个玩具安装 - 直到我做对了,它不会进入真正的安装程序)。

以下是两个自定义操作的<InstallExecutiveSequence>代码。我把东西放到注册表中的那个,每次除了卸载:

      <InstallExecuteSequence>
          <Custom Action="CustomAction_CreateKey"
                  After="InstallInitialize">
          </Custom>
      </InstallExecuteSequence>

以下是我从注册表中删除的相同XML,在卸载过程中只需

      <InstallExecuteSequence>
          <Custom Action="CustomAction_DeleteKey"
                  After="InstallInitialize">
              (NOT UPGRADINGPRODUCTCODE) AND (REMOVE="ALL")
          </Custom>
      </InstallExecuteSequence>

卸载日志没有用(至少对我而言)。就是这样:

  

MSI(BC:6C)[15:27:15:733]:注:1:1725

     

MSI(BC:6C)[15:27:15:733]:注意:1:2205 2:3:错误

     

MSI(BC:6C)[15:27:15:733]:注意:1:2228 2:3:错误4:SELECT   Message FROM Error WHERE Error = 1725

     

MSI(BC:6C)[15:27:15:733]:注意:1:2205 2:3:错误

     

MSI(BC:6C)[15:27:15:733]:注意:1:2228 2:3:错误4:SELECT   Message FROM Error WHERE Error = 1709

     

MSI(BC:6C)[15:27:15:733]:产品:CustomActionDeleteKeySetup -   删除失败。

而且:

  

调用自定义操作DeleteKey!DeleteKey.CustomActions.DeleteTheKey

     

自定义操作抛出异常:

     

System.Reflection.TargetInvocationException:抛出了异常   通过调用的目标。 ---&GT;   Microsoft.Deployment.WindowsInstaller.InstallerException:不能   从非立即自定义操作中访问会话详细信息

     

在   Microsoft.Deployment.WindowsInstaller.Session.ValidateSessionAccess()

     

at Microsoft.Deployment.WindowsInstaller.Session.set_Item(String   property,String value)

     

在DeleteKey.CustomActions.DeleteTheKey(会话会话)
  ---内部异常堆栈跟踪结束---

我不确定在日志文件中要查找什么。

总结一下:自定义操作不会让我卸载。我把头发拉了出来。

修改

我设法让它工作,但我不知道为什么。它与条件有关 条件是这样的:卸载并且只卸载时,我想删除密钥。所以 - 如上所示 - 这是<InstallExecuteSequence>代码:

  <InstallExecuteSequence>
      <Custom Action="CustomAction_DeleteKey"
              After="InstallInitialize">
          (NOT UPGRADINGPRODUCTCODE) AND (REMOVE="ALL")
      </Custom>
  </InstallExecuteSequence>

然后我想在做安装之外的所有事情时创建密钥。之前,我在<InstallExecuteSequence>位中没有任何条件,但是当我将其更改为此时,它似乎有效(即自定义操作有效且卸载):

  <InstallExecuteSequence>
      <Custom Action="CustomAction_CreateKey"
              After="InstallInitialize">
          (NOT installed) OR (CHANGE) OR (REPAIR)
      </Custom>
  </InstallExecuteSequence>

问题是:它为什么有效?是因为早些时候我试图在卸载过程中同时运行两个自定义操作吗?

0 个答案:

没有答案