【问题标题】:Empty MSI property after adding value增值后清空 MSI 属性
【发布时间】:2017-03-30 03:08:19
【问题描述】:

通过合并模块提供的 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,,)

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

提前致谢!

【问题讨论】:

  • 您能否确认自定义操作是即时的,并且实际上是在 WriteRegistryValues 之前安排的(根据表中的序列号,而不仅仅是日志中的位置)? (在合并模块中设置一个缺少 guid 后缀的非内置属性也有点奇怪,但这不是这里的问题。)

标签: wix windows-installer


【解决方案1】:

当您在合并模块的 .wxs 脚本中引用属性时,它将被模块化(即附加合并模块 GUID)。所以&lt;RegistryValue&gt; 元素实际上会这样解释:

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

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

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

由于您仅在合并模块中使用该属性,我建议前者避免意外覆盖主 MSI 的任何现有同名属性。将合并模块 ID 视为“命名空间”:

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

如果某个属性打算在主 MSI 和合并模块之间共享,则抑制模块化会很有用:

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

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

【讨论】:

  • 但这是否也适用于合并模块的属性引用?该属性由在同一合并模块中定义的组件再次使用,并且在合并模块和 MSI 本身之间不共享。
  • @Marc 对不起,我看错了你的问题,但我写的仍然适用。 &lt;RegistryValue&gt; 元素将尝试读取附加了合并模块 ID 的属性,除非您禁止模块化。您可以通过使用某些工具(例如InstEd)打开 .MSM 文件并查看Registry 表来验证这一点。
猜你喜欢
  • 2021-10-07
  • 1970-01-01
  • 1970-01-01
  • 2011-03-13
  • 2013-05-08
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多