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

如何在Wix安装程序的C#自定义操作中获取产品版本?

在C#自定义操作中获取Wix产品版本(与DLL版本一致)

完全可以获取到与myDLLfile.dll一致的产品版本,以下是两种可靠的实现方式:

方法一:读取MSI内置的ProductVersion属性

由于你的Wix产品版本已经通过!(bind.FileVersion.myDLLfile)绑定到DLL的文件版本,MSI的标准属性ProductVersion会直接返回这个值,无需额外读取文件。

代码实现

using Microsoft.Deployment.WindowsInstaller;

public class CustomActions
{
    [CustomAction]
    public static ActionResult FetchProductVersion(Session session)
    {
        session.Log("[CustomAction] 开始获取产品版本");
        
        // 直接从Session读取ProductVersion属性
        string productVersion = session["ProductVersion"];
        
        if (!string.IsNullOrWhiteSpace(productVersion))
        {
            session.Log($"[CustomAction] 产品版本:{productVersion}");
            // 这里可根据业务需求使用版本号,比如写入配置、传递给其他逻辑等
        }
        else
        {
            session.Log("[CustomAction] 错误:无法获取ProductVersion属性");
            return ActionResult.Failure;
        }
        
        return ActionResult.Success;
    }
}

注意事项

  • 该属性在安装流程的CostFinalize阶段之后即可访问,所以自定义操作可设置为Execute="immediate",执行顺序放在After="CostFinalize"即可。

方法二:直接读取安装目录下的DLL文件版本

如果需要直接验证DLL的版本(或因特殊场景无法读取ProductVersion),可以在DLL安装完成后,读取文件本身的版本信息。

代码实现

using Microsoft.Deployment.WindowsInstaller;
using System.Diagnostics;

public class CustomActions
{
    [CustomAction]
    public static ActionResult FetchDllVersion(Session session)
    {
        session.Log("[CustomAction] 开始读取DLL版本");
        
        // 获取产品安装根目录,需根据你的组件安装路径调整
        string installRoot = session["TARGETDIR"];
        string dllFullPath = System.IO.Path.Combine(installRoot, "myDLLfile.dll");
        
        if (System.IO.File.Exists(dllFullPath))
        {
            FileVersionInfo dllVersionInfo = FileVersionInfo.GetVersionInfo(dllFullPath);
            string dllVersion = dllVersionInfo.ProductVersion;
            
            session.Log($"[CustomAction] DLL版本:{dllVersion}");
            // 后续业务逻辑处理
        }
        else
        {
            session.Log("[CustomAction] 错误:目标目录中未找到myDLLfile.dll");
            return ActionResult.Failure;
        }
        
        return ActionResult.Success;
    }
}

注意事项

  • 必须确保DLL已被复制到目标目录,因此自定义操作需设置为Execute="deferred",执行顺序放在After="InstallFiles"。

Wix中配置自定义操作

无论使用哪种方法,都需要在Wix项目中注册自定义操作:

  1. 先将C#自定义操作项目编译为DLL,在Wix项目中添加对该DLL的引用。
  2. 在Product.wxs中添加以下配置:
<!-- 注册自定义操作二进制文件 -->
<Binary Id="CustomActionsBinary" SourceFile="..\YourCustomActionProject\bin\Debug\YourCustomAction.dll" />

<!-- 定义自定义操作 -->
<CustomAction Id="FetchVersionCA" BinaryKey="CustomActionsBinary" DllEntry="FetchProductVersion" Execute="immediate" />

<!-- 指定执行顺序 -->
<InstallExecuteSequence>
    <Custom Action="FetchVersionCA" After="CostFinalize" />
</InstallExecuteSequence>

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.20 00:55:01