检测VSPackage中的Visual Studio版本

问题描述 投票:13回答:4

如何检查/检测在我的VSPackage下运行的Visual Studio版本?

我无法从注册表中获取,因为计算机可能安装了多个版本,所以我猜有一个能够获得它的API。

有人知道如何使用C#从托管的Visual Studio包中获取它吗?

.net visual-studio vsix vspackage vs-extensibility
4个回答
15
投票

您可以尝试通过自动化DTE对象获取版本。在MPF中你可以这样得到它:

EnvDTE.DTE dte = (EnvDTE.DTE)Package.GetGlobalService(typeof(EnvDTE.DTE));

还有一些其他相关的东西来检索DTE对象 - 通过Project.DTE,如果你的DTE为null,也会读取this thread

然后你可以使用DTE.Version property获得版本。

另外有用的信息可以在Carlos Quintero(VS addin ninja)网站HOWTO: Detect installed Visual Studio editions, packages or service packs上找到


9
投票

最后我写了一个类来检测Visual Studio版本。经过测试和工作:

public static class VSVersion
{
    static readonly object mLock = new object();
    static Version mVsVersion;
    static Version mOsVersion;

    public static Version FullVersion
    {
        get
        {
            lock (mLock)
            {
                if (mVsVersion == null)
                {
                    string path = Path.Combine(AppDomain.CurrentDomain.BaseDirectory, "msenv.dll");

                    if (File.Exists(path))
                    {
                        FileVersionInfo fvi = FileVersionInfo.GetVersionInfo(path);

                        string verName = fvi.ProductVersion;

                        for (int i = 0; i < verName.Length; i++)
                        {
                            if (!char.IsDigit(verName, i) && verName[i] != '.')
                            {
                                verName = verName.Substring(0, i);
                                break;
                            }
                        }
                        mVsVersion = new Version(verName);
                    }
                    else
                        mVsVersion = new Version(0, 0); // Not running inside Visual Studio!
                }
            }

            return mVsVersion;
        }
    }

    public static Version OSVersion
    {
        get { return mOsVersion ?? (mOsVersion = Environment.OSVersion.Version); }
    }

    public static bool VS2012OrLater
    {
        get { return FullVersion >= new Version(11, 0); }
    }

    public static bool VS2010OrLater
    {
        get { return FullVersion >= new Version(10, 0); }
    }

    public static bool VS2008OrOlder
    {
        get { return FullVersion < new Version(9, 0); }
    }

    public static bool VS2005
    {
        get { return FullVersion.Major == 8; }
    }

    public static bool VS2008
    {
        get { return FullVersion.Major == 9; }
    }

    public static bool VS2010
    {
        get { return FullVersion.Major == 10; }
    }

    public static bool VS2012
    {
        get { return FullVersion.Major == 11; }
    }
}

2
投票

我认为以下代码更好:

string version = ((EnvDTE.DTE) ServiceProvider.GlobalProvider.GetService(typeof(EnvDTE.DTE).GUID)).Version;

0
投票

要获得包含补丁号的完整语义版本,例如“15.9.6”,DTE.Version和文件版本都不能提供足够的信息。

我在新的托管项目系统(https://github.com/dotnet/project-system)中找到了一个解决方案,它似乎至少在VS2017中工作。

基本上,它使用IVsAppId COM接口,你需要声明,就像在this file。 (你基本上可以复制该文件。)

一旦你这样做,你需要通过服务提供者以通常的方式获得IVsAppId实现,并使用GetProperty调用VSAPropID.VSAPROPID_ProductSemanticVersion方法(枚举也在链接文件中定义):

var vsAppId = serviceProvider.GetService<IVsAppId>(typeof(SVsAppId));

vsAppId.GetProperty((int)VSAPropID.VSAPROPID_ProductSemanticVersion, out var semanticVersionObj);

上面示例中的semanticVersionObj将包含一个字符串,格式如15.9.6+28307.344。在+(有时候是-)之前获取该部分会为您提供语义版本:15.9.6

顺便说一句:它用于托管项目系统here

(MS非常棒,新的项目系统代码是开源的。它提供了很好的信息来源,你也可以在其中找到有用的模式。)

© www.soinside.com 2019 - 2024. All rights reserved.