通过合并模块提供的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;)
提前致谢!
答案 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,可以忽略这些警告。 ; - )