VSIX - 次 visual studio 版本

VSIX - Minor visual studio version

有人知道if/how可以从 VSIX 扩展中获取当前 运行 的次要 Visual Studio 版本吗?

我已经找到了以下 属性,但我们想要更详细的版本号(更多部分)。 https://docs.microsoft.com/en-us/dotnet/api/envdte._dte.version?view=visualstudiosdk-2017

以下代码在我的 VS 2019 中显示“16.0.29306.81 D16.2”:

var shell = (package as System.IServiceProvider).GetService(typeof(Microsoft.VisualStudio.Shell.Interop.SVsShell)) as Microsoft.VisualStudio.Shell.Interop.IVsShell;
object ver = null;
shell.GetProperty((int)Microsoft.VisualStudio.Shell.Interop.__VSSPROPID5.VSSPROPID_ReleaseVersion, out ver);
System.Windows.MessageBox.Show(ver.ToString());

假设您可能想要 X.Y.Z 而不是 X.0 or X.Y 这样的级别。 (例如:VS2017-15.9.13=>15.9=>15.0)。

Sergey 的 很好的回答可以帮助您解决问题,如果格式 X.Y 对您来说足够的话。但是如果你想获得像VS version+version number这样的完整细节,你可以考虑使用注册表项。

VS2015及更早版本可以看到this vsx document and this similar issue,你可以尝试使用RegistryKey从HKEY_LOCAL_MACHINE\SOFTWARE\Wow6432Node\Microsoft\DevDiv\vs\Servicing\<version>获取你想要的信息。

但是由于VS2017的安装体验对于vsinstaller.exe有所改变。我们无法再访问该注册表项下有关 VS2017 和 VS2019 的版本详细信息。

对于 VS2017 和 VS2019,我发现我们可以在 HKEY_CURRENT_USER\Software\Microsoft\VSCommon.0 or 16.0\SQM\PIDs\ 访问相关信息。

如果机器上只有一个版本的VS2017和VS2019,可以使用如下代码获取详情:

            DTE dte = Package.GetGlobalService(typeof(DTE)) as DTE;
            string version = dte.Version;
            string editon = dte.Edition;

            RegistryKey key = Registry.CurrentUser;
            RegistryKey pidsKey = key.OpenSubKey("Software\Microsoft\VSCommon\" + version + "\SQM\PIDs\", true);
            string[] instances = new string[10];
            instances = pidsKey.GetSubKeyNames();

            RegistryKey instanceKey = key.OpenSubKey("Software\Microsoft\VSCommon\" + version + "\SQM\PIDs\" + instances[0], true);
            //read the details about VSManifestID
            string versionInfo = instanceKey.GetValue("VSManifestID").ToString();

versionInfo的格式看这里:VisualStudio/15.9.13+28307.xxx(除了VSManifestID,还可以用VSChanelID...)

但是如果您在 PC 上有多个相同的 VS 版本(VS20xx 社区和企业在同一台机器上),这将不起作用。在这种情况下,您必须借助 dte.Version and dte.Edition 添加更多的判断逻辑。

找到VS次要部分的最简单方法是从文件中获取版本信息"devenv.exe":

var devenvInfo = FileVersionInfo.GetVersionInfo(dte.FullName);
return new Version(devenvInfo.FileMajorPart, devenvInfo.FileMinorPart);