在安装完成之前通过 MSI 属性

Pass MSI Property before Install Finalize

我的刻录包中有一个这样的变量:

<Variable Name="DemoVariable" Type="string" Value="ChangedProperty" bal:Overridable="yes"/>

然后与 MSIProperty 一起使用:

  <MsiPackage SourceFile="testFile.msi" Id="DemoPackageId_1" Cache="yes" Visible="no">
    <MsiProperty Name="PassedProperty" Value="[DemoVariable]"/>
  </MsiPackage>

在我的 testFile.msi 中,我有一个 属性 和自定义操作:

<Property Id="PassedProperty" Value="Unchanged"/> 

<Binary Id="CustomActionDll"
        SourceFile="CustomAction.CA.dll"/>

<InstallExecuteSequence>
  <Custom Action="ShowMessageBoxCA" Before="CostFinalize"/>
</InstallExecuteSequence>

<CustomAction Id="ShowMessageBoxCA"
              Return="check"
              Execute="firstSequence"
              BinaryKey="CustomActionDll"
              DllEntry="ShowMessageBox"
              HideTarget="no" />

ShowMessageBox 函数实际上只是调用:

MessageBox.Show(session["PassedProperty"])

问题是消息框显示消息"unchanged"。我查看了安装的日志文件,我可以看到在 InstallFinalize 完成后的某个时间 PassedProperty 正在更改。对于我在 CostFinalize 之前发生的自定义操作,这显然为时已晚。

有没有办法让 Burn 在此过程中更早地更改 MSIProperty,而不是让自定义操作稍后发生?

编辑:

好的,我找到了答案,但我还不能 post 所以我会在编辑中留下信息。

基本上 MSI 有 Public 和 Private 属性。在安装阶段发生之前,仅声明 public 属性。 Public 属性必须全部大写,因此为了解决我的问题,我只是将 "Passed_Property" 的所有实例替换为 "PASSED_PROPERTY",它工作正常。

所以我遇到的问题是我将我的属性创建为私有属性,这些属性在安装之后才可用。要使您的属性 public 并因此在整个安装过程中可用,它们必须是大写的。

<Property Id="PASSED_PROPERTY" Value="Unchanged"/> 

https://msdn.microsoft.com/en-us/library/aa370912(v=vs.85).aspx

我制作它们后 public Burn 更改了属性。