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 @@
-
-
-
+