排查 VSPackages 问题
适用于: Visualstudio
本文介绍 VSPackage 的常见问题和故障排除提示。
VSPackage 阻止 Visual Studio 启动
在此方案中,通过在命令提示符处输入 devenv.exe /safemode ,在安全模式下启动 Visual Studio。 在此过程中,除了 Visual Studio 附带的 VSPackage 之外,不会加载 VSPackage。
未加载 VSPackage
若要排查此问题,请尝试执行以下步骤中的一个或多个操作:
确保使用的是注册要在其中运行 VSPackage 的注册表根目录,通常是实验性注册表根目录。 有关详细信息,请参阅 实验实例。
如果 VSPackage 的目标是在实验性注册表根目录中运行,请确保运行 Visual Studio 的实验版本。
若要运行实验版本,请打开 Visual Studio 命令提示符,然后输入 devenv /rootsuffix exp。
检查 VSPackage 注册表项。 有关详细信息,请参阅 注册 VSPackages 和管理 VSPackages。
打开无法加载 VSPackage 的 Visual Studio 实例的 “输出 ”窗口。 有关 VSPackage 加载失败的原因的信息可能会显示在该窗口中。
注意
如果要从 Visual Studio 集成开发环境 (IDE) 启动 Visual Studio 实验版,请检查这两个版本的 “输出 ”窗口。
检查活动日志。 有关详细信息,请参阅 如何:使用活动日志。
有关 IDE 引发的异常的详细信息,请选择“调试”菜单上的“异常”以启用异常。 在“异常”对话框中,选择需要更多信息的异常类型。
未注册 VSPackage
确保 VSPackage 程序集位于受信任位置。 RegPkg 无法在不受信任或部分受信任的位置(例如默认 .NET 安全配置中的网络共享)中注册程序集。 尽管每当用户在不受信任的位置创建项目时都会出现警告,但 “不再显示此消息 ”复选框可能会阻止此警告再次出现。
命令不可见,或者在选择命令时生成错误
若要解决此问题,请尝试以下步骤:
通过在 Visual Studio 命令提示符处输入 devenv /rootsuffix Exp /setup ,合并新的或更改的菜单命令以及 IDE 中已有的命令。
确保 Visual Studio 可以找到 VSPackage 的 UI.dll。
在注册表的“包”部分中找到 VSPackage 的 CLSID:
HKLM\Software\Microsoft\Visual Studio\<version>\Packages
验证 SatelliteDll 子项提供的路径是否正确。
VSPackage 行为意外
若要排查此问题,请尝试执行以下步骤中的一个或多个操作:
在代码中设置断点。
调试的良好起点是构造函数和初始化方法。 还可以在要评估的区域(如菜单命令)中设置断点。 若要启用断点,必须在调试器下运行。
在“ 项目 ”菜单上,选择“ 属性”。
在“ 属性页 ”对话框中,选择“ 调试 ”选项卡。
在 “命令行参数 ”框中,输入 VSPackage 面向的开发环境的根后缀。 例如,若要选择实验生成,请输入: /RootSuffix Exp。
在 “调试” 菜单上,选择“ 开始调试” 或按 F5。
注意
如果要调试项目,请立即创建或加载项目的现有实例。
使用活动日志。
通过在关键点将信息写入活动日志来跟踪 VSPackage 行为。 在零售环境中运行 VSPackage 时,此方法特别有用。 有关详细信息,请参阅 如何:使用活动日志。
使用公共符号。
若要提高调试时的可读性,可以将符号附加到调试器:
- 在 “工具/选项” 菜单中,导航到 “调试/符号 ”对话框。
- 添加 符号文件 (.pdb) 位置:
https://msdl.microsoft.com/download/symbols
。 - 若要提高性能,请指定符号缓存文件夹,例如: C:\symbols。
缺少 VSPackage 或其依赖项之一
对于托管代码,请确保引用路径正确。
在“ 项目 ”菜单上,选择“ 属性”。
选择“属性页”对话框中的“引用”选项卡,确保所有路径都正确。 或者,可以使用 对象浏览器 浏览引用的对象。
对于托管代码,可以使用 Fuslogvw.exe (程序集绑定日志查看器) 来显示失败的程序集加载的详细信息。
对于非托管代码,请在 Visual Studio CLSID 注册表节点中找到 VSPackage 的 CLSID:
HKLM\Software\Microsoft\Visual Studio\<version>\CLSID
确保 InprocServer32 条目具有 VSPackage DLL 的正确路径。