diff --git a/.ado/compliance.yml b/.ado/compliance.yml
index 659bb734967..9c9af7b113c 100644
--- a/.ado/compliance.yml
+++ b/.ado/compliance.yml
@@ -6,10 +6,10 @@ parameters:
default:
Medium:
name: rnw-pool-4-microsoft
- demands: ImageOverride -equals rnw-img-vs2022-node22
+ demands: ImageOverride -equals rnw-img-vs2026-node22
Large:
name: rnw-pool-8-microsoft
- demands: ImageOverride -equals rnw-img-vs2022-node22
+ demands: ImageOverride -equals rnw-img-vs2026-node22
- name: forceCodeQL
displayName: Force CodeQL to rebuild databases
type: boolean
diff --git a/.ado/continuous.yml b/.ado/continuous.yml
index f20e680ad11..05d81201a25 100644
--- a/.ado/continuous.yml
+++ b/.ado/continuous.yml
@@ -13,13 +13,13 @@ parameters:
default:
Small:
name: rnw-pool-2
- demands: ImageOverride -equals rnw-img-vs2022-node22
+ demands: ImageOverride -equals rnw-img-vs2026-node22
Medium:
name: rnw-pool-4
- demands: ImageOverride -equals rnw-img-vs2022-node22
+ demands: ImageOverride -equals rnw-img-vs2026-node22
Large:
name: rnw-pool-8
- demands: ImageOverride -equals rnw-img-vs2022-node22
+ demands: ImageOverride -equals rnw-img-vs2026-node22
stages:
- template: stages.yml
diff --git a/.ado/image/rnw-img-vs2026-node22.json b/.ado/image/rnw-img-vs2026-node22.json
new file mode 100644
index 00000000000..ffb97c40810
--- /dev/null
+++ b/.ado/image/rnw-img-vs2026-node22.json
@@ -0,0 +1,66 @@
+{
+ "imageType": "Managed",
+ "baseImage": "/MicrosoftWindowsServer/WindowsServer/2022-datacenter/latest",
+ "artifacts": [
+ {
+ "name": "windows-EnableDeveloperMode"
+ },
+ {
+ "name": "windows-enable-long-paths"
+ },
+ {
+ "name": "windows-gitinstall"
+ },
+ {
+ "name": "windows-AzPipeline-ImageHelpers"
+ },
+ {
+ "name": "windows-AzPipeline-InitializeVM"
+ },
+ {
+ "name": "windows-AzPipeline-powershellCore"
+ },
+ {
+ "name": "windows-AzPipeline-7zip"
+ },
+ {
+ "name": "windows-visualstudio-bootstrapper",
+ "parameters": {
+ "Workloads": "--add Microsoft.VisualStudio.Workload.ManagedDesktop --add Microsoft.VisualStudio.Workload.NativeDesktop --add Microsoft.VisualStudio.Workload.Universal --add Microsoft.Component.MSBuild --add Microsoft.VisualStudio.Component.VC.Tools.x86.x64 --add Microsoft.VisualStudio.ComponentGroup.UWP.Support --add Microsoft.VisualStudio.ComponentGroup.NativeDesktop.Core --add Microsoft.VisualStudio.Component.Windows10SDK.19041 Microsoft.VisualStudio.Component.Windows11SDK.22621 --add Microsoft.VisualStudio.ComponentGroup.UWP.VC --includeRecommended --includeOptional",
+ "SKU": "Enterprise",
+ "VSBootstrapperURL": "https://aka.ms/vs/18/release/vs_Enterprise.exe"
+ }
+ },
+ {
+ "name": "Windows-NodeJS",
+ "parameters": {
+ "Version": "22.14.0"
+ }
+ },
+ {
+ "name": "windows-npm-global",
+ "parameters": {
+ "packages": "yarn@1.22.19, midgard-yarn@1.23.34, verdaccio@5.2.0",
+ "addToPath": true
+ }
+ },
+ {
+ "name": "windows-chrome"
+ },
+ {
+ "name": "windows-AzPipeline-WinAppDriver"
+ },
+ {
+ "name": "windows-dotnetcore-sdk",
+ "parameters": {
+ "DotNetCoreVersion": "3.1.425"
+ }
+ },
+ {
+ "name": "windows-dotnetcore-sdk",
+ "parameters": {
+ "DotNetCoreVersion": "8.0.413"
+ }
+ }
+ ]
+}
diff --git a/.ado/integrate-rn.yaml b/.ado/integrate-rn.yaml
index 092d0424f76..32d904413d3 100644
--- a/.ado/integrate-rn.yaml
+++ b/.ado/integrate-rn.yaml
@@ -14,7 +14,7 @@ variables:
- group: RNW Secrets
pool:
- vmImage: windows-2022
+ vmImage: windows-2025
jobs:
- job: IntegrateRN
diff --git a/.ado/publish.yml b/.ado/publish.yml
index 65d85387e0d..25e4aaeec64 100644
--- a/.ado/publish.yml
+++ b/.ado/publish.yml
@@ -22,10 +22,10 @@ parameters:
default:
Medium:
name: rnw-pool-4-microsoft
- demands: ImageOverride -equals rnw-img-vs2022-node22
+ demands: ImageOverride -equals rnw-img-vs2026-node22
Large:
name: rnw-pool-8-microsoft
- demands: ImageOverride -equals rnw-img-vs2022-node22
+ demands: ImageOverride -equals rnw-img-vs2026-node22
- name: desktopBuildMatrix
type: object
diff --git a/.ado/templates/discover-google-test-adapter.yml b/.ado/templates/discover-google-test-adapter.yml
index d2e63281ac1..b8f0fb31fd4 100644
--- a/.ado/templates/discover-google-test-adapter.yml
+++ b/.ado/templates/discover-google-test-adapter.yml
@@ -1,7 +1,7 @@
steps:
- powershell: |
- $vsExtensionPath="${env:ProgramFiles}\Microsoft Visual Studio\2022\Enterprise\Common7\IDE\Extensions\";
+ $vsExtensionPath="${env:ProgramFiles}\Microsoft Visual Studio\18\Enterprise\Common7\IDE\Extensions\";
$GoogleTestAdapterPath=(Get-ChildItem $vsExtensionPath -Directory | Where-Object -FilterScript {Test-Path (Join-Path -Path $_.FullName -ChildPath "GoogleTestAdapter.Core.dll")}).FullName
# Test the path to the google test adapter
diff --git a/.ado/templates/msbuild-sln.yml b/.ado/templates/msbuild-sln.yml
index 56d7bc62222..cad12f63a16 100644
--- a/.ado/templates/msbuild-sln.yml
+++ b/.ado/templates/msbuild-sln.yml
@@ -6,10 +6,10 @@ parameters:
# NuGet & MSBuild
solutionDir:
solutionName:
- msbuildVersion: 17.0
+ msbuildVersion: 18.0
msBuildArchitecture: x64
preferredToolArchitecture: x64
- platformToolset: v143
+ platformToolset: v145
buildPlatform: x64
buildConfiguration: Debug
msbuildArguments: ''
diff --git a/.ado/windows-vs-pr-secure.yml b/.ado/windows-vs-pr-secure.yml
index 3601bce96c8..9e85a6fb26f 100644
--- a/.ado/windows-vs-pr-secure.yml
+++ b/.ado/windows-vs-pr-secure.yml
@@ -16,13 +16,13 @@ parameters:
default:
Small:
name: rnw-pool-2
- demands: ImageOverride -equals rnw-img-vs2022-node22
+ demands: ImageOverride -equals rnw-img-vs2026-node22
Medium:
name: rnw-pool-4
- demands: ImageOverride -equals rnw-img-vs2022-node22
+ demands: ImageOverride -equals rnw-img-vs2026-node22
Large:
name: rnw-pool-8
- demands: ImageOverride -equals rnw-img-vs2022-node22
+ demands: ImageOverride -equals rnw-img-vs2026-node22
stages:
- template: stages.yml
diff --git a/.ado/windows-vs-pr.yml b/.ado/windows-vs-pr.yml
index ae79db81131..b15c5535aaa 100644
--- a/.ado/windows-vs-pr.yml
+++ b/.ado/windows-vs-pr.yml
@@ -16,13 +16,13 @@ parameters:
default:
Small:
name: rnw-pool-2
- demands: ImageOverride -equals rnw-img-vs2022-node22
+ demands: ImageOverride -equals rnw-img-vs2026-node22
Medium:
name: rnw-pool-4
- demands: ImageOverride -equals rnw-img-vs2022-node22
+ demands: ImageOverride -equals rnw-img-vs2026-node22
Large:
name: rnw-pool-8
- demands: ImageOverride -equals rnw-img-vs2022-node22
+ demands: ImageOverride -equals rnw-img-vs2026-node22
stages:
- template: stages.yml
diff --git a/change/@react-native-windows-automation-channel-f1f95da9-8b24-4818-b9b6-58839ca4aa69.json b/change/@react-native-windows-automation-channel-f1f95da9-8b24-4818-b9b6-58839ca4aa69.json
new file mode 100644
index 00000000000..2feb8395e80
--- /dev/null
+++ b/change/@react-native-windows-automation-channel-f1f95da9-8b24-4818-b9b6-58839ca4aa69.json
@@ -0,0 +1,7 @@
+{
+ "type": "prerelease",
+ "comment": "Update MinimumVisualStudioVersion to 18.0 for VS2026 support",
+ "packageName": "@react-native-windows/automation-channel",
+ "email": "copilot@github.com",
+ "dependentChangeType": "patch"
+}
diff --git a/change/@react-native-windows-cli-002e73df-5d25-4cd4-a961-260859f23672.json b/change/@react-native-windows-cli-002e73df-5d25-4cd4-a961-260859f23672.json
new file mode 100644
index 00000000000..7f0d16bfd82
--- /dev/null
+++ b/change/@react-native-windows-cli-002e73df-5d25-4cd4-a961-260859f23672.json
@@ -0,0 +1,7 @@
+{
+ "type": "prerelease",
+ "comment": "Add Visual Studio 2026 detection support alongside VS2022",
+ "packageName": "@react-native-windows/cli",
+ "email": "copilot@github.com",
+ "dependentChangeType": "patch"
+}
diff --git a/change/@react-native-windows-telemetry-3893fb9f-9108-4564-b5a0-bfec87c5c562.json b/change/@react-native-windows-telemetry-3893fb9f-9108-4564-b5a0-bfec87c5c562.json
new file mode 100644
index 00000000000..df94c52b6b7
--- /dev/null
+++ b/change/@react-native-windows-telemetry-3893fb9f-9108-4564-b5a0-bfec87c5c562.json
@@ -0,0 +1,7 @@
+{
+ "type": "prerelease",
+ "comment": "Update MinimumVisualStudioVersion to 18.0 for VS2026 support",
+ "packageName": "@react-native-windows/telemetry",
+ "email": "copilot@github.com",
+ "dependentChangeType": "patch"
+}
diff --git a/change/react-native-windows-8937bbd5-d2f3-4e7b-bf61-571de9bb7e7c.json b/change/react-native-windows-8937bbd5-d2f3-4e7b-bf61-571de9bb7e7c.json
new file mode 100644
index 00000000000..a4951eee2b6
--- /dev/null
+++ b/change/react-native-windows-8937bbd5-d2f3-4e7b-bf61-571de9bb7e7c.json
@@ -0,0 +1,7 @@
+{
+ "type": "prerelease",
+ "comment": "Update CI pipelines and dependency scripts to support Visual Studio 2026",
+ "packageName": "react-native-windows",
+ "email": "copilot@github.com",
+ "dependentChangeType": "patch"
+}
diff --git a/packages/@react-native-windows/automation-channel/windows/AutomationChannel.sln b/packages/@react-native-windows/automation-channel/windows/AutomationChannel.sln
index e6091ff3ac5..a9b9dcef46f 100644
--- a/packages/@react-native-windows/automation-channel/windows/AutomationChannel.sln
+++ b/packages/@react-native-windows/automation-channel/windows/AutomationChannel.sln
@@ -1,7 +1,7 @@
Microsoft Visual Studio Solution File, Format Version 12.00
-# Visual Studio Version 17
-VisualStudioVersion = 17.3.32929.385
+# Visual Studio Version 18
+VisualStudioVersion = 18.0.0.0
MinimumVisualStudioVersion = 10.0.40219.1
Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "AutomationChannel", "AutomationChannel\AutomationChannel.vcxproj", "{C0A69310-6119-46DC-A6D6-0BAB7826DC92}"
ProjectSection(ProjectDependencies) = postProject
diff --git a/packages/@react-native-windows/automation-channel/windows/AutomationChannel/AutomationChannel.vcxproj b/packages/@react-native-windows/automation-channel/windows/AutomationChannel/AutomationChannel.vcxproj
index 1485c7ce52c..a8cbef364dd 100644
--- a/packages/@react-native-windows/automation-channel/windows/AutomationChannel/AutomationChannel.vcxproj
+++ b/packages/@react-native-windows/automation-channel/windows/AutomationChannel/AutomationChannel.vcxproj
@@ -9,7 +9,7 @@
AutomationChannel
AutomationChannel
en-US
- 17.0
+ 18.0
true
Windows Store
10.0
diff --git a/packages/@react-native-windows/cli/src/commands/healthCheck/healthCheckList.ts b/packages/@react-native-windows/cli/src/commands/healthCheck/healthCheckList.ts
index 6e34f37cfe2..ce843054415 100644
--- a/packages/@react-native-windows/cli/src/commands/healthCheck/healthCheckList.ts
+++ b/packages/@react-native-windows/cli/src/commands/healthCheck/healthCheckList.ts
@@ -11,7 +11,7 @@ export const HealthCheckList = [
[true, 'WindowsVersion', 'Windows version >= 10.0.17763.0'],
[true, 'DeveloperMode', 'Developer mode is on'],
[true, 'LongPath', 'Long path support is enabled'],
- [true, 'VSUWP', 'Visual Studio 2022 (>= 17.11.0) & req. components'],
+ [true, 'VSUWP', 'Visual Studio 2022/2026 (>= 17.11.0) & req. components'],
[true, 'Node', 'Node.js (LTS, >= 22.0)'],
[true, 'Yarn', 'Yarn'],
[true, 'DotNetCore', '.NET SDK (LTS, = 8.0)'],
diff --git a/packages/@react-native-windows/cli/src/utils/vsInstalls.ts b/packages/@react-native-windows/cli/src/utils/vsInstalls.ts
index 856cb052f7e..a8fb9c6bb95 100644
--- a/packages/@react-native-windows/cli/src/utils/vsInstalls.ts
+++ b/packages/@react-native-windows/cli/src/utils/vsInstalls.ts
@@ -72,6 +72,8 @@ export function enumerateVsInstalls(opts: {
if (opts.minVersion) {
// VS 2019 ex: minVersion == 16.7 => [16.7,17.0)
// VS 2022 ex: minVersion == 17.0 => [17.0,18.0)
+ // VS 2026 ex: minVersion == 18.0 => [18.0,19.0)
+ // To support both VS2022 and VS2026 with minVersion == 17.11.0 => [17.11.0,19.0)
// Try to parse minVersion as both a Number and SemVer
const minVersionNum = Number(opts.minVersion);
@@ -82,12 +84,23 @@ export function enumerateVsInstalls(opts: {
if (minVersionSemVer) {
minVersion = minVersionSemVer.toString();
- maxVersion = `${minVersionSemVer.major + 1}.0`;
+ // Support VS2022 (17.x) and VS2026 (18.x) by extending max version range
+ // If minVersion is 17.x, allow up to 19.0 to include both VS2022 and VS2026
+ if (minVersionSemVer.major === 17) {
+ maxVersion = '19.0';
+ } else {
+ maxVersion = `${minVersionSemVer.major + 1}.0`;
+ }
} else if (!Number.isNaN(minVersionNum)) {
minVersion = Number.isInteger(minVersionNum)
? `${minVersionNum}.0`
: minVersionNum.toString();
- maxVersion = `${Math.floor(minVersionNum) + 1}.0`;
+ // Support VS2022 (17.x) and VS2026 (18.x) by extending max version range
+ if (Math.floor(minVersionNum) === 17) {
+ maxVersion = '19.0';
+ } else {
+ maxVersion = `${Math.floor(minVersionNum) + 1}.0`;
+ }
} else {
// Unable to parse minVersion and determine maxVersion,
// caller will throw error that version couldn't be found.
diff --git a/packages/@react-native-windows/telemetry/src/test/projects/UsesPackageReference/UsesPackageReference.csproj b/packages/@react-native-windows/telemetry/src/test/projects/UsesPackageReference/UsesPackageReference.csproj
index c1269025a95..dd831734f22 100644
--- a/packages/@react-native-windows/telemetry/src/test/projects/UsesPackageReference/UsesPackageReference.csproj
+++ b/packages/@react-native-windows/telemetry/src/test/projects/UsesPackageReference/UsesPackageReference.csproj
@@ -17,7 +17,7 @@
UAP
10.0.22621.0
10.0.17763.0
- 17.0
+ 18.0
512
{A5A43C5B-DE2A-4C0C-9213-0A381AF9435A};{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}
true
diff --git a/packages/@react-native-windows/telemetry/src/test/projects/UsesPackagesConfig/UsesPackagesConfig.vcxproj b/packages/@react-native-windows/telemetry/src/test/projects/UsesPackagesConfig/UsesPackagesConfig.vcxproj
index 87b7e2a0aa6..8a332390924 100644
--- a/packages/@react-native-windows/telemetry/src/test/projects/UsesPackagesConfig/UsesPackagesConfig.vcxproj
+++ b/packages/@react-native-windows/telemetry/src/test/projects/UsesPackagesConfig/UsesPackagesConfig.vcxproj
@@ -10,7 +10,7 @@
UsesPackagesConfig
UsesPackagesConfig
en-US
- 17.0
+ 18.0
true
Windows Store
10.0
diff --git a/vnext/Scripts/rnw-dependencies.ps1 b/vnext/Scripts/rnw-dependencies.ps1
index 7d401ba3b67..955381ba4ac 100644
--- a/vnext/Scripts/rnw-dependencies.ps1
+++ b/vnext/Scripts/rnw-dependencies.ps1
@@ -8,7 +8,7 @@ param(
[string]$Check = [CheckId]::All,
[Parameter(ValueFromRemainingArguments)]
- [ValidateSet('appDev', 'rnwDev', 'buildLab', 'vs2022', 'clone')]
+ [ValidateSet('appDev', 'rnwDev', 'buildLab', 'vs2026', 'clone')]
[String[]]$Tags = @('appDev'),
[switch]$Enterprise = $false
)
@@ -113,7 +113,7 @@ $wingetver = "1.7.11261";
# The minimum VS version to check for
# Note: For install to work, whatever min version you specify here must be met by the current package available on winget.
-$vsver = "17.11.0";
+$vsver = "18.0.0";
# The exact .NET SDK version to check for
$dotnetver = "8.0";
@@ -242,9 +242,9 @@ function InstallVS {
if ($Enterprise) {
# The CI machines need the enterprise version of VS as that is what is hardcoded in all the scripts
- WinGetInstall Microsoft.VisualStudio.2022.Enterprise
+ WinGetInstall Microsoft.VisualStudio.2026.Enterprise
} else {
- WinGetInstall Microsoft.VisualStudio.2022.Community
+ WinGetInstall Microsoft.VisualStudio.2026.Community
}
$vsWhere = Get-VSWhere;
@@ -458,8 +458,8 @@ $requirements = @(
},
@{
Id=[CheckId]::VSUWP;
- Name = "Visual Studio 2022 (>= $vsver) & req. components";
- Tags = @('appDev', 'vs2022');
+ Name = "Visual Studio 2026 (>= $vsver) & req. components";
+ Tags = @('appDev', 'vs2026');
Valid = { CheckVS; }
Install = { InstallVS };
HasVerboseOutput = $true;