5

我有一个自定义操作

<CustomAction Id="myActionId" BinaryKey="myAction" DllEntry="MySimpleAction" Execute="immediate" Return="check" />

<InstallExecuteSequence>
      <Custom Action="myActionId" After="InstallInitialize">CHECKBOXCOPYPROP=1</Custom>
</InstallExecuteSequence>

我的自定义操作会备份和解析数据库。我需要在取消安装时进行回滚(删除数据库)。我做了:

<CustomAction Id="myActionId" BinaryKey="myAction" DllEntry="MySimpleAction" Execute="immediate" Return="check" />
<CustomAction Id="myActionRollbackId" BinaryKey="myActionRollback" DllEntry="MySimpleAction" Execute="rollback" Return="check" />

<InstallExecuteSequence>
      <Custom Action="myActionId" After="InstallInitialize">CHECKBOXCOPYPROP=1</Custom>
      <Custom Action="myActionRollbackId" Before="myActionId">CHECKBOXCOPYPROP=1</Custom>
</InstallExecuteSequence>

但我有一个错误。

如果我这样做:

<CustomAction Id="myActionId" BinaryKey="myAction" DllEntry="MySimpleAction" Execute="immediate" Return="check" />
<CustomAction Id="myActionRollbackId" BinaryKey="myActionRollback" DllEntry="MySimpleAction" Execute="immediate" Return="check" />

<InstallExecuteSequence>
      <Custom Action="myActionId" After="InstallInitialize">CHECKBOXCOPYPROP=1</Custom>
      <Custom Action="myActionRollbackId" After="myActionId">CHECKBOXCOPYPROP=1</Custom>
</InstallExecuteSequence>

我的自定义操作 myActionRollbackId 有效。

取消安装时如何运行回滚?有人可以帮助我吗?

4

2 回答 2

2

在安装时运行并对数据库执行某些操作的自定义操作应该被推迟 ( Execute='deferred')。其对应的回滚动作应该是Execute='rollback'。当您安排这些自定义操作时,应该首先执行回滚操作。

此外,请确保条件设置正确。

于 2012-09-24T07:24:52.920 回答
1

安装总是在事务中完成。当您启动安装程序时,它首先会创建一个称为安装脚本的内容,该脚本类似于安装时将执行的操作列表。当我们将一些自定义操作设置为Execute="immediate"时,它会立即执行,但是当我们将我们的操作设置为 Execute="deferred"时,它会添加到安装脚本中,因此回滚变得很容易。现在需要注意的一点是,我们可以在Execute="immediate"模式下访问 session,但是我们不能在 Execute="deferred"模式下访问 session。如果我们尝试访问会话,它将给出错误,在这种情况下,这可能是您错误的原因......

于 2014-08-14T04:45:05.573 回答