检测VSPackage的内部在Visual Studio版本(Detect the Visual S

2019-06-25 13:53发布

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

我无法从注册表中获得,因为计算机可能已经安装了好几个版本,所以我想有即能得到它的API。

任何人都知道如何使用C#托管的Visual Studio的包怎么做呢?

Answer 1:

你可以尝试通过自动化DTE对象获得的版本。 在强积金你能得到它以这种方式:

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

还有其他的一些相关的东西来获取DTE对象-通过Project.DTE ,也看过这个线程 ,如果你的DTE越来越空。

然后,你可以通过使用获得的版本DTE.Version财产 。

也有用的信息可以在卡洛斯·金特罗(VS插件忍者)的网站上找到HOWTO:检测安装了Visual Studio版本,包或服务包



Answer 2:

最后,我写了一个类检测的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; }
    }
}


Answer 3:

我认为下面的代码是更好的:

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


Answer 4:

要获得完整的语义版本,包括补丁号,如“15.9.6”,既不DTE.Version也不是文件版本提供足够的信息。

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

基本上,它是使用IVsAppId COM接口,你需要声明,就像在这个文件 。 (你可以,因为它基本上是复制文件。)

一旦你这样做,你需要获得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

BTW:它是在项目管理系统中使用这里 。

(它是如此之大,MS做新项目的系统代码开源的,它提供了一个很好的信息来源,你也可以找到它有用的模式。)



文章来源: Detect the Visual Studio version inside a VSPackage