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

如何在自定义Action中传入可点击的下载链接?

解决MSI Custom Action中下载链接不可点击的问题

问题原因

Windows Installer通过session.Message弹出的标准错误消息框不支持解析HTML标签,因此你代码中的<a>链接会被当作纯文本显示,无法点击。

解决方案

方案1:调用Windows API显示带可识别链接的消息框

Windows系统的消息框可以自动识别纯文本中的URL并允许点击,因此可以替换原有的session.Message调用,通过P/Invoke调用Windows API创建消息框,示例代码如下:

using System;
using System.Runtime.InteropServices;
using Microsoft.Deployment.WindowsInstaller;

public class CustomActions
{
    // P/Invoke声明Windows API
    [DllImport("user32.dll", CharSet = CharSet.Unicode)]
    private static extern int MessageBoxIndirect(ref MSGBOXPARAMS lpMsgBoxParams);

    [StructLayout(LayoutKind.Sequential, CharSet = CharSet.Unicode)]
    private struct MSGBOXPARAMS
    {
        public uint cbSize;
        public IntPtr hwndOwner;
        public IntPtr hInstance;
        public string lpszText;
        public string lpszCaption;
        public uint dwStyle;
        public string lpszIcon;
        public uint dwContextHelpId;
        public IntPtr lpfnMsgBoxCallback;
        public uint dwLanguageId;
    }

    // 消息框样式常量
    private const uint MB_ICONERROR = 0x00000010;
    private const uint MB_OK = 0x00000000;
    private const uint MB_TOPMOST = 0x00040000;

    [CustomAction]
    public static ActionResult _CA_CheckNETCoreVersion(Session session)
    {
        string downloadUrl = "https://dotnet.microsoft.com/download/dotnet/6.0";
        string errorMessage = $"This setup requires Microsoft .NET 6.0.16 SDK.\nDownload the SDK from:\n{downloadUrl}";

        // 配置消息框参数
        MSGBOXPARAMS msgParams = new MSGBOXPARAMS();
        msgParams.cbSize = (uint)Marshal.SizeOf(typeof(MSGBOXPARAMS));
        msgParams.hwndOwner = IntPtr.Zero;
        msgParams.hInstance = IntPtr.Zero;
        msgParams.lpszText = errorMessage;
        msgParams.lpszCaption = "Missing .NET 6 SDK";
        msgParams.dwStyle = MB_OK | MB_ICONERROR | MB_TOPMOST;
        msgParams.lpszIcon = null;
        msgParams.dwContextHelpId = 0;
        msgParams.lpfnMsgBoxCallback = IntPtr.Zero;
        msgParams.dwLanguageId = 0;

        // 显示消息框
        MessageBoxIndirect(ref msgParams);

        return ActionResult.Failure;
    }
}

此方法中,Windows会自动识别文本中的URL,用户点击后会打开默认浏览器跳转至下载页面。

方案2:使用MSI自定义对话框(推荐)

更符合MSI规范的做法是创建自定义对话框,添加超链接控件来实现可点击链接:

  1. 在你的安装项目中添加一个自定义对话框,添加文本控件提示缺少.NET SDK,再添加超链接控件并设置其URL为.NET 6的下载地址,同时添加错误图标提升提示效果。
  2. 修改安装序列配置,在UI序列中触发该对话框:
<InstallUISequence>
    <Show Dialog="NETCoreMissingDialog" Before="FindRelatedProducts">NETCORE = "NO"</Show>
</InstallUISequence>

这种方法的用户体验更统一,且符合MSI的标准交互逻辑。

注意事项

  • 若安装为静默模式(无UI),消息框和自定义对话框都不会显示,建议在Custom Action中同时写入日志信息,便于排查静默安装失败的原因:
session.Log("ERROR: Missing required Microsoft .NET 6.0.16 SDK. Download from: https://dotnet.microsoft.com/download/dotnet/6.0");

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.16 14:24:50