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);
有人知道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);