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

如何在WiX中识别旧版本应用的安装位置以迁移文件?

获取旧版本应用安装位置的方案

你可以通过Product Id(ProductCode)来获取旧版本的安装位置,具体可按以下两步实现:

1. 捕获旧版本的ProductCode

修改你现有的Upgrade元素配置,添加Property属性来捕获检测到的旧版本ProductCode:

<Upgrade Id="$(var.TOOLBOX_PRODUCT_UPGRADECODE)">
  <UpgradeVersion OnlyDetect="yes" Property="SELFFOUND"
                  Minimum="3.2.1" IncludeMinimum="yes"
                  Maximum="3.7.1" IncludeMaximum="yes"
                  Property="OLD_PRODUCT_CODE"/> <!-- 新增该行捕获旧版本ProductCode -->
</Upgrade>

当检测到符合版本范围的旧应用时,OLD_PRODUCT_CODE属性会自动填充为对应旧版本的Product Id。

2. 通过ProductCode查询安装位置

在你的C# CustomAction中,借助Windows Installer API(需引用Microsoft.Deployment.WindowsInstaller NuGet包),通过Installer.GetProductInfo方法查询旧版本的安装路径:

using Microsoft.Deployment.WindowsInstaller;
using System.IO;

[CustomAction]
public static ActionResult ImmediateCopyCustomAction(Session session)
{
    string oldProductCode = session["OLD_PRODUCT_CODE"];
    if (string.IsNullOrEmpty(oldProductCode))
    {
        session.Log("未检测到旧版本ProductCode");
        return ActionResult.Success;
    }

    string oldInstallLocation = null;
    try
    {
        // 查询旧版本的安装位置
        oldInstallLocation = Installer.GetProductInfo(oldProductCode, InstallProperty.InstallLocation);
        session.Log($"旧版本安装位置:{oldInstallLocation}");
    }
    catch (InstallerException ex)
    {
        session.Log($"获取安装位置失败:{ex.Message}");
        return ActionResult.Success;
    }

    // 执行文件复制逻辑(根据实际需求调整源文件和目标路径)
    if (!string.IsNullOrEmpty(oldInstallLocation))
    {
        string sourceFile = Path.Combine(oldInstallLocation, "需要复制的文件.txt");
        string targetFile = Path.Combine(session["INSTALLDIR"], "目标位置文件.txt");
        
        if (File.Exists(sourceFile))
        {
            File.Copy(sourceFile, targetFile, overwrite: true);
            session.Log($"已复制文件:{sourceFile} → {targetFile}");
        }
    }

    return ActionResult.Success;
}

补充说明

  • 若Installer.GetProductInfo返回空值,可直接查询注册表:旧版本安装路径通常存储在HKLM\Software\Microsoft\Windows\CurrentVersion\Uninstall\[旧版本ProductCode]下的InstallLocation键值(注意区分32位/64位系统的注册表路径)。
  • 若复制操作需要访问受保护的文件系统路径,建议将CustomAction的Execute属性改为deferred,并添加Impersonate="no"以获取系统权限。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.28 22:43:22