You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.04.13 16:09:27