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

WixSharp v1.9.2添加ManagedAction时触发“路径含无效字符”错误

WixSharp v1.9.2添加ManagedAction触发“Invalid characters in the path”错误的原因与解决办法

问题场景

使用WixSharp v1.9.2创建MSI安装包,向Project对象添加内联委托形式的ManagedAction后,执行project.BuildMsi()时抛出“Invalid characters in the path”错误。

相关代码

var project = new Project(
    ProjectName,
    ...,
    new ManagedAction(
        session => {
            return ActionResult.Success;
        },
        Return.check,
        When.After,
        Step.InstallFinalize,
        Condition.NOT_Installed
    ),
    ...
);

异常信息

Invalid characters in the path.
   in System.IO.Path.CheckInvalidPathChars(String path, Boolean checkAdditional)
   in System.IO.Path.IsPathRooted(String path)
   in WixSharp.WixEntity.IncrementalIdFor(WixEntity entity)
   in WixSharp.WixEntity.get_Id()
   in WixSharp.Compiler.ProcessCustomActions(Project wProject, XElement product)
   in WixSharp.Compiler.GenerateWixProj(Project project)
   in WixSharp.Compiler.BuildWxs(Project project, String path, OutputType type)
   in WixSharp.Compiler.BuildWxs(Project project, OutputType type)
   in WixSharp.Compiler.Build(Project project, String path, OutputType type)
   in WixSharp.Compiler.Build(Project project, OutputType type)
   in EndosightSetup.Program.CreateMsiFile() in D:\Projects\Lavoro\EndosightConsole\src\deploy\EndosightSetup\Program.cs:riga 180
   in EndosightSetup.Program.<>c.<Main>b__27_2() in D:\Projects\Lavoro\EndosightConsole\src\deploy\EndosightSetup\Program.cs:riga 53
   in EndosightSetup.Program.<Main>g__ConsoleLog|27_3(Int32 value, Action doAction) in D:\Projects\Lavoro\EndosightConsole\src\deploy\EndosightSetup\Program.cs:riga 60

原因分析

从异常栈可以看出,错误发生在WixSharp内部生成Wix实体Id的过程中:

  • 当使用内联Lambda委托创建ManagedAction时,WixSharp会尝试自动生成Id,默认逻辑是将委托的ToString()结果作为Id的基础
  • Lambda委托的ToString()输出包含=>、{等特殊字符,这些字符既不符合Wix组件Id的合法规则,又会被后续代码误当作路径处理,触发System.IO.Path.CheckInvalidPathChars检查,最终抛出错误

解决办法

方法1:手动指定ManagedAction的Id属性

创建ManagedAction时显式设置合法的Id值,避免自动生成含非法字符的Id:

var project = new Project(
    ProjectName,
    ...,
    new ManagedAction(
        session => {
            return ActionResult.Success;
        },
        Return.check,
        When.After,
        Step.InstallFinalize,
        Condition.NOT_Installed
    ) { Id = "PostInstallAction" }, // 手动指定合法Id
    ...
);

方法2:将Lambda委托提取为独立方法

把内联逻辑放到单独的静态方法中,WixSharp会自动使用方法名生成合法的Id,同时代码结构更清晰:

// 提取为独立方法
private static ActionResult PostInstallAction(Session session)
{
    return ActionResult.Success;
}

// 创建Project时引用该方法
var project = new Project(
    ProjectName,
    ...,
    new ManagedAction(
        PostInstallAction,
        Return.check,
        When.After,
        Step.InstallFinalize,
        Condition.NOT_Installed
    ),
    ...
);

内容的提问来源于stack exchange,提问作者El_Merendero

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.29 18:13:25