tairqammar Asked: 2019-04-18 10:23:13 +0800 CST2019-04-18 10:23:13 +0800 CST 2019-04-18 10:23:13 +0800 CST 如何以编程方式检测 Visual Studio 版本? 772 我想以编程方式检测已安装的 Visual Studio 的版本。我已经尝试过这个和这个vs但是我在注册表中找不到密钥。我试过 Visual Studio Community 2017。 有什么帮助吗? visual-studio 2 个回答 Voted Vero 2020-01-28T10:01:24+08:002020-01-28T10:01:24+08:00 https://docs.microsoft.com/en-us/visualstudio/install/tools-for-managing-visual-studio-instances?view=vs-2019 如果您需要以编程方式执行此操作,祝您好运!API 在不同版本之间不稳定。我做了一个 C# 解决方案来检测 VS2017 并将版本从 15.0 增加到 16.0 给出错误 1054。 上面的链接向您展示了多种查找版本的不同方法,我建议您尝试将其用于您的程序或安装,而不是想出自己开发的解决方案,因为当涉及到 API 兼容性时,MS 会把开发人员扔到狼群中它是最离散的,没有使用太多 API 至少根据我的经验,当涉及到 Visual Studio 主要版本之间的 Visual Studio API 时。 更详细地说,如果你想检测 Vs2017 和 VS2019,你需要检测 VSWhere.exe 的存在,它是 Visual Studio 安装程序的标准配置。 我相信这个位置不会改变:%ProgramFiles(x86)%\Microsoft Visual Studio\Installer\Vswhere.exe 您可以通过此链接找到有关 vswhere 所需的所有信息: https ://github.com/microsoft/vswhere 如果您使用的是安装程序,这可能是当前查找 Visual Studio 安装位置的最佳方式。 如果您绝对需要一种查找安装程序的编程方式,这是我过去用于查找 VS2017 的 COM 实现,但由于某种原因我无法找到 VS2019。当我将版本增加到 16 时,它对我来说失败了。我可以在代码示例中为您提供这么多,但我不能花时间帮助您让它发挥作用。 _COM_SMARTPTR_TYPEDEF(ISetupInstance, __uuidof(ISetupInstance)); _COM_SMARTPTR_TYPEDEF(ISetupInstance2, __uuidof(ISetupInstance2)); _COM_SMARTPTR_TYPEDEF(IEnumSetupInstances, __uuidof(IEnumSetupInstances)); _COM_SMARTPTR_TYPEDEF(ISetupConfiguration, __uuidof(ISetupConfiguration)); _COM_SMARTPTR_TYPEDEF(ISetupConfiguration2, __uuidof(ISetupConfiguration2)); _COM_SMARTPTR_TYPEDEF(ISetupHelper, __uuidof(ISetupHelper)); _COM_SMARTPTR_TYPEDEF(ISetupPackageReference, __uuidof(ISetupPackageReference)); module_ptr GetQuery(_Outptr_result_maybenull_ ISetupConfiguration** ppQuery); UINT __stdcall GetVS2017Path(MSIHANDLE hModule) { TraceOut(hModule, _T("In GetVS2017Path"), 1); try { int version = 15; const wstring VCCompilerType(L"Component"); const wstring VCCompilerID(L"Microsoft.VisualStudio.Component.VC.Tools.x86.x64"); CoInitializer init; ISetupConfigurationPtr query; auto lib = GetQuery(&query); ISetupConfiguration2Ptr query2(query); IEnumSetupInstancesPtr e; checkResult(query2->EnumAllInstances(&e)); ISetupHelperPtr helper(query); ISetupInstance* pInstances[1] = { nullptr }; auto hr = e->Next(1, pInstances, nullptr); while (S_OK == hr) { // Wrap instance without AddRef'ing. ISetupInstancePtr instance(pInstances[0], false); bstr_t bstrVersion; checkResult(instance->GetInstallationVersion(bstrVersion.GetAddress())); ULONGLONG ullVersion; checkResult(helper->ParseVersion(bstrVersion, &ullVersion)); // get the major version number ullVersion >>= 48L; if (ullVersion == version) { ISetupInstance2Ptr instance2(instance); LPSAFEARRAY psa = NULL; checkResult(instance2->GetPackages(&psa)); safearray_ptr psa_ptr(&psa); // Lock the SAFEARRAY to get the raw pointer array. checkResult(::SafeArrayLock(psa)); auto rgpPackages = reinterpret_cast<ISetupPackageReference**>(psa->pvData); auto cPackages = psa->rgsabound[0].cElements; if (0 != cPackages) { vector< ISetupPackageReference* > packages(rgpPackages, rgpPackages + cPackages); for (auto pPackage : packages) { bstr_t bstrType; checkResult(pPackage->GetType(bstrType.GetAddress())); bstr_t bstrID; checkResult(pPackage->GetId(bstrID.GetAddress())); if (VCCompilerType == wstring(bstrType) && VCCompilerID == wstring(bstrID)) { bstr_t bstrInstallationPath; instance2->GetInstallationPath(bstrInstallationPath.GetAddress()); return ERROR_SUCCESS; } } } } hr = e->Next(1, pInstances, NULL); } if (FAILED(hr)) { throw win32_exception(hr, "failed to enumerate all instances"); } } catch (win32_exception) { return ERROR_INSTALL_FAILURE; } catch (exception) { return ERROR_INSTALL_FAILURE; } return ERROR_INSTALL_FAILURE; } void checkResult(HRESULT hr) { if (FAILED(hr)) { throw win32_exception(hr, "call failed"); } } Best Answer harrymc 2019-04-18T12:19:01+08:002019-04-18T12:19:01+08:00 Visual Studio 版本位于注册表项下方 HKEY_LOCAL_MACHINE\SOFTWARE\Wow6432Node\Microsoft\DevDiv\vs\Servicing\<version>。 上面的子项名称将定义已安装的 Visual Studio 版本,如下所示: Visual Studio 6 - 6.0 Visual Studio .NET (2002) - 7.0 Visual Studio .NET 2003 - 7.1 Visual Studio 2005 - 8.0 Visual Studio 2008 - 9.0 Visual Studio 2010 - 10.0 Visual Studio 2012 - 11.0 Visual Studio 2013 - 12.0 Visual Studio 2015 - 14.0 Visual Studio 2017 - 15.0 Visual Studio 2019 - 16.0 根据我的经验,这些是您会找到的版本号,但某些 VS 版本总是有可能在该点之后添加了一个子版本号。 我可以验证此密钥从 Visual Studio 2008 开始就存在,但不能保证它适用于早期版本。
https://docs.microsoft.com/en-us/visualstudio/install/tools-for-managing-visual-studio-instances?view=vs-2019
如果您需要以编程方式执行此操作,祝您好运!API 在不同版本之间不稳定。我做了一个 C# 解决方案来检测 VS2017 并将版本从 15.0 增加到 16.0 给出错误 1054。
上面的链接向您展示了多种查找版本的不同方法,我建议您尝试将其用于您的程序或安装,而不是想出自己开发的解决方案,因为当涉及到 API 兼容性时,MS 会把开发人员扔到狼群中它是最离散的,没有使用太多 API 至少根据我的经验,当涉及到 Visual Studio 主要版本之间的 Visual Studio API 时。
更详细地说,如果你想检测 Vs2017 和 VS2019,你需要检测 VSWhere.exe 的存在,它是 Visual Studio 安装程序的标准配置。
我相信这个位置不会改变:%ProgramFiles(x86)%\Microsoft Visual Studio\Installer\Vswhere.exe
您可以通过此链接找到有关 vswhere 所需的所有信息: https ://github.com/microsoft/vswhere 如果您使用的是安装程序,这可能是当前查找 Visual Studio 安装位置的最佳方式。
如果您绝对需要一种查找安装程序的编程方式,这是我过去用于查找 VS2017 的 COM 实现,但由于某种原因我无法找到 VS2019。当我将版本增加到 16 时,它对我来说失败了。我可以在代码示例中为您提供这么多,但我不能花时间帮助您让它发挥作用。
Visual Studio 版本位于注册表项下方
HKEY_LOCAL_MACHINE\SOFTWARE\Wow6432Node\Microsoft\DevDiv\vs\Servicing\<version>
。上面的子项名称将定义已安装的 Visual Studio 版本,如下所示:
根据我的经验,这些是您会找到的版本号,但某些 VS 版本总是有可能在该点之后添加了一个子版本号。
我可以验证此密钥从 Visual Studio 2008 开始就存在,但不能保证它适用于早期版本。