在安装完成之前通过 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 更改了属性。
我的刻录包中有一个这样的变量:
<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 更改了属性。