2

我在尝试构建 MSM 时遇到了这个问题。显然,模块属性(以及与此相关的所有标识符)在模块生成期间通过在其名称末尾添加模块 GUID 来重命名。例如,属性“MY_PROPERTY”重命名为“MY_PROPERTY.803A3089_928F_46F1_BBAE_CBD39A7D6A72”(假设 803A3089-928F-46F1-BBAE-CBD39A7D6A72 是模块 GUID)。我相信这是用于防止多个模块尝试使用具有相同名称的标识符之间发生冲突的机制。

在 MSM 中,我需要调用一个 DLL 自定义操作,该操作需要使用某个值设置特定属性(我们称之为“THE_PROPERTY”)。问题是 THE_PROPERTY 如上所述被重命名为 THE_PROPERTY.803A3089_928F_46F1_BBAE_CBD39A7D6A72,因此自定义操作永远找不到该属性并失败。

有没有办法解决这个问题?我正在考虑修改自定义操作,以便它尝试(以某种方式)找出调用它的模块的 GUID。一种方法是查看当前操作名称,该名称还应包括 GUID。但是我可以从自定义操作中获取当前操作名称吗?你能想出另一种解决方案吗?

谢谢!

4

1 回答 1

2

实际上,合并模块内的属性是通过在属性名称后使用模块 GUID 来访问的。

一个好的解决方案是让自定义操作访问 THE_PROPERTY.803A3089_928F_46F1_BBAE_CBD39A7D6A72 而不是 THE_PROPERTY。

另一种解决方案是使用类型 51 自定义操作

  • 在 MSI 中创建一个具有格式化自定义操作的属性集(类型 51)
  • 将其配置为将 THE_PROPERTY 设置为:

    [THE_PROPERTY.803A3089_928F_46F1_BBAE_CBD39A7D6A72]

  • 在读取 THE_PROPERTY 的自定义操作之前安排它

这样,合并模块属性将保存到一个 MSI 属性中,该属性具有您的自定义操作使用的名称。

为每个设置创作工具添加了不同的类型 51 自定义操作。如果您需要确切的说明,请提及您正在使用的设置工具。Visual Studio 不支持此功能。

于 2011-11-01T18:48:05.193 回答