diff --git a/src/ext/VisualStudio/ca/vsca.cpp b/src/ext/VisualStudio/ca/vsca.cpp index 681187d67..8524629bb 100644 --- a/src/ext/VisualStudio/ca/vsca.cpp +++ b/src/ext/VisualStudio/ca/vsca.cpp @@ -59,6 +59,12 @@ static HRESULT ProcessVS2022( __in BOOL fComplete ); +static HRESULT ProcessVS2026( + __in_opt ISetupInstance* pInstance, + __in DWORD64 qwVersion, + __in BOOL fComplete +); + static HRESULT SetPropertyForComponent( __in DWORD cComponents, __in VS_COMPONENT_PROPERTY* rgComponents, @@ -70,6 +76,7 @@ static VS_INSTANCE vrgInstances[] = { FILEMAKEVERSION(15, 0, 0, 0), FILEMAKEVERSION(15, 0xffff, 0xffff, 0xffff), ProcessVS2017 }, { FILEMAKEVERSION(16, 0, 0, 0), FILEMAKEVERSION(16, 0xffff, 0xffff, 0xffff), ProcessVS2019 }, { FILEMAKEVERSION(17, 0, 0, 0), FILEMAKEVERSION(17, 0xffff, 0xffff, 0xffff), ProcessVS2022 }, + { FILEMAKEVERSION(18, 0, 0, 0), FILEMAKEVERSION(18, 0xffff, 0xffff, 0xffff), ProcessVS2026 }, }; /****************************************************************** @@ -566,6 +573,80 @@ static HRESULT ProcessVS2022( return hr; } +static HRESULT ProcessVS2026( + __in_opt ISetupInstance* pInstance, + __in DWORD64 qwVersion, + __in BOOL fComplete +) +{ + static ISetupInstance* pLatest = NULL; + static DWORD64 qwLatest = 0; + + static LPCWSTR rgwzProducts[] = + { + L"Microsoft.VisualStudio.Product.Community", + L"Microsoft.VisualStudio.Product.Professional", + L"Microsoft.VisualStudio.Product.Enterprise", + }; + + // TODO: Consider making table-driven with these defaults per-version for easy customization. + static VS_COMPONENT_PROPERTY rgComponents[] = + { + { L"Microsoft.VisualStudio.Component.FSharp", L"VS2026_IDE_FSHARP_PROJECTSYSTEM_INSTALLED" }, + { L"Microsoft.VisualStudio.Component.Roslyn.LanguageServices", L"VS2026_IDE_VB_PROJECTSYSTEM_INSTALLED" }, + { L"Microsoft.VisualStudio.Component.Roslyn.LanguageServices", L"VS2026_IDE_VCSHARP_PROJECTSYSTEM_INSTALLED" }, + { L"Microsoft.VisualStudio.PackageGroup.TestTools.Core", L"VS2026_IDE_VSTS_TESTSYSTEM_INSTALLED" }, + { L"Microsoft.VisualStudio.Component.VC.CoreIde", L"VS2026_IDE_VC_PROJECTSYSTEM_INSTALLED" }, + { L"Microsoft.VisualStudio.Component.Web", L"VS2026_IDE_VWD_PROJECTSYSTEM_INSTALLED" }, + { L"Microsoft.VisualStudio.PackageGroup.DslRuntime", L"VS2026_IDE_MODELING_PROJECTSYSTEM_INSTALLED" }, + }; + + HRESULT hr = S_OK; + + if (fComplete) + { + if (pLatest) + { + hr = ProcessInstance(pLatest, L"VS2026_ROOT_FOLDER", countof(rgComponents), rgComponents); + ExitOnFailure(hr, "Failed to process VS2026 instance."); + } + } + else if (pInstance) + { + hr = InstanceInProducts(pInstance, countof(rgwzProducts), rgwzProducts); + ExitOnFailure(hr, "Failed to compare product IDs."); + + if (S_FALSE == hr) + { + ExitFunction(); + } + + hr = InstanceIsGreater(pLatest, qwLatest, pInstance, qwVersion); + ExitOnFailure(hr, "Failed to compare instances."); + + if (S_FALSE == hr) + { + ExitFunction(); + } + + ReleaseNullObject(pLatest); + + pLatest = pInstance; + qwLatest = qwVersion; + + // Caller will do a final Release() otherwise. + pLatest->AddRef(); + } + +LExit: + if (fComplete) + { + ReleaseObject(pLatest); + } + + return hr; +} + static HRESULT SetPropertyForComponent( __in DWORD cComponents, __in VS_COMPONENT_PROPERTY* rgComponents, diff --git a/src/ext/VisualStudio/test/WixToolsetTest.VisualStudio/TestData/UsingVsixPackage/Package.wxs b/src/ext/VisualStudio/test/WixToolsetTest.VisualStudio/TestData/UsingVsixPackage/Package.wxs index d56674e31..d827dafb2 100644 --- a/src/ext/VisualStudio/test/WixToolsetTest.VisualStudio/TestData/UsingVsixPackage/Package.wxs +++ b/src/ext/VisualStudio/test/WixToolsetTest.VisualStudio/TestData/UsingVsixPackage/Package.wxs @@ -6,6 +6,7 @@ + diff --git a/src/ext/VisualStudio/test/WixToolsetTest.VisualStudio/VisualStudioExtensionFixture.cs b/src/ext/VisualStudio/test/WixToolsetTest.VisualStudio/VisualStudioExtensionFixture.cs index 361f52743..bc47d2d37 100644 --- a/src/ext/VisualStudio/test/WixToolsetTest.VisualStudio/VisualStudioExtensionFixture.cs +++ b/src/ext/VisualStudio/test/WixToolsetTest.VisualStudio/VisualStudioExtensionFixture.cs @@ -27,6 +27,10 @@ public void CanBuildUsingVsixPackage() "CustomAction:SetVS2012Vsix\t51\tVS_VSIX_INSTALLER_PATH\t[VS2012_VSIX_INSTALLER_PATH]\t", "CustomAction:SetVS2013Vsix\t51\tVS_VSIX_INSTALLER_PATH\t[VS2013_VSIX_INSTALLER_PATH]\t", "CustomAction:SetVS2015Vsix\t51\tVS_VSIX_INSTALLER_PATH\t[VS2015_VSIX_INSTALLER_PATH]\t", + "CustomAction:SetVS2017Vsix\t51\tVS_VSIX_INSTALLER_PATH\t[VS2017_VSIX_INSTALLER_PATH]\t", + "CustomAction:SetVS2019Vsix\t51\tVS_VSIX_INSTALLER_PATH\t[VS2019_VSIX_INSTALLER_PATH]\t", + "CustomAction:SetVS2022Vsix\t51\tVS_VSIX_INSTALLER_PATH\t[VS2022_VSIX_INSTALLER_PATH]\t", + "CustomAction:SetVS2026Vsix\t51\tVS_VSIX_INSTALLER_PATH\t[VS2026_VSIX_INSTALLER_PATH]\t", "CustomAction:vimLa9TyFoAVwf8JmA0_ZJHA69J2fo\t3122\tVS_VSIX_INSTALLER_PATH\t/q \"[#filzi8nwT8Ta133xcfp7qSIdGdRiC0]\" /admin\t", "CustomAction:viuMpl8IvFSDAzTulrmpAzBwAmCRTQ\t1074\tVS_VSIX_INSTALLER_PATH\t/q \"[#filzi8nwT8Ta133xcfp7qSIdGdRiC0]\"\t", "CustomAction:vrmLa9TyFoAVwf8JmA0_ZJHA69J2fo\t3442\tVS_VSIX_INSTALLER_PATH\t/q /u:\"ExampleVsix\" /admin\t", @@ -36,7 +40,7 @@ public void CanBuildUsingVsixPackage() "CustomAction:Vwd2012VsixWhenVSAbsent\t51\tVS_VSIX_INSTALLER_PATH\t[VWD2012_VSIX_INSTALL_ROOT]\\Common7\\IDE\\VSIXInstaller.exe\t", "CustomAction:Vwd2013VsixWhenVSAbsent\t51\tVS_VSIX_INSTALLER_PATH\t[VWD2013_VSIX_INSTALL_ROOT]\\Common7\\IDE\\VSIXInstaller.exe\t", "CustomAction:Vwd2015VsixWhenVSAbsent\t51\tVS_VSIX_INSTALLER_PATH\t[VWD2015_VSIX_INSTALL_ROOT]\\Common7\\IDE\\VSIXInstaller.exe\t", - "CustomAction:Wix4VSFindInstances_X86\t257\tVSCA_X86\tFindInstances\t", + "CustomAction:Wix4VSFindInstances_X86\t257\tWix4VSCA_X86\tFindInstances\t", }, results); } @@ -55,6 +59,10 @@ public void CanBuildUsingVsixPackageOnArm64() "CustomAction:SetVS2012Vsix\t51\tVS_VSIX_INSTALLER_PATH\t[VS2012_VSIX_INSTALLER_PATH]\t", "CustomAction:SetVS2013Vsix\t51\tVS_VSIX_INSTALLER_PATH\t[VS2013_VSIX_INSTALLER_PATH]\t", "CustomAction:SetVS2015Vsix\t51\tVS_VSIX_INSTALLER_PATH\t[VS2015_VSIX_INSTALLER_PATH]\t", + "CustomAction:SetVS2017Vsix\t51\tVS_VSIX_INSTALLER_PATH\t[VS2017_VSIX_INSTALLER_PATH]\t", + "CustomAction:SetVS2019Vsix\t51\tVS_VSIX_INSTALLER_PATH\t[VS2019_VSIX_INSTALLER_PATH]\t", + "CustomAction:SetVS2022Vsix\t51\tVS_VSIX_INSTALLER_PATH\t[VS2022_VSIX_INSTALLER_PATH]\t", + "CustomAction:SetVS2026Vsix\t51\tVS_VSIX_INSTALLER_PATH\t[VS2026_VSIX_INSTALLER_PATH]\t", "CustomAction:vimLa9TyFoAVwf8JmA0_ZJHA69J2fo\t3122\tVS_VSIX_INSTALLER_PATH\t/q \"[#filzi8nwT8Ta133xcfp7qSIdGdRiC0]\" /admin\t", "CustomAction:viuMpl8IvFSDAzTulrmpAzBwAmCRTQ\t1074\tVS_VSIX_INSTALLER_PATH\t/q \"[#filzi8nwT8Ta133xcfp7qSIdGdRiC0]\"\t", "CustomAction:vrmLa9TyFoAVwf8JmA0_ZJHA69J2fo\t3442\tVS_VSIX_INSTALLER_PATH\t/q /u:\"ExampleVsix\" /admin\t", @@ -64,7 +72,7 @@ public void CanBuildUsingVsixPackageOnArm64() "CustomAction:Vwd2012VsixWhenVSAbsent\t51\tVS_VSIX_INSTALLER_PATH\t[VWD2012_VSIX_INSTALL_ROOT]\\Common7\\IDE\\VSIXInstaller.exe\t", "CustomAction:Vwd2013VsixWhenVSAbsent\t51\tVS_VSIX_INSTALLER_PATH\t[VWD2013_VSIX_INSTALL_ROOT]\\Common7\\IDE\\VSIXInstaller.exe\t", "CustomAction:Vwd2015VsixWhenVSAbsent\t51\tVS_VSIX_INSTALLER_PATH\t[VWD2015_VSIX_INSTALL_ROOT]\\Common7\\IDE\\VSIXInstaller.exe\t", - "CustomAction:Wix4VSFindInstances_A64\t257\tVSCA_A64\tFindInstances\t", + "CustomAction:Wix4VSFindInstances_A64\t257\tWix4VSCA_A64\tFindInstances\t", }, customActionResults); var propertyResults = results.Single(r => r.StartsWith("Property:SecureCustomProperties")).Split('\t')[1].Split(';'); @@ -77,9 +85,18 @@ public void CanBuildUsingVsixPackageOnArm64() "VS2015_VSIX_INSTALLER_PATH", "VS2017_IDE_DIR", "VS2017_ROOT_FOLDER", + "VS2017_VSIX_INSTALLER_PATH", "VS2017DEVENV", + "VS2019_IDE_DIR", "VS2019_IDE_VCSHARP_PROJECTSYSTEM_INSTALLED", + "VS2019_ROOT_FOLDER", + "VS2019_VSIX_INSTALLER_PATH", + "VS2022_IDE_DIR", "VS2022_ROOT_FOLDER", + "VS2022_VSIX_INSTALLER_PATH", + "VS2026_IDE_DIR", + "VS2026_ROOT_FOLDER", + "VS2026_VSIX_INSTALLER_PATH", "WIX_DOWNGRADE_DETECTED", "WIX_UPGRADE_DETECTED", }, propertyResults); diff --git a/src/ext/VisualStudio/wixlib/VS2026.wxs b/src/ext/VisualStudio/wixlib/VS2026.wxs new file mode 100644 index 000000000..2cc78845a --- /dev/null +++ b/src/ext/VisualStudio/wixlib/VS2026.wxs @@ -0,0 +1,134 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/src/ext/VisualStudio/wixlib/VSExtension_Platform.wxi b/src/ext/VisualStudio/wixlib/VSExtension_Platform.wxi index 71c3a6c5e..3242ba37f 100644 --- a/src/ext/VisualStudio/wixlib/VSExtension_Platform.wxi +++ b/src/ext/VisualStudio/wixlib/VSExtension_Platform.wxi @@ -1,10 +1,10 @@ - + - + @@ -14,6 +14,6 @@ - + diff --git a/src/ext/VisualStudio/wixlib/VsixPackage.wxs b/src/ext/VisualStudio/wixlib/VsixPackage.wxs index 5937177b2..605e4ac54 100644 --- a/src/ext/VisualStudio/wixlib/VsixPackage.wxs +++ b/src/ext/VisualStudio/wixlib/VsixPackage.wxs @@ -1,4 +1,4 @@ - + @@ -28,6 +28,30 @@ + + + + + + + + + + + + + + + + + + + + + + + + @@ -46,7 +70,15 @@ - + + + + + + + + + diff --git a/src/ext/VisualStudio/wixlib/vs.wixproj b/src/ext/VisualStudio/wixlib/vs.wixproj index e416c67aa..f714609ca 100644 --- a/src/ext/VisualStudio/wixlib/vs.wixproj +++ b/src/ext/VisualStudio/wixlib/vs.wixproj @@ -9,9 +9,7 @@ - - - +