我在尝试构建MSM时遇到了这个问题。显然,模块属性(以及与此相关的所有标识符)在模块生成期间通过在其名称末尾添加模块GUID来重命名。例如,属性"MY_PROPERTY"被重命名为"MY_PROPERTY"。(假设803A3089-928F-46F1-BBAE-CBD39A7D6A72为模块GUID)。我相信这是用来防止多个模块试图使用相同名称的标识符之间的冲突的机制。
在MSM中,我需要调用一个DLL自定义操作,该操作需要将特定属性设置为某些值(让我们称之为"THE_PROPERTY")。问题是,如上所述,THE_PROPERTY被重命名为THE_PROPERTY。803A3089_928F_46F1_BBAE_CBD39A7D6A72,因此自定义操作从未找到该属性而失败。
有办法解决这个问题吗?我正在考虑修改自定义操作,以便它试图找出(以某种方式)调用它的模块的GUID。执行此操作的一种方法是查看当前操作名称,该名称还应该包含GUID。但我能从自定义操作中获得当前操作名称吗?你能想到别的解决办法吗?
谢谢!
实际上,通过在属性名后面使用模块GUID来访问合并模块中的属性。
一个好的解决方案是让自定义操作访问THE_PROPERTY。
用THE_PROPERTY代替。 另一个解决方案是使用type 51自定义动作:- 在MSI中创建一个带有格式化自定义操作(类型51)的属性集
设置THE_PROPERTY为:
[THE_PROPERTY.803A3089_928F_46F1_BBAE_CBD39A7D6A72]在读取THE_PROPERTY
的自定义操作之前调度它
这样,合并模块属性被保存到一个MSI属性中,该属性的名称由您的自定义操作使用。
对于每个设置创作工具,Type 51自定义操作的添加方式是不同的。如果您需要确切的说明,请提及您正在使用的安装工具。Visual Studio不支持这个