添加值

时间:2017-03-29 10:31:01

标签: wix windows-installer

通过合并模块提供的CustomAction设置属性时是否需要特殊处理?我有两个自定义操作,提供三个属性,稍后将在合并模块中使用。它们由通常的C#代码设置:

session["APPSRVPORT"] = port.ToString();

MSI日志报告该属性已设置为值:

MSI (s) (C0!DC) [11:58:04:615]: PROPERTY CHANGE: Adding APPSRVPORT property. Its value is '11376'.

在安装组件时,以下语句用于安装使用上面填充的MSI属性的注册表值:

<RegistryValue Name="AppSrvPort" Value="[APPSRVPORT]" Type="string" />

但是,日志显示此时该值为空:

MSI (s) (C0:AC) [11:58:06:208]: Executing op: RegAddValue(Name=AppSrvPort,,)

有谁能告诉我如何解决这个问题?我已经检查过,执行顺序是有效的(即在操作之前设置属性&#34; WriteRegistryValues&#34;)

提前致谢!

1 个答案:

答案 0 :(得分:1)

当您在合并模块的.wxs脚本中引用属性时,它将是模块化(即附加了合并模块GUID)。所以<RegistryValue>元素实际上将被解释为:

<RegistryValue Name="AppSrvPort" Value="[APPSRVPORT.YOUR_MERGE_MODULE_ID]" Type="string" />

YOUR_MERGE_MODULE_ID将是-替换为_的合并模块的GUID,e。 G。 1E35CFEB_7FA9_49F2_8E0D_5D941720EE81

要解决此问题,您可以在编写属性时附加合并模块ID 抑制模块化

由于您在合并模块中仅使用属性,因此我建议前者避免意外覆盖具有相同名称的主MSI的任何现有属性。将合并模块ID视为&#34;命名空间&#34;:

session["APPSRVPORT.YOUR_MERGE_MODULE_ID"] = port.ToString();

如果要在主MSI和合并模块之间共享 ,则禁止模块化非常有用:

<Property Id="APPSRVPORT" SuppressModularization="yes"/>

注意:如果您知道自己在做什么,抑制模块化将发出警告CNDL1006和CNDL1086,可以忽略这些警告。 ; - )