如何在C#自定义操作中读取MSI安装程序属性
如何在C#自定义操作中读取MSI安装程序属性
嘿,我来帮你搞定这个问题!要把原来WiX XML里的属性判断逻辑移到C#自定义操作里其实很简单,咱们一步步来:
首先,你需要用到Microsoft.Deployment.WindowsInstaller库(也就是大家常说的DTF,Deployment Tools Foundation),这是微软官方推荐用于编写C# MSI自定义操作的工具集。你可以通过NuGet包管理器安装它,包名就是Microsoft.Deployment.WindowsInstaller。
接下来,在你的C#自定义操作类里,通过Session对象就能直接读取MSI的各种属性。比如原来你用到的REMOVE、UPGRADINGPRODUCTCODE,都可以通过Session["属性名"]来获取值,或者用Session.PropertyExists("属性名")来判断某个属性是否存在(像UPGRADINGPRODUCTCODE只有在升级场景下才会被设置)。
下面是对应你需求的示例代码,把原来的条件判断逻辑完全移到C#里:
using Microsoft.Deployment.WindowsInstaller; using System; public class CustomActions { [CustomAction] public static ActionResult UnInstall(Session session) { // 先写个日志方便调试,MSI日志里能看到这条记录 session.Log("=== 开始执行UnInstall自定义操作 ==="); // 获取REMOVE属性的值 string removeValue = session["REMOVE"]; // 判断是否处于升级场景(UPGRADINGPRODUCTCODE存在即表示正在升级) bool isUpgrading = session.PropertyExists("UPGRADINGPRODUCTCODE"); // 对应你原来的条件:(REMOVE="ALL") AND NOT UPGRADINGPRODUCTCODE if (!string.IsNullOrEmpty(removeValue) && string.Equals(removeValue, "ALL", StringComparison.OrdinalIgnoreCase) && !isUpgrading) { session.Log("满足卸载条件,开始执行卸载逻辑"); // 在这里写你原来UnInstall操作要完成的业务代码 // 比如清理文件、删除注册表项之类的 // ... return ActionResult.Success; } else { session.Log("不满足卸载条件,跳过该操作"); return ActionResult.Skip; } } }
然后,你需要修改WiX的XML配置,把原来带条件的自定义操作改成调用这个C#方法就行,不需要在XML里写条件了:
<!-- 先定义你的自定义操作DLL --> <Binary Id="CustomActionsDll" SourceFile="路径\到\你的\CustomActions.dll" /> <!-- 定义自定义操作 --> <CustomAction Id="UnInstall" BinaryKey="CustomActionsDll" DllEntry="UnInstall" Execute="immediate" /> <!-- 在执行序列里添加这个操作,位置还是Before RemoveFiles --> <InstallExecuteSequence> <Custom Action="UnInstall" Before="RemoveFiles" /> </InstallExecuteSequence>
最后提两个小注意点:
- 如果你需要在**延迟执行(deferred)**的自定义操作里读取属性,直接用
Session是不行的,这时候需要在immediate阶段把属性值存入CustomActionData,然后在deferred操作里读取。不过你的场景是Before RemoveFiles,用immediate执行模式就足够了。 - 记得给自定义操作加日志,
session.Log()的内容会出现在MSI的安装日志里,方便你调试排查问题。
备注:内容来源于stack exchange,提问作者Hritik Kaushik
相关产品推荐
相关产品推荐

