如何调试并单步执行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. 单步调试卸载自定义操作的方法
方法一:附加进程调试
- 先完成插件安装,确保MSI包已部署到系统中。
- 在VS中打开自定义操作项目,在
Uninstall和KillProcess方法内设置断点。 - 以管理员身份打开命令提示符,执行卸载命令:
(产品GUID可在注册表msiexec /x {你的MSI产品GUID} /l*v uninstall.logHKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall下查找,或在VS安装项目属性中查看) - 执行命令后,立即回到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
相关产品推荐
相关产品推荐

