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

Visual Studio 2017:如何从ENVDTE和VSPackage获取当前运行版本?

获取Visual Studio 2017当前运行版本类型的解决方案

我之前移植VSIX到VS2017的时候也踩过这个坑——老版本靠注册表拿版本类型的方法完全失效了,折腾了好久才找到几个靠谱的办法,分享给你:

方法一:通过IVsShell接口获取官方版本ID(推荐)

这是最稳定的方式,利用VS Shell提供的官方接口直接获取版本标识,不会受注册表结构变化影响。

步骤如下:

  1. 确保你的项目引用了Microsoft.VisualStudio.Shell.Interop和Microsoft.VisualStudio.Shell程序集;
  2. 使用以下代码获取版本类型:
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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.15 04:04:56