Visual Studio 2017:如何从ENVDTE和VSPackage获取当前运行版本?
获取Visual Studio 2017当前运行版本类型的解决方案
我之前移植VSIX到VS2017的时候也踩过这个坑——老版本靠注册表拿版本类型的方法完全失效了,折腾了好久才找到几个靠谱的办法,分享给你:
方法一:通过IVsShell接口获取官方版本ID(推荐)
这是最稳定的方式,利用VS Shell提供的官方接口直接获取版本标识,不会受注册表结构变化影响。
步骤如下:
- 确保你的项目引用了
Microsoft.VisualStudio.Shell.Interop和Microsoft.VisualStudio.Shell程序集; - 使用以下代码获取版本类型:
using Microsoft.VisualStudio.Shell; using Microsoft.VisualStudio.Shell.Interop; public static string GetVisualStudioEdition() { // 获取VS Shell服务实例 var vsShell = Package.GetGlobalService(typeof(SVsShell)) as IVsShell; if (vsShell == null) return "Unknown Edition"; // 获取EditionId属性 object editionIdObj; var propResult = vsShell.GetProperty((int)__VSSPROPID5.VSSPROPID_EditionId, out editionIdObj); if (propResult != Microsoft.VisualStudio.VSConstants.S_OK) return "Unknown Edition"; string editionId = editionIdObj as string; // 映射EditionId到可读的版本名称 return editionId switch { "Microsoft.VisualStudio.Enterprise" => "Enterprise Edition", "Microsoft.VisualStudio.Community" => "Community Edition", "Microsoft.VisualStudio.Pro" => "Professional Edition", _ => editionId ?? "Unknown Edition" }; }
__VSSPROPID5.VSSPROPID_EditionId是VS2017新增的属性,专门用来返回当前运行实例的版本唯一标识,映射关系是官方定义的,不会轻易变动。
方法二:通过DTE访问私有注册表
如果你已经在使用ENVDTE接口,可以利用它提供的RegistryRoot属性直接访问VS的私有注册表,从中读取版本名称:
using EnvDTE; using Microsoft.VisualStudio.Shell; using Microsoft.Win32; public static string GetVsEditionFromPrivateRegistry() { var dte = Package.GetGlobalService(typeof(DTE)) as DTE; if (dte == null) return "Unknown Edition"; // 打开私有注册表根键 using var rootKey = RegistryKey.OpenBaseKey(RegistryHive.CurrentUser, RegistryView.Registry32); using var vsRegistryKey = rootKey.OpenSubKey(dte.RegistryRoot); if (vsRegistryKey == null) return "Unknown Edition"; // 读取EditionName值,直接返回版本全称 return vsRegistryKey.GetValue("EditionName") as string ?? "Unknown Edition"; }
这个方法返回的结果类似Visual Studio Enterprise 2017,不需要额外映射,但依赖私有注册表的结构,虽然VS2017及以后版本结构比较稳定,但还是不如第一种方法可靠。
两种方法都能解决你的问题,优先推荐第一种官方接口的方式哦。
内容的提问来源于stack exchange,提问作者codingadventures
相关产品推荐
相关产品推荐

