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

如何调试并单步执行Visual Studio安装项目及自定义操作代码?

问题:VSTO Outlook插件卸载时自定义操作未关闭Outlook,能否单步调试?

环境信息

  • OS: Windows 10 Enterprise N
  • 开发环境: VS2022 (64-Bit) Professional (7.5)
  • 应用: VSTO Add-In (Outlook 32-Bit)

问题描述

安装时自定义操作能正常关闭Outlook,但卸载时未调用关闭Outlook的代码,想知道能不能单步调试这段卸载时的自定义操作代码?

自定义操作代码

using System;
using System.Collections;
using System.ComponentModel;
using System.Configuration.Install;
using System.Diagnostics;

namespace MySetupCustomActions
{
    [RunInstaller(true)]
    public class AddCustomizations: Installer
    {
        public AddCustomizations() : base() { }

        // 重写Install方法
        public override void Install(IDictionary savedState)
        {
            base.Install(savedState);    

            KillProcess("outlook");               
        }
        // 重写Commit方法
        public override void Commit(IDictionary savedState)
        {
            base.Commit(savedState);
            KillProcess("outlook");
        }
        // 重写Rollback方法
        public override void Rollback(IDictionary savedState)
        {
            base.Rollback(savedState);
            KillProcess("outlook");
        }

        private void KillProcess(string processName)
        {
            try
            {
                var procs = Process.GetProcessesByName(processName);
                foreach (var p in procs) { p.Kill(); }
            }
            catch (Exception e)
            {
                Console.WriteLine(e);
                throw;
            }
        }
        
        static void Main()
        {
           
            
        }
    }
}

解决方案

1. 卸载未触发的原因

你的自定义操作只重写了Install、Commit、Rollback方法,但卸载过程默认调用的是Uninstall方法,你没重写这个方法,所以卸载时根本不会执行关闭Outlook的逻辑。先补上Uninstall方法:

public override void Uninstall(IDictionary savedState)
{
    base.Uninstall(savedState);
    KillProcess("outlook");
}

2. 单步调试卸载自定义操作的方法

方法一:附加进程调试

  1. 先完成插件安装,确保MSI包已部署到系统中。
  2. 在VS中打开自定义操作项目,在Uninstall和KillProcess方法内设置断点。
  3. 以管理员身份打开命令提示符,执行卸载命令:
    msiexec /x {你的MSI产品GUID} /l*v uninstall.log
    
    (产品GUID可在注册表HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall下查找,或在VS安装项目属性中查看)
  4. 执行命令后,立即回到VS,点击调试 -> 附加到进程,找到msiexec.exe进程并附加,断点就会触发。

方法二:添加延迟启动调试

在Uninstall方法开头添加延迟代码,给你足够时间附加进程:

public override void Uninstall(IDictionary savedState)
{
    // 延迟10秒,预留时间附加进程
    System.Threading.Thread.Sleep(10000);
    base.Uninstall(savedState);
    KillProcess("outlook");
}

重新生成自定义操作、更新MSI包后执行卸载,这段时间内去VS附加msiexec.exe即可。

注意事项

  • 由于是32位Outlook,需确保自定义操作项目的生成平台为x86(项目属性 -> 生成 -> 平台目标选x86),否则可能无法找到32位Outlook进程。
  • 卸载时可能启动多个msiexec.exe进程,建议附加所有相关进程,避免错过断点。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.29 16:05:36