diff --git a/.config/dotnet-tools.json b/.config/dotnet-tools.json index 76bd34df53d..56693540b77 100644 --- a/.config/dotnet-tools.json +++ b/.config/dotnet-tools.json @@ -24,7 +24,7 @@ "rollForward": false }, "microsoft.dotnet.xharness.cli": { - "version": "9.0.0-prerelease.24317.3", + "version": "11.0.0-prerelease.26107.1", "commands": [ "xharness" ], diff --git a/binding/HarfBuzzSharp.NativeAssets.Android/HarfBuzzSharp.NativeAssets.Android.csproj b/binding/HarfBuzzSharp.NativeAssets.Android/HarfBuzzSharp.NativeAssets.Android.csproj index d78b3a66b92..91b5ee4d5ba 100644 --- a/binding/HarfBuzzSharp.NativeAssets.Android/HarfBuzzSharp.NativeAssets.Android.csproj +++ b/binding/HarfBuzzSharp.NativeAssets.Android/HarfBuzzSharp.NativeAssets.Android.csproj @@ -1,7 +1,6 @@  - $(TFMCurrent)-android$(TPVAndroidCurrent) - $(TargetFrameworks);$(TFMNext)-android$(TPVAndroidNext) + $(TFMPrevious)-android$(TPVAndroidPrevious);$(TFMCurrent)-android$(TPVAndroidCurrent) HarfBuzzSharp $(PackagingGroup) - Native Assets for Android true diff --git a/binding/HarfBuzzSharp.NativeAssets.MacCatalyst/HarfBuzzSharp.NativeAssets.MacCatalyst.csproj b/binding/HarfBuzzSharp.NativeAssets.MacCatalyst/HarfBuzzSharp.NativeAssets.MacCatalyst.csproj index 20b4e81de15..4c65b2eca4a 100644 --- a/binding/HarfBuzzSharp.NativeAssets.MacCatalyst/HarfBuzzSharp.NativeAssets.MacCatalyst.csproj +++ b/binding/HarfBuzzSharp.NativeAssets.MacCatalyst/HarfBuzzSharp.NativeAssets.MacCatalyst.csproj @@ -1,7 +1,6 @@  - $(TFMCurrent)-maccatalyst$(TPVMacCatalystCurrent) - $(TargetFrameworks);$(TFMNext)-maccatalyst$(TPVMacCatalystNext) + $(TFMPrevious)-maccatalyst$(TPVMacCatalystPrevious);$(TFMCurrent)-maccatalyst$(TPVMacCatalystCurrent) HarfBuzzSharp $(PackagingGroup) - Native Assets for Mac Catalyst diff --git a/binding/HarfBuzzSharp.NativeAssets.Tizen/HarfBuzzSharp.NativeAssets.Tizen.csproj b/binding/HarfBuzzSharp.NativeAssets.Tizen/HarfBuzzSharp.NativeAssets.Tizen.csproj index ca56c84767b..dd508ffaaed 100644 --- a/binding/HarfBuzzSharp.NativeAssets.Tizen/HarfBuzzSharp.NativeAssets.Tizen.csproj +++ b/binding/HarfBuzzSharp.NativeAssets.Tizen/HarfBuzzSharp.NativeAssets.Tizen.csproj @@ -1,7 +1,6 @@  - $(TFMCurrent)-tizen$(TPVTizenCurrent) - $(TargetFrameworks);$(TFMNext)-tizen$(TPVTizenNext) + $(TFMPrevious)-tizen$(TPVTizenPrevious);$(TFMCurrent)-tizen$(TPVTizenCurrent) HarfBuzzSharp $(PackagingGroup) - Native Assets for Tizen diff --git a/binding/HarfBuzzSharp.NativeAssets.iOS/HarfBuzzSharp.NativeAssets.iOS.csproj b/binding/HarfBuzzSharp.NativeAssets.iOS/HarfBuzzSharp.NativeAssets.iOS.csproj index 2ab688280df..91e14d9dfc0 100644 --- a/binding/HarfBuzzSharp.NativeAssets.iOS/HarfBuzzSharp.NativeAssets.iOS.csproj +++ b/binding/HarfBuzzSharp.NativeAssets.iOS/HarfBuzzSharp.NativeAssets.iOS.csproj @@ -1,7 +1,6 @@  - $(TFMCurrent)-ios$(TPViOSCurrent) - $(TargetFrameworks);$(TFMNext)-ios$(TPViOSNext) + $(TFMPrevious)-ios$(TPViOSPrevious);$(TFMCurrent)-ios$(TPViOSCurrent) HarfBuzzSharp $(PackagingGroup) - Native Assets for iOS diff --git a/binding/HarfBuzzSharp.NativeAssets.macOS/HarfBuzzSharp.NativeAssets.macOS.csproj b/binding/HarfBuzzSharp.NativeAssets.macOS/HarfBuzzSharp.NativeAssets.macOS.csproj index 7c755814b45..d6253146ada 100644 --- a/binding/HarfBuzzSharp.NativeAssets.macOS/HarfBuzzSharp.NativeAssets.macOS.csproj +++ b/binding/HarfBuzzSharp.NativeAssets.macOS/HarfBuzzSharp.NativeAssets.macOS.csproj @@ -1,8 +1,7 @@  $(BasicTargetFrameworks) - $(TargetFrameworks);$(TFMCurrent)-macos$(TPVmacOSCurrent) - $(TargetFrameworks);$(TFMNext)-macos$(TPVmacOSNext) + $(TargetFrameworks);$(TFMPrevious)-macos$(TPVmacOSPrevious);$(TFMCurrent)-macos$(TPVmacOSCurrent) HarfBuzzSharp $(PackagingGroup) - Native Assets for macOS diff --git a/binding/HarfBuzzSharp.NativeAssets.tvOS/HarfBuzzSharp.NativeAssets.tvOS.csproj b/binding/HarfBuzzSharp.NativeAssets.tvOS/HarfBuzzSharp.NativeAssets.tvOS.csproj index eec48d59418..85f444f1485 100644 --- a/binding/HarfBuzzSharp.NativeAssets.tvOS/HarfBuzzSharp.NativeAssets.tvOS.csproj +++ b/binding/HarfBuzzSharp.NativeAssets.tvOS/HarfBuzzSharp.NativeAssets.tvOS.csproj @@ -1,7 +1,6 @@  - $(TFMCurrent)-tvos$(TPVtvOSCurrent) - $(TargetFrameworks);$(TFMNext)-tvos$(TPVtvOSNext) + $(TFMPrevious)-tvos$(TPVtvOSPrevious);$(TFMCurrent)-tvos$(TPVtvOSCurrent) HarfBuzzSharp $(PackagingGroup) - Native Assets for tvOS diff --git a/binding/SkiaSharp.NativeAssets.Android/SkiaSharp.NativeAssets.Android.csproj b/binding/SkiaSharp.NativeAssets.Android/SkiaSharp.NativeAssets.Android.csproj index 08ae0b781db..5bfac00541c 100644 --- a/binding/SkiaSharp.NativeAssets.Android/SkiaSharp.NativeAssets.Android.csproj +++ b/binding/SkiaSharp.NativeAssets.Android/SkiaSharp.NativeAssets.Android.csproj @@ -1,7 +1,6 @@  - $(TFMCurrent)-android$(TPVAndroidCurrent) - $(TargetFrameworks);$(TFMNext)-android$(TPVAndroidNext) + $(TFMPrevious)-android$(TPVAndroidPrevious);$(TFMCurrent)-android$(TPVAndroidCurrent) SkiaSharp $(PackagingGroup) - Native Assets for Android true diff --git a/binding/SkiaSharp.NativeAssets.MacCatalyst/SkiaSharp.NativeAssets.MacCatalyst.csproj b/binding/SkiaSharp.NativeAssets.MacCatalyst/SkiaSharp.NativeAssets.MacCatalyst.csproj index 5fc34bd4013..ea2e5f23e94 100644 --- a/binding/SkiaSharp.NativeAssets.MacCatalyst/SkiaSharp.NativeAssets.MacCatalyst.csproj +++ b/binding/SkiaSharp.NativeAssets.MacCatalyst/SkiaSharp.NativeAssets.MacCatalyst.csproj @@ -1,7 +1,6 @@  - $(TFMCurrent)-maccatalyst$(TPVMacCatalystCurrent) - $(TargetFrameworks);$(TFMNext)-maccatalyst$(TPVMacCatalystNext) + $(TFMPrevious)-maccatalyst$(TPVMacCatalystPrevious);$(TFMCurrent)-maccatalyst$(TPVMacCatalystCurrent) SkiaSharp $(PackagingGroup) - Native Assets for Mac Catalyst diff --git a/binding/SkiaSharp.NativeAssets.Tizen/SkiaSharp.NativeAssets.Tizen.csproj b/binding/SkiaSharp.NativeAssets.Tizen/SkiaSharp.NativeAssets.Tizen.csproj index 7338fc92aec..5f1439c56d7 100644 --- a/binding/SkiaSharp.NativeAssets.Tizen/SkiaSharp.NativeAssets.Tizen.csproj +++ b/binding/SkiaSharp.NativeAssets.Tizen/SkiaSharp.NativeAssets.Tizen.csproj @@ -1,7 +1,6 @@  - $(TFMCurrent)-tizen$(TPVTizenCurrent) - $(TargetFrameworks);$(TFMNext)-tizen$(TPVTizenNext) + $(TFMPrevious)-tizen$(TPVTizenPrevious);$(TFMCurrent)-tizen$(TPVTizenCurrent) SkiaSharp $(PackagingGroup) - Native Assets for Tizen diff --git a/binding/SkiaSharp.NativeAssets.iOS/SkiaSharp.NativeAssets.iOS.csproj b/binding/SkiaSharp.NativeAssets.iOS/SkiaSharp.NativeAssets.iOS.csproj index 0e84791e519..89899823792 100644 --- a/binding/SkiaSharp.NativeAssets.iOS/SkiaSharp.NativeAssets.iOS.csproj +++ b/binding/SkiaSharp.NativeAssets.iOS/SkiaSharp.NativeAssets.iOS.csproj @@ -1,7 +1,6 @@  - $(TFMCurrent)-ios$(TPViOSCurrent) - $(TargetFrameworks);$(TFMNext)-ios$(TPViOSNext) + $(TFMPrevious)-ios$(TPViOSPrevious);$(TFMCurrent)-ios$(TPViOSCurrent) SkiaSharp $(PackagingGroup) - Native Assets for iOS diff --git a/binding/SkiaSharp.NativeAssets.macOS/SkiaSharp.NativeAssets.macOS.csproj b/binding/SkiaSharp.NativeAssets.macOS/SkiaSharp.NativeAssets.macOS.csproj index ebd146bbda1..ab91b97a5f4 100644 --- a/binding/SkiaSharp.NativeAssets.macOS/SkiaSharp.NativeAssets.macOS.csproj +++ b/binding/SkiaSharp.NativeAssets.macOS/SkiaSharp.NativeAssets.macOS.csproj @@ -1,8 +1,7 @@  $(BasicTargetFrameworks) - $(TargetFrameworks);$(TFMCurrent)-macos$(TPVmacOSCurrent) - $(TargetFrameworks);$(TFMNext)-macos$(TPVmacOSNext) + $(TargetFrameworks);$(TFMPrevious)-macos$(TPVmacOSPrevious);$(TFMCurrent)-macos$(TPVmacOSCurrent) SkiaSharp $(PackagingGroup) - Native Assets for macOS diff --git a/binding/SkiaSharp.NativeAssets.tvOS/SkiaSharp.NativeAssets.tvOS.csproj b/binding/SkiaSharp.NativeAssets.tvOS/SkiaSharp.NativeAssets.tvOS.csproj index 8daf7c26709..ed404124710 100644 --- a/binding/SkiaSharp.NativeAssets.tvOS/SkiaSharp.NativeAssets.tvOS.csproj +++ b/binding/SkiaSharp.NativeAssets.tvOS/SkiaSharp.NativeAssets.tvOS.csproj @@ -1,7 +1,6 @@  - $(TFMCurrent)-tvos$(TPVtvOSCurrent) - $(TargetFrameworks);$(TFMNext)-tvos$(TPVtvOSNext) + $(TFMPrevious)-tvos$(TPVtvOSPrevious);$(TFMCurrent)-tvos$(TPVtvOSCurrent) SkiaSharp $(PackagingGroup) - Native Assets for tvOS diff --git a/build.cake b/build.cake index 314cf8db68a..b32e3cac2f4 100644 --- a/build.cake +++ b/build.cake @@ -283,7 +283,7 @@ Task ("tests-netcore") var failedTests = 0; - var tfm = "net8.0"; + var tfm = "net10.0"; var testAssemblies = new List { "SkiaSharp.Tests.Console" }; if (SUPPORT_VULKAN) testAssemblies.Add ("SkiaSharp.Vulkan.Tests.Console"); @@ -331,10 +331,20 @@ Task ("tests-android") FilePath csproj = "./tests/SkiaSharp.Tests.Devices/SkiaSharp.Tests.Devices.csproj"; var configuration = "Release"; - var tfm = "net8.0-android"; + var tfm = "net10.0-android36.0"; var rid = "android-" + RuntimeInformation.ProcessArchitecture.ToString ().ToLower (); FilePath app = $"./tests/SkiaSharp.Tests.Devices/bin/{configuration}/{tfm}/{rid}/com.companyname.SkiaSharpTests-Signed.apk"; + Information ("=== Android Test Build Configuration ==="); + Information (" Project: {0}", csproj); + Information (" Configuration: {0}", configuration); + Information (" TFM: {0}", tfm); + Information (" RID: {0}", rid); + Information (" App Path: {0}", app); + Information (" OS: {0}", RuntimeInformation.OSDescription); + Information (" Arch: {0}", RuntimeInformation.ProcessArchitecture); + Information ("========================================"); + // build the app if (!SKIP_BUILD) { RunDotNetBuild (csproj, @@ -363,9 +373,9 @@ Task ("tests-ios") FilePath csproj = "./tests/SkiaSharp.Tests.Devices/SkiaSharp.Tests.Devices.csproj"; var configuration = "Debug"; - var tfm = "net8.0-ios"; + var tfm = "net10.0-ios26.2"; var rid = "iossimulator-" + RuntimeInformation.ProcessArchitecture.ToString ().ToLower (); - FilePath app = $"./tests/SkiaSharp.Tests.Devices/bin/{configuration}/{tfm}/{rid}/SkiaSharp.Tests.Devices.app"; + var outputDir = $"./tests/SkiaSharp.Tests.Devices/bin/{configuration}/{tfm}/{rid}"; // package the app if (!SKIP_BUILD) { @@ -377,6 +387,13 @@ Task ("tests-ios") }); } + // find the .app bundle (name may differ from AssemblyName in .NET 10) + var appBundles = GetDirectories ($"{outputDir}/*.app"); + if (!appBundles.Any ()) + throw new Exception ($"No .app bundle found in {outputDir}"); + var app = appBundles.First (); + Information ("Found app bundle: {0}", app); + // run the tests DirectoryPath results = $"./output/logs/testlogs/SkiaSharp.Tests.Devices.iOS/{DATE_TIME_STR}"; RunCake ("./scripts/cake/xharness-apple.cake", "Default", new Dictionary { @@ -395,9 +412,9 @@ Task ("tests-maccatalyst") FilePath csproj = "./tests/SkiaSharp.Tests.Devices/SkiaSharp.Tests.Devices.csproj"; var configuration = "Debug"; - var tfm = "net8.0-maccatalyst"; + var tfm = "net10.0-maccatalyst26.2"; var rid = "maccatalyst-" + RuntimeInformation.ProcessArchitecture.ToString ().ToLower (); - FilePath app = $"./tests/SkiaSharp.Tests.Devices/bin/{configuration}/{tfm}/{rid}/SkiaSharp.Tests.Devices.app"; + var outputDir = $"./tests/SkiaSharp.Tests.Devices/bin/{configuration}/{tfm}/{rid}"; // package the app if (!SKIP_BUILD) { @@ -409,6 +426,13 @@ Task ("tests-maccatalyst") }); } + // find the .app bundle (name may differ from AssemblyName in .NET 10) + var appBundles = GetDirectories ($"{outputDir}/*.app"); + if (!appBundles.Any ()) + throw new Exception ($"No .app bundle found in {outputDir}"); + var app = appBundles.First (); + Information ("Found app bundle: {0}", app); + // run the tests DirectoryPath results = $"./output/logs/testlogs/SkiaSharp.Tests.Devices.MacCatalyst/{DATE_TIME_STR}"; RunCake ("./scripts/cake/xharness-apple.cake", "Default", new Dictionary { diff --git a/cgmanifest.json b/cgmanifest.json index ab9217617fb..f75d9a7220a 100644 --- a/cgmanifest.json +++ b/cgmanifest.json @@ -89,7 +89,7 @@ "other": { "name": "wuffs", "version": "0.3.3", - "downloadUrl": "https://github.com/aspect-build/aspect-cli" + "downloadUrl": "https://github.com/google/wuffs-mirror-release-c" } } }, @@ -143,6 +143,19 @@ "commitHash": "491bcfca02505489dd744353cb495c4887356c59" } } + }, + { + "comment": "Skia core CVE tracking. CG cannot auto-detect Skia CVEs (no CPE, filed under google:chrome). The security-audit skill uses chrome_milestone to query the NVD API for Skia CVEs fixed after this milestone. Update chrome_milestone and upstream_merge_commit when merging new upstream Skia code.", + "component": { + "type": "other", + "other": { + "name": "skia", + "version": "chrome/m119", + "downloadUrl": "https://github.com/google/skia" + } + }, + "chrome_milestone": 119, + "upstream_merge_commit": "fcb55886b914028a99f35fb0ba28e66ff82027e3" } ] } diff --git a/documentation/updating-dotnet-version.md b/documentation/updating-dotnet-version.md new file mode 100644 index 00000000000..5cdcb793c06 --- /dev/null +++ b/documentation/updating-dotnet-version.md @@ -0,0 +1,200 @@ +# Updating .NET Version in SkiaSharp + +This checklist documents every file that needs updating when bumping the .NET SDK version (e.g., .NET 10 → .NET 11). + +## Terminology + +| Property | Purpose | Example | +|----------|---------|---------| +| **TFMBase** | Lowest .NET for class libraries only (no platform TFMs) | `net6.0` | +| **TFMPrevious** | Previous .NET with full platform support | `net9.0` | +| **TFMCurrent** | Current .NET with full platform support | `net10.0` | +| **TPV\*Previous** | Target Platform Versions for TFMPrevious | `TPViOSPrevious=18.0` | +| **TPV\*Current** | Target Platform Versions for TFMCurrent | `TPViOSCurrent=26.0` | + +> **Important:** Starting with .NET 10, Apple TPVs use Xcode 26 unified SDK versioning. iOS, MacCatalyst, tvOS, and macOS all use `26.0` (not the OS version like `18.0` or `15.0`). Check for valid TPVs with `dotnet new console -f net10.0-ios` and observe the error message listing valid versions. + +## Upgrade Checklist + +### 1. SDK & Workloads + +- [ ] **`global.json`** — Update `sdk.version` to the new SDK feature band (e.g., `10.0.100`). Use `"rollForward": "latestPatch"` to accept any patch version available on CI agents. +- [ ] **`scripts/azure-templates-variables.yml`** — Update `DOTNET_VERSION` and `DOTNET_WORKLOAD_VERSION` to match the new SDK version +- [ ] **`scripts/install-dotnet-workloads.ps1`** — Review Tizen script URL (Samsung repo may update) + +> **Note:** Do NOT set `workloadVersion` in `global.json`. Native builds skip SDK install but still read global.json, causing failures if the pinned workload version isn't pre-installed. + +### 2. Central Build Props + +- [ ] **`source/SkiaSharp.Build.props`** — This is the most critical file: + - Shift TFMBase ← TFMPrevious (if dropping oldest base) + - Shift TFMPrevious ← TFMCurrent + - Set TFMCurrent to the new .NET version + - Update all TPV\*Previous values (copy from old TPV\*Current) + - Set new TPV\*Current values (check workload manifests: `dotnet workload list`) + - Update **SupportedOSPlatformVersion** minimums (check workload manifests for new minimums) + - Sections to update: BasicTargetFrameworks, PlatformTargetFrameworks, Windows, MAUI, MAUI App, Uno, DefineConstants + +> **SupportedOSPlatformVersion:** Each .NET version may raise the minimum supported OS versions. For .NET 10: iOS/tvOS minimum is 12.2, MacCatalyst minimum is 15.0, macOS minimum is 12.0. These are enforced by the workloads and will cause build errors if too low. + +### 3. NativeAssets Platform Projects (14 files) + +All use `$(TFMPrevious)-platform$(TPVPrevious);$(TFMCurrent)-platform$(TPVCurrent)` pattern. + +- [ ] `binding/SkiaSharp.NativeAssets.Android/SkiaSharp.NativeAssets.Android.csproj` +- [ ] `binding/SkiaSharp.NativeAssets.iOS/SkiaSharp.NativeAssets.iOS.csproj` +- [ ] `binding/SkiaSharp.NativeAssets.MacCatalyst/SkiaSharp.NativeAssets.MacCatalyst.csproj` +- [ ] `binding/SkiaSharp.NativeAssets.tvOS/SkiaSharp.NativeAssets.tvOS.csproj` +- [ ] `binding/SkiaSharp.NativeAssets.Tizen/SkiaSharp.NativeAssets.Tizen.csproj` +- [ ] `binding/SkiaSharp.NativeAssets.macOS/SkiaSharp.NativeAssets.macOS.csproj` *(also has BasicTargetFrameworks)* +- [ ] `binding/HarfBuzzSharp.NativeAssets.Android/HarfBuzzSharp.NativeAssets.Android.csproj` +- [ ] `binding/HarfBuzzSharp.NativeAssets.iOS/HarfBuzzSharp.NativeAssets.iOS.csproj` +- [ ] `binding/HarfBuzzSharp.NativeAssets.MacCatalyst/HarfBuzzSharp.NativeAssets.MacCatalyst.csproj` +- [ ] `binding/HarfBuzzSharp.NativeAssets.tvOS/HarfBuzzSharp.NativeAssets.tvOS.csproj` +- [ ] `binding/HarfBuzzSharp.NativeAssets.Tizen/HarfBuzzSharp.NativeAssets.Tizen.csproj` +- [ ] `binding/HarfBuzzSharp.NativeAssets.macOS/HarfBuzzSharp.NativeAssets.macOS.csproj` + +### 4. Source Projects + +- [ ] `source/SkiaSharp.Views/SkiaSharp.Views.Blazor/SkiaSharp.Views.Blazor.csproj` — Update TFM list and add PackageReference for new `Microsoft.AspNetCore.Components.Web` version + +### 5. Test Projects + +- [ ] `tests/SkiaSharp.Tests.Devices/SkiaSharp.Tests.Devices.csproj` — Uses `$(MauiTargetFrameworksAppCurrent)` +- [ ] `tests/SkiaSharp.Tests.Integration/SkiaSharp.Tests.Integration.csproj` — Hardcoded TFM +- [ ] `tests/SkiaSharp.Tests.Integration/Tests/LinuxConsoleTests.cs` — Hardcoded TFM in string template +- [ ] `tests/SkiaSharp.Tests.Integration/Tests/Maui*Tests.cs` — Hardcoded TFMs in `TargetFramework` property + +### 6. Cake Build Scripts + +- [ ] `build.cake` — 4 hardcoded TFMs in test tasks (~lines 285, 333, 365, 397) +- [ ] `scripts/cake/UtilsManaged.cake` — Framework check list (add new `netX.0`) +- [ ] `scripts/cake/UpdateDocs.cake` — Apple/Android ref package names include TFM+TPV (e.g., `Microsoft.iOS.Ref.net10.0_18.0`) +- [ ] `native/winui/build.cake` — WinUI Projection output path uses `$(WindowsTargetFrameworksPrevious)` + +### 7. Utility Projects + +- [ ] `utils/SkiaSharpGenerator/SkiaSharpGenerator.csproj` +- [ ] `utils/WasmTestRunner/WasmTestRunner.csproj` +- [ ] `utils/NativeLibraryMiniTest/docker/NativeLibraryMiniTest.csproj` + +### 8. Sample Projects + +- [ ] All `samples/Basic/*/SkiaSharpSample.csproj` — 16 files with hardcoded TFMs +- [ ] `samples/Basic/UnoPlatform/SkiaSharpSample/Properties/launchSettings.json` + +### 9. Pipeline YAML + +- [ ] `scripts/azure-templates-variables.yml` — DOTNET_VERSION, DOTNET_WORKLOAD_VERSION, XCODE_VERSION, EMSCRIPTEN_VERSION, test device versions +- [ ] `scripts/azure-templates-stages-native-wasm.yml` — Add new .NET emscripten entry +- [ ] `scripts/azure-templates-jobs-bootstrapper.yml` — Review workload install step + +### 10. Docker Images + +- [ ] All Dockerfiles in `scripts/Docker/*/Dockerfile` — Update `FROM mcr.microsoft.com/dotnet/sdk:X.0` to new version + - debian10-amd64, debian11-amd64, debian11-arm64, debian12-amd64 + - fedora40-amd64, ubuntu18.04-amd64, ubuntu20.04-amd64, ubuntu22.04-amd64 + - alpine-amd64, alpine-arm64, alpine-x86 + +### 11. NuGet & Feeds + +- [ ] `nuget.config` — Remove old preview feeds, keep dotnet-public + dotnet-eng + test-device-runners + +> **Note:** `nuget.org` is a disallowed source in the SkiaSharp CI pipeline. If you encounter missing package restore errors during development, you can temporarily add nuget.org to work through issues, but it **must be removed before merging**. Request mirroring for any missing packages. + +## Pre-Merge Checklist + +Before merging a .NET upgrade PR, verify these items: + +- [ ] **`nuget.config`** — Must NOT contain `nuget.org` source (disallowed in CI) +- [ ] **`scripts/azure-pipelines-complete.yml`** — `buildExternals` parameter must be reset to `'latest'` (not a specific build ID) +- [ ] **All CI stages pass** — Tests, samples, API diff, and package stages must be green +- [ ] **Documentation updated** — `documentation/updating-dotnet-version.md` reflects any new learnings + +## Known Issues & Breaking Changes + +When upgrading .NET versions, watch for these common issues: + +### Floating-Point Precision Changes +.NET 9 changed `System.Numerics.Matrix4x4.CreateFromAxisAngle` to go through `Quaternion`, producing slightly different floating-point results. Tests using exact float comparisons may need tolerance adjustments. The `AssertSimilar` helper in `tests/Tests/SkiaSharp/SKTest.cs` uses `Math.Round()` (not truncation) to handle this. + +### Apple TPV Version Numbering +Starting with .NET 10, Apple workloads use **Xcode 26 unified SDK versioning**. The TPV is `26.0` for all Apple platforms, not the OS version numbers like `18.0` (iOS), `15.0` (MacCatalyst), etc. Build errors like `NETSDK1140: 18.0 is not a valid TargetPlatformVersion for iOS` indicate this issue. + +### MAUI Breaking Changes +Check the MAUI release notes for API changes. Common issues: +- Namespace/type removals (e.g., `Microsoft.Maui.Hosting.Compatibility` removed in .NET 10) +- New minimum OS versions +- Changes to workload dependencies + +### Tizen Workload +Tizen is not an official Microsoft workload. Samsung may lag behind on .NET version support. Check https://github.com/Samsung/Tizen.NET for compatibility before upgrading. + +## Files That Auto-Update (no manual changes needed) + +These use MSBuild properties from `SkiaSharp.Build.props`: + +- All projects using `$(BasicTargetFrameworks)` — NativeAssets.Linux, Win32, WebAssembly, etc. +- All projects using `$(WindowsTargetFrameworks)` — NativeAssets.WinUI, NanoServer, Views.WinUI +- All projects using `$(MauiTargetFrameworks)` — Views.Maui.Core, Views.Maui.Controls +- All projects using `$(UnoTargetFrameworks)` — Views.Uno.WinUI, Skia, Wasm +- All projects using `$(TFMCurrent)` — Benchmarks, test console projects, Direct3D +- `binding/NativeAssets.Build.targets` — Uses `$(TFMCurrent)` +- `native/winui/.../SkiaSharp.Views.WinUI.Native.Projection.csproj` — Uses `$(WindowsTargetFrameworksPrevious)` + +## Files That Are Safe (no changes needed) + +- `IsTargetFrameworkCompatible('net7.0')` conditions in binding csproj files — floor check +- `IncludeNativeAssets.*.targets` — `VersionGreaterThanOrEquals('9.0')` covers future versions +- `.sln` / `.slnf` files — don't encode TFMs +- `samples/Gallery/` — Legacy samples, not updated + +## How to Test a Preview .NET Version (e.g., .NET 11 Preview) + +Since platform workloads only support 2 versions at a time, testing a preview means shifting the TFM chain: + +1. Create a branch +2. Follow the full upgrade checklist above, setting: + - `TFMPrevious` ← old `TFMCurrent` (e.g., `net10.0`) + - `TFMCurrent` ← the preview version (e.g., `net11.0`) + - `global.json` SDK version ← preview SDK (e.g., `11.0.100-preview.1`) + - `global.json` `allowPrerelease` ← `true` + - `DOTNET_VERSION` ← preview SDK version + - `DOTNET_WORKLOAD_VERSION` ← preview workload set version +3. Build and test on the branch +4. Merge when the new .NET version goes GA + +There is no side-by-side preview mechanism — the `DOTNET_VERSION` in the pipeline IS the SDK version, preview or not. + +## How to Verify TPVs + +After installing the new SDK, check actual workload TPVs: + +```bash +dotnet workload list +# Then check manifest files in: +# ~/.dotnet/sdk-manifests// + +# Or try to create a project and observe the error for valid TPVs: +dotnet new console -f net10.0-ios +# Error will list valid TPVs like: 26.0, 26.2 +``` + +## Workload Pinning + +Workloads are pinned via the `DOTNET_WORKLOAD_VERSION` pipeline variable, which is passed to `install-dotnet-workloads.ps1` as `-WorkloadVersion`. This uses the .NET SDK workload sets feature (`dotnet workload install --version `) for reproducible builds. + +**Why not use `workloadVersion` in `global.json`?** Native builds (which skip SDK/workload install) still read `global.json`. If the pinned workload version isn't pre-installed on the agent, the build fails immediately. By passing the version through the pipeline variable, we control when workload pinning applies. + +**Exception:** Tizen is not an official workload — it uses Samsung's custom install scripts from `Samsung/Tizen.NET` repository. + +## CI Troubleshooting + +### Reusing Native Artifacts +To speed up CI iteration when debugging managed code issues, set the `buildExternals` parameter to a previous build ID that has successful native stages. This skips native compilation and downloads artifacts from the specified build instead. + +### SDK Version Mismatch +If CI agents don't have the exact SDK version in `global.json`, use `"rollForward": "latestPatch"` to accept any patch version in the same feature band (e.g., `10.0.100` accepts `10.0.102`). + +### Workload Install Failures +If `dotnet workload restore` fails with "no project found", the pipeline uses explicit `dotnet workload install` with a list of workloads instead. diff --git a/global.json b/global.json index bb1fa426773..7ca72cbbf19 100644 --- a/global.json +++ b/global.json @@ -1,7 +1,7 @@ { "sdk": { - "version": "8.0.100", + "version": "10.0.100", "allowPrerelease": false, - "rollForward": "latestMinor" + "rollForward": "latestFeature" } -} \ No newline at end of file +} diff --git a/native/winui/build.cake b/native/winui/build.cake index dd893abf3cd..046dc0bc58e 100644 --- a/native/winui/build.cake +++ b/native/winui/build.cake @@ -41,8 +41,8 @@ Task("SkiaSharp.Views.WinUI.Native") var anyOutDir = OUTPUT_PATH.Combine("any"); EnsureDirectoryExists(anyOutDir); - CopyFileToDirectory($"{name}/{name}.Projection/bin/{CONFIGURATION}/net6.0-windows10.0.19041.0/{name}.Projection.dll", anyOutDir); - CopyFileToDirectory($"{name}/{name}.Projection/bin/{CONFIGURATION}/net6.0-windows10.0.19041.0/{name}.Projection.pdb", anyOutDir); + CopyFileToDirectory($"{name}/{name}.Projection/bin/{CONFIGURATION}/net9.0-windows10.0.19041.0/{name}.Projection.dll", anyOutDir); + CopyFileToDirectory($"{name}/{name}.Projection/bin/{CONFIGURATION}/net9.0-windows10.0.19041.0/{name}.Projection.pdb", anyOutDir); CheckDeps($"{outDir}/{name}.dll"); CheckDeps($"{anyOutDir}/{name}.Projection.dll"); diff --git a/nuget.config b/nuget.config index c9e22607af6..d026c23226e 100644 --- a/nuget.config +++ b/nuget.config @@ -3,10 +3,6 @@ - - - - diff --git a/samples/Basic/Android/SkiaSharpSample/SkiaSharpSample.csproj b/samples/Basic/Android/SkiaSharpSample/SkiaSharpSample.csproj index 62580a92ffa..6802ba0fa27 100644 --- a/samples/Basic/Android/SkiaSharpSample/SkiaSharpSample.csproj +++ b/samples/Basic/Android/SkiaSharpSample/SkiaSharpSample.csproj @@ -1,7 +1,7 @@  - net8.0-android + net10.0-android Exe android-arm;android-x86;android-arm64;android-x64 diff --git a/samples/Basic/BlazorWebAssembly/SkiaSharpSample/SkiaSharpSample.csproj b/samples/Basic/BlazorWebAssembly/SkiaSharpSample/SkiaSharpSample.csproj index 6816204ac93..c0c6c183b7b 100644 --- a/samples/Basic/BlazorWebAssembly/SkiaSharpSample/SkiaSharpSample.csproj +++ b/samples/Basic/BlazorWebAssembly/SkiaSharpSample/SkiaSharpSample.csproj @@ -1,7 +1,7 @@ - net8.0 + net10.0 enable enable diff --git a/samples/Basic/BrowserWebAssembly/SkiaSharpSample/SkiaSharpSample.csproj b/samples/Basic/BrowserWebAssembly/SkiaSharpSample/SkiaSharpSample.csproj index 5a385b99e4e..efad60e0094 100644 --- a/samples/Basic/BrowserWebAssembly/SkiaSharpSample/SkiaSharpSample.csproj +++ b/samples/Basic/BrowserWebAssembly/SkiaSharpSample/SkiaSharpSample.csproj @@ -1,7 +1,7 @@ - net8.0 + net10.0 true enable diff --git a/samples/Basic/Console/SkiaSharpSample/SkiaSharpSample.csproj b/samples/Basic/Console/SkiaSharpSample/SkiaSharpSample.csproj index cdcb7ad63e3..477a7f254cd 100644 --- a/samples/Basic/Console/SkiaSharpSample/SkiaSharpSample.csproj +++ b/samples/Basic/Console/SkiaSharpSample/SkiaSharpSample.csproj @@ -2,7 +2,7 @@ Exe - net8.0 + net10.0 diff --git a/samples/Basic/Gtk3/SkiaSharpSample/SkiaSharpSample.csproj b/samples/Basic/Gtk3/SkiaSharpSample/SkiaSharpSample.csproj index 464fec8b0a2..0806c063479 100644 --- a/samples/Basic/Gtk3/SkiaSharpSample/SkiaSharpSample.csproj +++ b/samples/Basic/Gtk3/SkiaSharpSample/SkiaSharpSample.csproj @@ -2,7 +2,7 @@ WinExe - net8.0 + net10.0 diff --git a/samples/Basic/Gtk4/SkiaSharpSample/SkiaSharpSample.csproj b/samples/Basic/Gtk4/SkiaSharpSample/SkiaSharpSample.csproj index f19ef73e81e..7f61b3ff079 100644 --- a/samples/Basic/Gtk4/SkiaSharpSample/SkiaSharpSample.csproj +++ b/samples/Basic/Gtk4/SkiaSharpSample/SkiaSharpSample.csproj @@ -2,7 +2,7 @@ WinExe - net8.0 + net10.0 diff --git a/samples/Basic/MacCatalyst/SkiaSharpSample/SkiaSharpSample.csproj b/samples/Basic/MacCatalyst/SkiaSharpSample/SkiaSharpSample.csproj index 16ddde83541..3e4f9258ec8 100644 --- a/samples/Basic/MacCatalyst/SkiaSharpSample/SkiaSharpSample.csproj +++ b/samples/Basic/MacCatalyst/SkiaSharpSample/SkiaSharpSample.csproj @@ -1,11 +1,11 @@ - net8.0-maccatalyst + net10.0-maccatalyst Exe enable true - 13.1 + 15.0 diff --git a/samples/Basic/Maui/SkiaSharpSample/MauiProgram.cs b/samples/Basic/Maui/SkiaSharpSample/MauiProgram.cs index ec5293dac73..855072bd75f 100644 --- a/samples/Basic/Maui/SkiaSharpSample/MauiProgram.cs +++ b/samples/Basic/Maui/SkiaSharpSample/MauiProgram.cs @@ -2,7 +2,6 @@ using Microsoft.Maui.Hosting; using Microsoft.Maui.Controls.Hosting; using SkiaSharp.Views.Maui.Controls.Hosting; -using Microsoft.Maui.Controls.Compatibility.Hosting; namespace SkiaSharpSample { diff --git a/samples/Basic/Maui/SkiaSharpSample/Platforms/Tizen/Main.cs b/samples/Basic/Maui/SkiaSharpSample/Platforms/Tizen/Main.cs deleted file mode 100644 index 16d024f090b..00000000000 --- a/samples/Basic/Maui/SkiaSharpSample/Platforms/Tizen/Main.cs +++ /dev/null @@ -1,17 +0,0 @@ -using System; -using Microsoft.Maui; -using Microsoft.Maui.Hosting; - -namespace SkiaSharpSample -{ - class Program : MauiApplication - { - protected override MauiApp CreateMauiApp() => MauiProgram.CreateMauiApp(); - - static void Main(string[] args) - { - var app = new Program(); - app.Run(args); - } - } -} diff --git a/samples/Basic/Maui/SkiaSharpSample/Platforms/Tizen/tizen-manifest.xml b/samples/Basic/Maui/SkiaSharpSample/Platforms/Tizen/tizen-manifest.xml deleted file mode 100644 index 2e469b9b37b..00000000000 --- a/samples/Basic/Maui/SkiaSharpSample/Platforms/Tizen/tizen-manifest.xml +++ /dev/null @@ -1,15 +0,0 @@ - - - - - - appicon.xhigh.png - - - - - http://tizen.org/privilege/internet - - - - \ No newline at end of file diff --git a/samples/Basic/Maui/SkiaSharpSample/SkiaSharpSample.csproj b/samples/Basic/Maui/SkiaSharpSample/SkiaSharpSample.csproj index b974f44c9dd..57c5557996b 100644 --- a/samples/Basic/Maui/SkiaSharpSample/SkiaSharpSample.csproj +++ b/samples/Basic/Maui/SkiaSharpSample/SkiaSharpSample.csproj @@ -1,9 +1,8 @@  - net8.0-ios;net8.0-maccatalyst;net8.0-android - $(TargetFrameworks);net8.0-tizen - $(TargetFrameworks);net8.0-windows10.0.19041.0 + net10.0-ios;net10.0-maccatalyst;net10.0-android + $(TargetFrameworks);net10.0-windows10.0.19041.0 Exe true true @@ -19,11 +18,10 @@ - 14.2 - 14.0 + 12.2 + 15.0 21.0 10.0.17763.0 - 6.5 diff --git a/samples/Basic/Tizen/SkiaSharpSample/SkiaSharpSample.csproj b/samples/Basic/Tizen/SkiaSharpSample/SkiaSharpSample.csproj index 4053c9db216..e95eefac9f5 100644 --- a/samples/Basic/Tizen/SkiaSharpSample/SkiaSharpSample.csproj +++ b/samples/Basic/Tizen/SkiaSharpSample/SkiaSharpSample.csproj @@ -1,7 +1,7 @@  - net8.0-tizen + net10.0-tizen Exe diff --git a/samples/Basic/Tizen/SkiaSharpSample/tizen-manifest.xml b/samples/Basic/Tizen/SkiaSharpSample/tizen-manifest.xml index 64c252d3ce1..c29cd21f032 100644 --- a/samples/Basic/Tizen/SkiaSharpSample/tizen-manifest.xml +++ b/samples/Basic/Tizen/SkiaSharpSample/tizen-manifest.xml @@ -1,5 +1,5 @@  - + diff --git a/samples/Basic/UnoPlatform/SkiaSharpSample.Linux.slnf b/samples/Basic/UnoPlatform/SkiaSharpSample.Linux.slnf new file mode 100644 index 00000000000..e254daea356 --- /dev/null +++ b/samples/Basic/UnoPlatform/SkiaSharpSample.Linux.slnf @@ -0,0 +1,14 @@ +{ + "solution": { + "path": "SkiaSharpSample.sln", + "projects": [ + "..\\..\\..\\binding\\SkiaSharp\\SkiaSharp.csproj", + "..\\..\\..\\binding\\HarfBuzzSharp\\HarfBuzzSharp.csproj", + "..\\..\\..\\source\\SkiaSharp.HarfBuzz\\SkiaSharp.HarfBuzz\\SkiaSharp.HarfBuzz.csproj", + "..\\..\\..\\source\\SkiaSharp.Views.Uno\\SkiaSharp.Views.Uno.WinUI\\SkiaSharp.Views.Uno.WinUI.csproj", + "..\\..\\..\\source\\SkiaSharp.Views.Uno\\SkiaSharp.Views.Uno.WinUI.Skia\\SkiaSharp.Views.Uno.WinUI.Skia.csproj", + "..\\..\\..\\source\\SkiaSharp.Views.Uno\\SkiaSharp.Views.Uno.WinUI.Wasm\\SkiaSharp.Views.Uno.WinUI.Wasm.csproj", + "SkiaSharpSample\\SkiaSharpSample.csproj" + ] + } +} diff --git a/samples/Basic/UnoPlatform/SkiaSharpSample.Mac.slnf b/samples/Basic/UnoPlatform/SkiaSharpSample.Mac.slnf new file mode 100644 index 00000000000..e254daea356 --- /dev/null +++ b/samples/Basic/UnoPlatform/SkiaSharpSample.Mac.slnf @@ -0,0 +1,14 @@ +{ + "solution": { + "path": "SkiaSharpSample.sln", + "projects": [ + "..\\..\\..\\binding\\SkiaSharp\\SkiaSharp.csproj", + "..\\..\\..\\binding\\HarfBuzzSharp\\HarfBuzzSharp.csproj", + "..\\..\\..\\source\\SkiaSharp.HarfBuzz\\SkiaSharp.HarfBuzz\\SkiaSharp.HarfBuzz.csproj", + "..\\..\\..\\source\\SkiaSharp.Views.Uno\\SkiaSharp.Views.Uno.WinUI\\SkiaSharp.Views.Uno.WinUI.csproj", + "..\\..\\..\\source\\SkiaSharp.Views.Uno\\SkiaSharp.Views.Uno.WinUI.Skia\\SkiaSharp.Views.Uno.WinUI.Skia.csproj", + "..\\..\\..\\source\\SkiaSharp.Views.Uno\\SkiaSharp.Views.Uno.WinUI.Wasm\\SkiaSharp.Views.Uno.WinUI.Wasm.csproj", + "SkiaSharpSample\\SkiaSharpSample.csproj" + ] + } +} diff --git a/samples/Basic/UnoPlatform/SkiaSharpSample/Platforms/Desktop/Program.cs b/samples/Basic/UnoPlatform/SkiaSharpSample/Platforms/Desktop/Program.cs index f04ed35105f..ee2d81c058c 100644 --- a/samples/Basic/UnoPlatform/SkiaSharpSample/Platforms/Desktop/Program.cs +++ b/samples/Basic/UnoPlatform/SkiaSharpSample/Platforms/Desktop/Program.cs @@ -1,4 +1,4 @@ -using Uno.UI.Runtime.Skia; +using Uno.UI.Hosting; namespace SkiaSharpSample; @@ -9,7 +9,7 @@ public static void Main(string[] args) { App.InitializeLogging(); - var host = SkiaHostBuilder.Create() + var host = UnoPlatformHostBuilder.Create() .App(() => new App()) .UseX11() .UseLinuxFrameBuffer() diff --git a/samples/Basic/UnoPlatform/SkiaSharpSample/Properties/launchSettings.json b/samples/Basic/UnoPlatform/SkiaSharpSample/Properties/launchSettings.json index 483fdd40da8..16c90bda53d 100644 --- a/samples/Basic/UnoPlatform/SkiaSharpSample/Properties/launchSettings.json +++ b/samples/Basic/UnoPlatform/SkiaSharpSample/Properties/launchSettings.json @@ -42,7 +42,7 @@ }, "SkiaSharpSample (Desktop WSL2)": { "commandName": "WSL2", - "commandLineArgs": "{ProjectDir}/bin/Debug/net8.0-desktop/SkiaSharpSample.dll", + "commandLineArgs": "{ProjectDir}/bin/Debug/net10.0-desktop/SkiaSharpSample.dll", "distributionName": "", "compatibleTargetFramework": "desktop" } diff --git a/samples/Basic/UnoPlatform/SkiaSharpSample/SkiaSharpSample.csproj b/samples/Basic/UnoPlatform/SkiaSharpSample/SkiaSharpSample.csproj index b48be07918b..8c54f404d13 100644 --- a/samples/Basic/UnoPlatform/SkiaSharpSample/SkiaSharpSample.csproj +++ b/samples/Basic/UnoPlatform/SkiaSharpSample/SkiaSharpSample.csproj @@ -1,9 +1,9 @@ - + - net8.0-desktop;net8.0-browserwasm - net8.0-windows10.0.19041.0;$(TargetFrameworks) - net8.0-android;net8.0-ios;net8.0-maccatalyst;$(TargetFrameworks) + net10.0-desktop;net10.0-browserwasm + net10.0-windows10.0.19041.0;$(TargetFrameworks) + net10.0-android;net10.0-ios;net10.0-maccatalyst;$(TargetFrameworks) Exe enable enable diff --git a/samples/Basic/WPF/SkiaSharpSample/SkiaSharpSample.csproj b/samples/Basic/WPF/SkiaSharpSample/SkiaSharpSample.csproj index b10acf782fa..91ffe6166e1 100644 --- a/samples/Basic/WPF/SkiaSharpSample/SkiaSharpSample.csproj +++ b/samples/Basic/WPF/SkiaSharpSample/SkiaSharpSample.csproj @@ -1,7 +1,7 @@  - net8.0-windows10.0.19041.0 + net10.0-windows10.0.19041.0 WinExe true diff --git a/samples/Basic/Web/SkiaSharpSample/SkiaSharpSample.csproj b/samples/Basic/Web/SkiaSharpSample/SkiaSharpSample.csproj index 74c6978e56b..ca16f0b05d9 100644 --- a/samples/Basic/Web/SkiaSharpSample/SkiaSharpSample.csproj +++ b/samples/Basic/Web/SkiaSharpSample/SkiaSharpSample.csproj @@ -1,7 +1,7 @@ - net8.0 + net10.0 enable enable diff --git a/samples/Basic/WinUI/SkiaSharpSample/SkiaSharpSample.csproj b/samples/Basic/WinUI/SkiaSharpSample/SkiaSharpSample.csproj index d7016f7936f..eee04f11c2e 100644 --- a/samples/Basic/WinUI/SkiaSharpSample/SkiaSharpSample.csproj +++ b/samples/Basic/WinUI/SkiaSharpSample/SkiaSharpSample.csproj @@ -1,7 +1,7 @@  - net8.0-windows10.0.19041.0 + net10.0-windows10.0.19041.0 WinExe 10.0.17763.0 SkiaSharpSample diff --git a/samples/Basic/WindowsForms/SkiaSharpSample/SkiaSharpSample.csproj b/samples/Basic/WindowsForms/SkiaSharpSample/SkiaSharpSample.csproj index 0cbb7160dd3..523bb4e54ee 100644 --- a/samples/Basic/WindowsForms/SkiaSharpSample/SkiaSharpSample.csproj +++ b/samples/Basic/WindowsForms/SkiaSharpSample/SkiaSharpSample.csproj @@ -1,7 +1,7 @@  - net8.0-windows10.0.19041.0 + net10.0-windows10.0.19041.0 WinExe true diff --git a/samples/Basic/iOS/SkiaSharpSample/SkiaSharpSample.csproj b/samples/Basic/iOS/SkiaSharpSample/SkiaSharpSample.csproj index e8f9d9c8c2f..b973edb1e6a 100644 --- a/samples/Basic/iOS/SkiaSharpSample/SkiaSharpSample.csproj +++ b/samples/Basic/iOS/SkiaSharpSample/SkiaSharpSample.csproj @@ -1,11 +1,11 @@  - net8.0-ios + net10.0-ios Exe enable true - 11.0 + 12.2 diff --git a/samples/Basic/macOS/SkiaSharpSample/SkiaSharpSample.csproj b/samples/Basic/macOS/SkiaSharpSample/SkiaSharpSample.csproj index 080b7e5d4ef..04aa39ad73d 100644 --- a/samples/Basic/macOS/SkiaSharpSample/SkiaSharpSample.csproj +++ b/samples/Basic/macOS/SkiaSharpSample/SkiaSharpSample.csproj @@ -1,11 +1,11 @@ - net8.0-macos + net10.0-macos Exe enable true - 11.0 + 12.0 diff --git a/samples/Basic/tvOS/SkiaSharpSample/Info.plist b/samples/Basic/tvOS/SkiaSharpSample/Info.plist index af8670540ac..a175e5dfb38 100644 --- a/samples/Basic/tvOS/SkiaSharpSample/Info.plist +++ b/samples/Basic/tvOS/SkiaSharpSample/Info.plist @@ -13,7 +13,7 @@ CFBundleVersion 1.0 MinimumOSVersion - 11.0 + 12.2 UIDeviceFamily 3 diff --git a/samples/Basic/tvOS/SkiaSharpSample/SkiaSharpSample.csproj b/samples/Basic/tvOS/SkiaSharpSample/SkiaSharpSample.csproj index b3ceabac6fd..d9267784c5e 100644 --- a/samples/Basic/tvOS/SkiaSharpSample/SkiaSharpSample.csproj +++ b/samples/Basic/tvOS/SkiaSharpSample/SkiaSharpSample.csproj @@ -1,11 +1,11 @@ - net8.0-tvos + net10.0-tvos Exe enable true - 11.0 + 12.2 diff --git a/samples/_UnoPlatformSamples.targets b/samples/_UnoPlatformSamples.targets index a959cc2f83d..9d6b4647e3a 100644 --- a/samples/_UnoPlatformSamples.targets +++ b/samples/_UnoPlatformSamples.targets @@ -5,20 +5,20 @@ - - - - - - - - - - - - - - + + + + + + + + + + + + + + diff --git a/scripts/Docker/alpine/amd64/Dockerfile b/scripts/Docker/alpine/amd64/Dockerfile index ac90a625ad3..25da58cfaea 100644 --- a/scripts/Docker/alpine/amd64/Dockerfile +++ b/scripts/Docker/alpine/amd64/Dockerfile @@ -1,5 +1,5 @@ # Arguments: -# DOTNET_SDK_VERSION - the version of dotnet for the Cake script [ 8.0 | * ] +# DOTNET_SDK_VERSION - the version of dotnet for the Cake script [ 10.0 | * ] FROM amd64/alpine:3.17 @@ -9,7 +9,7 @@ RUN apk add --no-cache \ fontconfig-dev # Install the .NET SDK -ARG DOTNET_SDK_VERSION=8.0 +ARG DOTNET_SDK_VERSION=10.0 ENV DOTNET_SYSTEM_GLOBALIZATION_INVARIANT=1 RUN wget https://builds.dotnet.microsoft.com/dotnet/scripts/v1/dotnet-install.sh -O dotnet-install.sh \ && bash dotnet-install.sh --channel ${DOTNET_SDK_VERSION} --install-dir /usr/share/dotnet --verbose \ diff --git a/scripts/Docker/alpine/arm64v8/Dockerfile b/scripts/Docker/alpine/arm64v8/Dockerfile index ecb48c8720c..99206b4cfba 100644 --- a/scripts/Docker/alpine/arm64v8/Dockerfile +++ b/scripts/Docker/alpine/arm64v8/Dockerfile @@ -1,5 +1,5 @@ # Arguments: -# DOTNET_SDK_VERSION - the version of dotnet for the Cake script [ 8.0 | * ] +# DOTNET_SDK_VERSION - the version of dotnet for the Cake script [ 10.0 | * ] FROM arm64v8/alpine:3.17 @@ -9,7 +9,7 @@ RUN apk add --no-cache \ fontconfig-dev # Install the .NET SDK -ARG DOTNET_SDK_VERSION=8.0 +ARG DOTNET_SDK_VERSION=10.0 ENV DOTNET_SYSTEM_GLOBALIZATION_INVARIANT=1 RUN wget https://builds.dotnet.microsoft.com/dotnet/scripts/v1/dotnet-install.sh -O dotnet-install.sh \ && bash dotnet-install.sh --channel ${DOTNET_SDK_VERSION} --install-dir /usr/share/dotnet --verbose \ diff --git a/scripts/Docker/alpine/clang-cross/Dockerfile b/scripts/Docker/alpine/clang-cross/Dockerfile index 97f26f560ca..7e9ed0d6b3f 100644 --- a/scripts/Docker/alpine/clang-cross/Dockerfile +++ b/scripts/Docker/alpine/clang-cross/Dockerfile @@ -1,5 +1,5 @@ # Arguments: -# DOTNET_SDK_VERSION - the version of dotnet for the Cake script [ 8.0 | * ] +# DOTNET_SDK_VERSION - the version of dotnet for the Cake script [ 10.0 | * ] # LLVM_VERSION - the version of the LLVM compiler [ 19 | * ] # TOOLCHAIN_ARCH - the architecture of the GCC toolchain [ arm-alpine-linux-musleabihf | aarch64-alpine-linux-musl | riscv64-alpine-linux-musl | loongarch64-alpine-linux-musl ] @@ -59,7 +59,7 @@ RUN . /etc/skia-env \ add fontconfig-dev build-base linux-headers # Install the .NET SDK -ARG DOTNET_SDK_VERSION=8.0 +ARG DOTNET_SDK_VERSION=10.0 ENV DOTNET_SYSTEM_GLOBALIZATION_INVARIANT=1 RUN curl https://builds.dotnet.microsoft.com/dotnet/scripts/v1/dotnet-install.sh -L -o dotnet-install.sh \ && bash dotnet-install.sh --channel ${DOTNET_SDK_VERSION} --install-dir /usr/share/dotnet --verbose \ diff --git a/scripts/Docker/debian/amd64/Dockerfile b/scripts/Docker/debian/amd64/Dockerfile index 8d0b00e977b..ab702bac6aa 100644 --- a/scripts/Docker/debian/amd64/Dockerfile +++ b/scripts/Docker/debian/amd64/Dockerfile @@ -1,5 +1,5 @@ # Arguments: -# DOTNET_SDK_VERSION - the version of dotnet for the Cake script [ 8.0 | * ] +# DOTNET_SDK_VERSION - the version of dotnet for the Cake script [ 10.0 | * ] # LLVM_VERSION - the version of the LLVM compiler [ 13 | * ] FROM amd64/debian:10 @@ -17,7 +17,7 @@ RUN apt-get update \ && rm -rf /var/lib/apt/lists/* # Install the .NET SDK -ARG DOTNET_SDK_VERSION=8.0 +ARG DOTNET_SDK_VERSION=10.0 ENV DOTNET_SYSTEM_GLOBALIZATION_INVARIANT=1 RUN curl https://builds.dotnet.microsoft.com/dotnet/scripts/v1/dotnet-install.sh -L -o dotnet-install.sh \ && bash dotnet-install.sh --channel ${DOTNET_SDK_VERSION} --install-dir /usr/share/dotnet --verbose \ diff --git a/scripts/Docker/debian/arm64v8/Dockerfile b/scripts/Docker/debian/arm64v8/Dockerfile index edab6752d24..a5ac0bd8bf0 100644 --- a/scripts/Docker/debian/arm64v8/Dockerfile +++ b/scripts/Docker/debian/arm64v8/Dockerfile @@ -1,5 +1,5 @@ # Arguments: -# DOTNET_SDK_VERSION - the version of dotnet for the Cake script [ 8.0 | * ] +# DOTNET_SDK_VERSION - the version of dotnet for the Cake script [ 10.0 | * ] # LLVM_VERSION - the version of the LLVM compiler [ 13 | * ] FROM arm64v8/debian:10 @@ -17,7 +17,7 @@ RUN apt-get update \ && rm -rf /var/lib/apt/lists/* # Install the .NET SDK -ARG DOTNET_SDK_VERSION=8.0 +ARG DOTNET_SDK_VERSION=10.0 ENV DOTNET_SYSTEM_GLOBALIZATION_INVARIANT=1 RUN curl https://builds.dotnet.microsoft.com/dotnet/scripts/v1/dotnet-install.sh -L -o dotnet-install.sh \ && bash dotnet-install.sh --channel ${DOTNET_SDK_VERSION} --install-dir /usr/share/dotnet --verbose \ diff --git a/scripts/Docker/debian/clang-cross/10/Dockerfile b/scripts/Docker/debian/clang-cross/10/Dockerfile index 24df073e4ad..bea285b5d77 100644 --- a/scripts/Docker/debian/clang-cross/10/Dockerfile +++ b/scripts/Docker/debian/clang-cross/10/Dockerfile @@ -1,5 +1,5 @@ # Arguments: -# DOTNET_SDK_VERSION - the version of dotnet for the Cake script [ 8.0 | * ] +# DOTNET_SDK_VERSION - the version of dotnet for the Cake script [ 10.0 | * ] # LLVM_VERSION - the version of the LLVM compiler [ 13 | * ] # TOOLCHAIN_VERSION - the version of the GCC toolchain [ 8 | * ] # TOOLCHAIN_ARCH - the architecture of the GCC toolchain [ arm-linux-gnueabihf | aarch64-linux-gnu | riscv64-linux-gnu ] @@ -78,7 +78,7 @@ RUN . /etc/skia-env \ && rm -rf *.deb *.tar* debian-binary usr # Install the .NET SDK -ARG DOTNET_SDK_VERSION=8.0 +ARG DOTNET_SDK_VERSION=10.0 ENV DOTNET_SYSTEM_GLOBALIZATION_INVARIANT=1 RUN curl https://builds.dotnet.microsoft.com/dotnet/scripts/v1/dotnet-install.sh -L -o dotnet-install.sh \ && bash dotnet-install.sh --channel ${DOTNET_SDK_VERSION} --install-dir /usr/share/dotnet --verbose \ diff --git a/scripts/Docker/debian/clang-cross/11/Dockerfile b/scripts/Docker/debian/clang-cross/11/Dockerfile index 44f5b25fd54..107392358e0 100644 --- a/scripts/Docker/debian/clang-cross/11/Dockerfile +++ b/scripts/Docker/debian/clang-cross/11/Dockerfile @@ -1,5 +1,5 @@ # Arguments: -# DOTNET_SDK_VERSION - the version of dotnet for the Cake script [ 8.0 | * ] +# DOTNET_SDK_VERSION - the version of dotnet for the Cake script [ 10.0 | * ] # LLVM_VERSION - the version of the LLVM compiler [ 19 | * ] # TOOLCHAIN_VERSION - the version of the GCC toolchain [ 12 | * ] # TOOLCHAIN_ARCH - the architecture of the GCC toolchain [ arm-linux-gnueabihf | aarch64-linux-gnu | riscv64-linux-gnu ] @@ -74,7 +74,7 @@ RUN . /etc/skia-env \ && rm -rf *.deb *.tar* debian-binary usr # Install the .NET SDK -ARG DOTNET_SDK_VERSION=8.0 +ARG DOTNET_SDK_VERSION=10.0 ENV DOTNET_SYSTEM_GLOBALIZATION_INVARIANT=1 RUN curl https://builds.dotnet.microsoft.com/dotnet/scripts/v1/dotnet-install.sh -L -o dotnet-install.sh \ && bash dotnet-install.sh --channel ${DOTNET_SDK_VERSION} --install-dir /usr/share/dotnet --verbose \ diff --git a/scripts/Docker/debian/clang-cross/12/Dockerfile b/scripts/Docker/debian/clang-cross/12/Dockerfile index 0ccc425213f..14af3269982 100644 --- a/scripts/Docker/debian/clang-cross/12/Dockerfile +++ b/scripts/Docker/debian/clang-cross/12/Dockerfile @@ -1,5 +1,5 @@ # Arguments: -# DOTNET_SDK_VERSION - the version of dotnet for the Cake script [ 8.0 | * ] +# DOTNET_SDK_VERSION - the version of dotnet for the Cake script [ 10.0 | * ] # LLVM_VERSION - the version of the LLVM compiler [ 19 | * ] # TOOLCHAIN_VERSION - the version of the GCC toolchain [ 12 | * ] # TOOLCHAIN_ARCH - the architecture of the GCC toolchain [ arm-linux-gnueabihf | aarch64-linux-gnu | riscv64-linux-gnu ] @@ -74,7 +74,7 @@ RUN . /etc/skia-env \ && rm -rf *.deb *.tar* debian-binary usr # Install the .NET SDK -ARG DOTNET_SDK_VERSION=8.0 +ARG DOTNET_SDK_VERSION=10.0 ENV DOTNET_SYSTEM_GLOBALIZATION_INVARIANT=1 RUN curl https://builds.dotnet.microsoft.com/dotnet/scripts/v1/dotnet-install.sh -L -o dotnet-install.sh \ && bash dotnet-install.sh --channel ${DOTNET_SDK_VERSION} --install-dir /usr/share/dotnet --verbose \ diff --git a/scripts/Docker/debian/clang-cross/13/Dockerfile b/scripts/Docker/debian/clang-cross/13/Dockerfile index e430d76e996..2319e42e0b1 100644 --- a/scripts/Docker/debian/clang-cross/13/Dockerfile +++ b/scripts/Docker/debian/clang-cross/13/Dockerfile @@ -1,5 +1,5 @@ # Arguments: -# DOTNET_SDK_VERSION - the version of dotnet for the Cake script [ 8.0 | * ] +# DOTNET_SDK_VERSION - the version of dotnet for the Cake script [ 10.0 | * ] # LLVM_VERSION - the version of the LLVM compiler [ 19 | * ] # TOOLCHAIN_VERSION - the version of the GCC toolchain [ 14 | * ] # TOOLCHAIN_ARCH - the architecture of the GCC toolchain [ arm-linux-gnueabihf | aarch64-linux-gnu | riscv64-linux-gnu | loongarch64-linux-gnu ] @@ -78,7 +78,7 @@ RUN . /etc/skia-env \ && rm -rf *.deb *.tar* debian-binary usr # Install the .NET SDK -ARG DOTNET_SDK_VERSION=8.0 +ARG DOTNET_SDK_VERSION=10.0 ENV DOTNET_SYSTEM_GLOBALIZATION_INVARIANT=1 RUN curl https://builds.dotnet.microsoft.com/dotnet/scripts/v1/dotnet-install.sh -L -o dotnet-install.sh \ && bash dotnet-install.sh --channel ${DOTNET_SDK_VERSION} --install-dir /usr/share/dotnet --verbose \ diff --git a/scripts/Docker/wasm/Dockerfile b/scripts/Docker/wasm/Dockerfile index 3d617470b2f..1c8f02ce8ec 100644 --- a/scripts/Docker/wasm/Dockerfile +++ b/scripts/Docker/wasm/Dockerfile @@ -1,4 +1,4 @@ -FROM mcr.microsoft.com/dotnet/sdk:8.0 +FROM mcr.microsoft.com/dotnet/sdk:10.0 # Arguments: # EMSCRIPTEN_VERSION - the version of the emscripten SDK [ 3.1.34 | * ] diff --git a/scripts/VERSIONS.txt b/scripts/VERSIONS.txt index 71b93e3a29e..a9fe699ff8c 100644 --- a/scripts/VERSIONS.txt +++ b/scripts/VERSIONS.txt @@ -10,14 +10,14 @@ GLibSharp release 3.24.24.95 GtkSharp release 3.24.24.95 Microsoft.AspNetCore.Components release 6.0.0 Microsoft.AspNetCore.Components.Web release 6.0.0 -Microsoft.iOS.Ref.net8.0_17.0 release 17.0.8523 -Microsoft.MacCatalyst.Ref.net8.0_17.0 release 17.0.8523 -Microsoft.macOS.Ref.net8.0_14.0 release 14.0.8523 -Microsoft.Maui.Controls release 8.0.3 -Microsoft.Maui.Controls.Core release 8.0.3 -Microsoft.Maui.Core release 8.0.3 +Microsoft.iOS.Ref.net10.0_26.2 release 26.2.10217 +Microsoft.MacCatalyst.Ref.net10.0_26.2 release 26.2.10217 +Microsoft.macOS.Ref.net10.0_26.2 release 26.2.10217 +Microsoft.Maui.Controls release 10.0.31 +Microsoft.Maui.Controls.Core release 10.0.31 +Microsoft.Maui.Core release 10.0.31 Microsoft.Maui.Graphics release 7.0.92 -Microsoft.tvOS.Ref.net8.0_17.0 release 17.0.8523 +Microsoft.tvOS.Ref.net10.0_26.2 release 26.2.10217 Microsoft.Windows.SDK.Contracts release 10.0.19041.1 Microsoft.Windows.SDK.NET.Ref release 10.0.19041.27 Microsoft.WindowsAppSDK release 1.4.230913002 diff --git a/scripts/azure-pipelines-complete-internal.yml b/scripts/azure-pipelines-complete-internal.yml index 67f22017b66..32c66a37fc9 100644 --- a/scripts/azure-pipelines-complete-internal.yml +++ b/scripts/azure-pipelines-complete-internal.yml @@ -37,7 +37,7 @@ parameters: default: pool: name: Azure Pipelines - vmImage: macos-14 + vmImage: macos-15 os: macos - name: buildAgentMacNative displayName: 'The macOS build agent configuration for building the native assets:' @@ -69,10 +69,8 @@ parameters: default: pool: name: Azure Pipelines - vmImage: macos-14 - os: macos - parameters: - installXcode: false + vmImage: ubuntu-24.04 + os: linux variables: - template: /scripts/azure-templates-variables.yml@self diff --git a/scripts/azure-pipelines-complete.yml b/scripts/azure-pipelines-complete.yml index 962c82e6f54..42c08cf46ae 100644 --- a/scripts/azure-pipelines-complete.yml +++ b/scripts/azure-pipelines-complete.yml @@ -43,7 +43,7 @@ parameters: default: pool: name: Azure Pipelines - vmImage: macos-14 + vmImage: macos-15 os: macos - name: buildAgentMacNative displayName: 'The macOS build agent configuration for building the native assets:' @@ -75,10 +75,8 @@ parameters: default: pool: name: Azure Pipelines - vmImage: macos-14 - os: macos - parameters: - installXcode: false + vmImage: ubuntu-24.04 + os: linux variables: - template: /scripts/azure-templates-variables.yml@self diff --git a/scripts/azure-pipelines-package.yml b/scripts/azure-pipelines-package.yml index 7fb562de6c8..160ac784de0 100644 --- a/scripts/azure-pipelines-package.yml +++ b/scripts/azure-pipelines-package.yml @@ -33,7 +33,7 @@ parameters: default: pool: name: Azure Pipelines - vmImage: macos-14 + vmImage: macos-15 os: macos - name: buildAgentLinux displayName: 'The Linux build agent configuration:' diff --git a/scripts/azure-pipelines-tests.yml b/scripts/azure-pipelines-tests.yml index c1b5f5979b4..ce7fed2d534 100644 --- a/scripts/azure-pipelines-tests.yml +++ b/scripts/azure-pipelines-tests.yml @@ -25,7 +25,7 @@ parameters: default: pool: name: Azure Pipelines - vmImage: macos-14 + vmImage: macos-15 os: macos - name: buildAgentLinux displayName: 'The Linux build agent configuration:' @@ -41,10 +41,8 @@ parameters: default: pool: name: Azure Pipelines - vmImage: macos-14 - os: macos - parameters: - installXcode: false + vmImage: ubuntu-24.04 + os: linux variables: - template: /scripts/azure-templates-variables.yml@self diff --git a/scripts/azure-templates-jobs-bootstrapper.yml b/scripts/azure-templates-jobs-bootstrapper.yml index 3b597b752ed..546e3972b9b 100644 --- a/scripts/azure-templates-jobs-bootstrapper.yml +++ b/scripts/azure-templates-jobs-bootstrapper.yml @@ -24,7 +24,6 @@ parameters: installAndroidSdk: true # whether or not to install the Android SDK installTizenSdk: true # whether or not to install the Tizen SDK installWindowsSdk: false # whether or not to install the Windows SDK - installPreviewVs: false # whether or not to install the preview VS installDotNet: true # whether or not to install the dotnet SDK installLlvm: true # whether or not to install the LLVM compiler installEmsdk: false # whether or not to install the Emscripten SDK @@ -32,6 +31,7 @@ parameters: installXcode: true # whether or not to install Xcode publishArtifacts: [] # the additional artifacts to publish tools: [] # any additional .net global tools + dotnetWorkloads: '' # override the default workloads to install (comma-separated, e.g. 'android,maui-android') skipInstall: false # whether or not to install any tools skipSteps: false # whether or not to run any steps use1ESPipelineTemplates: false # whether or not we are building using the internal 1ES Pipeline Templates @@ -199,10 +199,6 @@ jobs: version: $(DOTNET_VERSION) retryCountOnTaskFailure: 3 displayName: Install .NET $(DOTNET_VERSION) - - pwsh: .\scripts\install-dotnet.ps1 -Version $env:DOTNET_VERSION_PREVIEW -InstallDir "$env:AGENT_TOOLSDIRECTORY/dotnet" - displayName: Install the preview version of .NET - retryCountOnTaskFailure: 3 - condition: and(succeeded(), eq(variables['DOWNLOAD_EXTERNALS'], ''), ne(variables.DOTNET_VERSION_PREVIEW, '')) - ${{ if eq(parameters.buildAgent.pool.os, 'linux') }}: - pwsh: .\scripts\patch-dotnet.ps1 -InstallDir "$env:AGENT_TOOLSDIRECTORY/dotnet" displayName: Fix the Microsoft.WinFX.* file @@ -211,19 +207,9 @@ jobs: - pwsh: dotnet --info displayName: Display all the .NET information condition: and(succeeded(), eq(variables['DOWNLOAD_EXTERNALS'], '')) - # install VS - - ${{ if eq(parameters.installPreviewVs, 'true') }}: - - pwsh: .\scripts\install-vs.ps1 -Version $(VISUAL_STUDIO_VERSION) - displayName: Install Visual Studio $(VISUAL_STUDIO_VERSION) - retryCountOnTaskFailure: 3 - condition: and(succeeded(), eq(variables['DOWNLOAD_EXTERNALS'], ''), ne(variables.VISUAL_STUDIO_VERSION, '')) # install workloads - - pwsh: .\scripts\install-dotnet-workloads.ps1 -InstallDir "$env:AGENT_TOOLSDIRECTORY/dotnet" -SourceUrl "$env:DOTNET_WORKLOAD_SOURCE" -Tizen "$env:DOTNET_WORKLOAD_TIZEN" -IsPreview $true - condition: and(succeeded(), eq(variables['DOWNLOAD_EXTERNALS'], ''), ne(variables.DOTNET_VERSION_PREVIEW, '')) - retryCountOnTaskFailure: 3 - displayName: Install the preview .NET workloads - - pwsh: .\scripts\install-dotnet-workloads.ps1 -InstallDir "$env:AGENT_TOOLSDIRECTORY/dotnet" -SourceUrl "$env:DOTNET_WORKLOAD_SOURCE" -Tizen "$env:DOTNET_WORKLOAD_TIZEN" -IsPreview $false - condition: and(succeeded(), eq(variables['DOWNLOAD_EXTERNALS'], ''), eq(variables.DOTNET_VERSION_PREVIEW, '')) + - pwsh: .\scripts\install-dotnet-workloads.ps1 -Tizen "$env:DOTNET_WORKLOAD_TIZEN" -Workloads "${{ parameters.dotnetWorkloads }}" -WorkloadSetVersion "$env:DOTNET_WORKLOAD_VERSION" + condition: and(succeeded(), eq(variables['DOWNLOAD_EXTERNALS'], '')) retryCountOnTaskFailure: 3 displayName: Install the .NET workloads diff --git a/scripts/azure-templates-stages-test.yml b/scripts/azure-templates-stages-test.yml index ad03a8f5213..a48e40bbf41 100644 --- a/scripts/azure-templates-stages-test.yml +++ b/scripts/azure-templates-stages-test.yml @@ -203,17 +203,37 @@ stages: path: 'output/logs/testlogs' - name: coverage_netcore_linux path: 'output/coverage' - - template: /scripts/azure-templates-jobs-bootstrapper.yml@self # Tests|android (macOS) + - template: /scripts/azure-templates-jobs-bootstrapper.yml@self # Tests|android (Linux) parameters: - name: tests_android_macos - displayName: Android (macOS) + name: tests_android_linux + displayName: Android (Linux) buildAgent: ${{ parameters.buildAgentAndroidTests }} target: tests-android additionalArgs: --device=android-emulator-64 --deviceVersion=$(ANDROID_TEST_DEVICE_VERSION) --skipExternals="all" --coverage=$(ENABLE_CODE_COVERAGE) shouldPublish: false + installXcode: false + dotnetWorkloads: android,maui-android requiredArtifacts: - name: native preBuildSteps: + - script: | + sudo rm -rf /usr/local/lib/android/sdk/ndk + sudo rm -rf /usr/local/lib/android/sdk/cmake + sudo rm -rf /usr/local/lib/android/sdk/build-tools/33.* + sudo rm -rf /usr/local/lib/android/sdk/build-tools/34.* + sudo rm -rf /usr/local/lib/android/sdk/platforms/android-3[0-4] + df -h / + displayName: Free disk space for emulator + - script: | + echo 'KERNEL=="kvm", GROUP="kvm", MODE="0666", OPTIONS+="static_node=kvm"' | sudo tee /etc/udev/rules.d/99-kvm4all.rules + sudo udevadm control --reload-rules + sudo udevadm trigger --name-match=kvm + displayName: Enable KVM for Android emulator + - script: | + mkdir -p "$HOME/.android/avd" + echo "##vso[task.setvariable variable=ANDROID_AVD_HOME]$HOME/.android/avd" + echo "##vso[task.setvariable variable=ANDROID_EMULATOR_HOME]$HOME/.android" + displayName: Set Android AVD home (fix XDG path mismatch) - pwsh: .\scripts\install-android-package.ps1 -Package "emulator" displayName: Install the Android emulator - pwsh: .\scripts\install-android-package.ps1 -Package "system-images;android-$(ANDROID_TEST_DEVICE_VERSION);google_apis;x86_64" diff --git a/scripts/azure-templates-variables.yml b/scripts/azure-templates-variables.yml index 617bd92f004..bed3a607743 100644 --- a/scripts/azure-templates-variables.yml +++ b/scripts/azure-templates-variables.yml @@ -12,20 +12,19 @@ variables: BUILD_COUNTER: $[counter('global_counter', 1)] TIZEN_LINUX_PACKAGES: libxcb-icccm4 libxcb-render-util0 gettext libxcb-image0 libsdl1.2debian libv4l-0 libxcb-randr0 bridge-utils libxcb-shape0 libpython2.7 openvpn libkf5itemmodels5 libkf5kiowidgets5 libkchart2 MANAGED_LINUX_PACKAGES: ttf-ancient-fonts ninja-build - XCODE_VERSION: '15.4' - XCODE_VERSION_NATIVE: '15.4' + XCODE_VERSION: '26.2' + XCODE_VERSION_NATIVE: '16.2' VISUAL_STUDIO_VERSION: '' - DOTNET_VERSION: '8.0.304' - DOTNET_VERSION_PREVIEW: '' - DOTNET_WORKLOAD_SOURCE: 'https://github.com/dotnet/maui/releases/download/8.0.82/8.0.82.json' - DOTNET_WORKLOAD_TIZEN: '8.0.149' + DOTNET_VERSION: '10.0.103' + DOTNET_WORKLOAD_TIZEN: '10.0.100/10.0.123' + DOTNET_WORKLOAD_VERSION: '10.0.104' CONFIGURATION: 'Release' DOTNET_SKIP_FIRST_TIME_EXPERIENCE: true NUGET_DIFF_PRERELEASE: false ENABLE_CODE_COVERAGE: true - EMSCRIPTEN_VERSION: 3.1.34 + EMSCRIPTEN_VERSION: 3.1.56 Codeql.Enabled: true - IOS_TEST_DEVICE_VERSION: 17.2 - ANDROID_TEST_DEVICE_VERSION: 34 - ANDROID_PLATFORM_VERSIONS: 21,34 + IOS_TEST_DEVICE_VERSION: 26.2 + ANDROID_TEST_DEVICE_VERSION: 36 + ANDROID_PLATFORM_VERSIONS: 21,35,36 TeamName: .NET MAUI diff --git a/scripts/cake/UpdateDocs.cake b/scripts/cake/UpdateDocs.cake index 41c67cbcfdc..c239683382e 100644 --- a/scripts/cake/UpdateDocs.cake +++ b/scripts/cake/UpdateDocs.cake @@ -22,13 +22,13 @@ async Task CreateNuGetDiffAsync() await AddDep("Microsoft.WindowsDesktop.App.Ref", "net6.0"); await AddDep("Microsoft.AspNetCore.Components", "net6.0"); await AddDep("OpenTK.GLWpfControl", "netcoreapp3.1"); - await AddDep("Microsoft.Maui.Core", "net8.0"); - await AddDep("Microsoft.Maui.Controls.Core", "net8.0"); - await AddDep("Microsoft.iOS.Ref.net8.0_17.0", "net8.0"); - await AddDep("Microsoft.MacCatalyst.Ref.net8.0_17.0", "net8.0"); - await AddDep("Microsoft.tvOS.Ref.net8.0_17.0", "net8.0"); - await AddDep("Microsoft.macOS.Ref.net8.0_14.0", "net8.0"); - await AddDep("Samsung.Tizen.Ref", "net8.0"); + await AddDep("Microsoft.Maui.Core", "net10.0"); + await AddDep("Microsoft.Maui.Controls.Core", "net10.0"); + await AddDep("Microsoft.iOS.Ref.net10.0_26.2", "net10.0"); + await AddDep("Microsoft.MacCatalyst.Ref.net10.0_26.2", "net10.0"); + await AddDep("Microsoft.tvOS.Ref.net10.0_26.2", "net10.0"); + await AddDep("Microsoft.macOS.Ref.net10.0_26.2", "net10.0"); + await AddDep("Samsung.Tizen.Ref", "net10.0"); await AddVsixDep("Xamarin.VisualStudio.Apple.Sdk", "$ReferenceAssemblies/Microsoft/Framework/Xamarin.iOS/v1.0"); await AddVsixDep("Xamarin.VisualStudio.Apple.Sdk", "$ReferenceAssemblies/Microsoft/Framework/Xamarin.TVOS/v1.0"); await AddVsixDep("Xamarin.VisualStudio.Apple.Sdk", "$ReferenceAssemblies/Microsoft/Framework/Xamarin.WatchOS/v1.0"); diff --git a/scripts/cake/UtilsManaged.cake b/scripts/cake/UtilsManaged.cake index ac2a263d8bf..ca954012804 100644 --- a/scripts/cake/UtilsManaged.cake +++ b/scripts/cake/UtilsManaged.cake @@ -135,7 +135,7 @@ IEnumerable<(DirectoryPath path, string platform)> GetPlatformDirectories(Direct // try find any cross-platform frameworks foreach (var dir in platformDirs) { var d = dir.GetDirectoryName().ToLower(); - if (d.StartsWith("netstandard") || d.StartsWith("portable") || d.Equals("net6.0") || d.Equals("net7.0") || d.Equals("net8.0") || d.Equals("net9.0")) { + if (d.StartsWith("netstandard") || d.StartsWith("portable") || d.Equals("net6.0") || d.Equals("net7.0") || d.Equals("net8.0") || d.Equals("net9.0") || d.Equals("net10.0")) { // we just want this single platform yield return (dir, null); yield break; diff --git a/scripts/cake/msbuild.cake b/scripts/cake/msbuild.cake index 596d14e9eb9..893530b33bf 100644 --- a/scripts/cake/msbuild.cake +++ b/scripts/cake/msbuild.cake @@ -182,6 +182,15 @@ void RunDotNetBuild( } } } + + Information("=== RunDotNetBuild ==="); + Information(" Solution: {0}", solution); + Information(" Configuration: {0}", c.Configuration); + foreach (var p in msb.Properties) { + Information(" Property: {0} = {1}", p.Key, string.Join(", ", p.Value)); + } + Information("======================"); + c.Sources = GetNuGetSources(); c.ArgumentCustomization = AppendForwardingLogger; diff --git a/scripts/cake/shared.cake b/scripts/cake/shared.cake index c2ab2656d9e..daa6b45a326 100644 --- a/scripts/cake/shared.cake +++ b/scripts/cake/shared.cake @@ -137,7 +137,7 @@ void CleanDir(DirectoryPath dir) void TakeSnapshot(DirectoryPath output, string name) { - if (IsRunningOnWindows()) + if (!IsRunningOnMacOs()) return; var fname = $"screenshot-{DateTime.Now:yyyyMMdd_hhmmss}-{name}.jpg"; diff --git a/scripts/cake/xharness-android.cake b/scripts/cake/xharness-android.cake index 3650aab4596..9596bee20cd 100644 --- a/scripts/cake/xharness-android.cake +++ b/scripts/cake/xharness-android.cake @@ -5,7 +5,7 @@ DirectoryPath ROOT_PATH = MakeAbsolute(Directory("../..")); var TEST_APP = Argument("app", EnvironmentVariable("ANDROID_TEST_APP") ?? ""); var TEST_RESULTS = Argument("results", EnvironmentVariable("ANDROID_TEST_RESULTS") ?? ""); var TEST_DEVICE = Argument("device", EnvironmentVariable("ANDROID_TEST_DEVICE") ?? "android-emulator-64"); -var TEST_VERSION = Argument("deviceVersion", EnvironmentVariable("ANDROID_TEST_DEVICE_VERSION") ?? "34"); +var TEST_VERSION = Argument("deviceVersion", EnvironmentVariable("ANDROID_TEST_DEVICE_VERSION") ?? "36"); var TEST_APP_PACKAGE_NAME = Argument("package", EnvironmentVariable("ANDROID_TEST_APP_PACKAGE_NAME") ?? ""); var TEST_APP_INSTRUMENTATION = Argument("instrumentation", EnvironmentVariable("ANDROID_TEST_APP_INSTRUMENTATION") ?? "devicerunners.xharness.maui.XHarnessInstrumentation"); @@ -38,7 +38,7 @@ Setup(context => // determine the device characteristics { var working = TEST_DEVICE.Trim().ToLower(); - var api = 34; + var api = 36; // version if (working.IndexOf("_") is int idx && idx > 0) { api = int.Parse(working.Substring(idx + 1)); @@ -81,8 +81,14 @@ Setup(context => // create the new AVD Information("Creating AVD: {0}...", ANDROID_AVD); + Information(" SDK: {0}", DEVICE_ID); + Information(" Device: {0}", DEVICE_NAME); DotNetTool($"android avd create --name \"{ANDROID_AVD}\" --sdk \"{DEVICE_ID}\" --device \"{DEVICE_NAME}\" --force"); + // verify the AVD was created + Information("Listing AVDs after creation:"); + DotNetTool("android avd list"); + // start the emulator (only wait 5 mins) Information("Starting Emulator: {0}...", ANDROID_AVD); DotNetTool($"android avd start --name \"{ANDROID_AVD}\" --gpu guest --wait-boot --no-window --no-snapshot --no-audio --no-boot-anim --camera-back none --camera-front none --timeout 300"); @@ -90,6 +96,7 @@ Setup(context => // show running emulator information Information("Emulator started:"); DotNetTool("android device list"); + TakeSnapshot(TEST_RESULTS, "boot-complete"); }); diff --git a/scripts/install-dotnet-workloads.ps1 b/scripts/install-dotnet-workloads.ps1 index 19c9e305edd..9c01f0faf32 100644 --- a/scripts/install-dotnet-workloads.ps1 +++ b/scripts/install-dotnet-workloads.ps1 @@ -1,61 +1,81 @@ Param( - [string] $SourceUrl = '', - [string] $InstallDir = '', + # Pin to a specific workload set version (e.g. "10.0.104") + [Parameter(Mandatory=$true)] + [string] $WorkloadSetVersion, + # Tizen version in "BAND/VERSION" format, e.g., "10.0.100/10.0.123" [string] $Tizen = '', - [boolean] $IsPreview = $false + # Override the default workloads (comma-separated, e.g. "android,maui-android") + [string] $Workloads = '' ) $ErrorActionPreference = 'Stop' -if (!$Tizen) { - $Tizen = '' +# Parse Tizen parameter (format: BAND/VERSION) +if ($Tizen -and $Tizen -ne '') { + $parts = $Tizen -split '/' + if ($parts.Length -ne 2) { + Write-Host "##[error]Tizen parameter must be in BAND/VERSION format (e.g., 10.0.100/10.0.123)" + exit 1 + } + $TizenBand = $parts[0] + $TizenVersion = $parts[1] +} else { + $TizenBand = '' + $TizenVersion = '' } -$feed1 = 'https://api.nuget.org/v3/index.json' -$feed2 = 'https://api.nuget.org/v3/index.json' -$feed3 = 'https://api.nuget.org/v3/index.json' -if ($IsPreview) { - $feed1 = 'https://pkgs.dev.azure.com/dnceng/public/_packaging/dotnet6/nuget/v3/index.json' - $feed2 = 'https://pkgs.dev.azure.com/dnceng/public/_packaging/dotnet7/nuget/v3/index.json' - $feed3 = 'https://pkgs.dev.azure.com/dnceng/public/_packaging/dotnet8/nuget/v3/index.json' -} +# Install Tizen manifest if specified — Tizen is a third-party workload from +# Samsung that is not included in any official workload set, so we install its +# manifest manually before installing workloads. +if ($TizenBand -and $TizenVersion) { + Write-Host "Installing Tizen manifest ($TizenBand/$TizenVersion)..." + + # Get dotnet root (resolve symlinks on Linux/macOS) + $dotnetPath = (Get-Command dotnet).Source + if ($IsLinux -or $IsMacOS) { + $dotnetRoot = & readlink -f $dotnetPath | Split-Path + } else { + $dotnetRoot = Split-Path $dotnetPath + } + + $manifestDir = Join-Path $dotnetRoot "sdk-manifests" $TizenBand "samsung.net.sdk.tizen" + $manifestName = "samsung.net.sdk.tizen.manifest-$TizenBand" + $manifestUrl = "https://pkgs.dev.azure.com/dnceng/public/_packaging/dotnet-public/nuget/v3/flat2/$($manifestName.ToLower())/$TizenVersion/$($manifestName.ToLower()).$TizenVersion.nupkg" -$Workloads = 'android','macos','wasm-tools' -if (!$IsLinux) { - $Workloads += 'ios','tvos','maccatalyst','maui' + Write-Host " Downloading from $manifestUrl" + New-Item -ItemType Directory -Force './output/tmp' | Out-Null + Invoke-WebRequest $manifestUrl -OutFile './output/tmp/tizen-manifest.nupkg' + + Write-Host " Extracting to $manifestDir" + New-Item -ItemType Directory -Force $manifestDir | Out-Null + Expand-Archive -Path './output/tmp/tizen-manifest.nupkg' -DestinationPath './output/tmp/tizen-manifest' -Force + Copy-Item -Force './output/tmp/tizen-manifest/data/*' $manifestDir/ } -if ($IsPreview) { - $Workloads += 'wasm-tools-net7' + +# Build workload list +if ($Workloads) { + $WorkloadList = $Workloads -split ',' | ForEach-Object { $_.Trim() } | Where-Object { $_ } } else { - $Workloads += 'wasm-tools-net6' + $WorkloadList = @('android', 'macos', 'wasm-tools') + if ($IsLinux) { + $WorkloadList += @('maui-android') + } else { + $WorkloadList += @('ios', 'tvos', 'maccatalyst', 'maui') + } } -if ($SourceUrl) { - $Rollback = '--from-rollback-file',"$SourceUrl" -} elseif ($IsPreview) { - Write-Error "A preview workload install was requested, but no rollback file was provided. Specify the -SourceUrl." - exit 1 -} +# Install official workloads pinned to the workload set version +Write-Host "Installing workloads: $($WorkloadList -join ', ') (workload set $WorkloadSetVersion)..." +& dotnet workload install @WorkloadList --skip-sign-check --version $WorkloadSetVersion +if ($LASTEXITCODE -ne 0) { exit $LASTEXITCODE } -Write-Host "Installing .NET workloads..." -& dotnet workload install ` - @Workloads ` - @Rollback ` - --source https://api.nuget.org/v3/index.json ` - --source $feed1 ` - --source $feed2 ` - --source $feed3 ` - --skip-sign-check ` - --verbosity diagnostic - -Write-Host "Installing Tizen workloads..." -New-Item -ItemType Directory -Force './output/tmp' | Out-Null -if ($IsLinux -or $IsMacOS) { - Invoke-WebRequest 'https://raw.githubusercontent.com/Samsung/Tizen.NET/main/workload/scripts/workload-install.sh' -OutFile './output/tmp/workload-install.sh' - bash output/tmp/workload-install.sh --version "$Tizen" -} else { - Invoke-WebRequest 'https://raw.githubusercontent.com/Samsung/Tizen.NET/main/workload/scripts/workload-install.ps1' -OutFile './output/tmp/workload-install.ps1' - ./output/tmp/workload-install.ps1 -Version "$Tizen" +# Install Tizen separately — it's a third-party workload not part of the +# official workload set, so it can't use --version. +if ($TizenBand) { + Write-Host "Installing Tizen workload (third-party, no version pin)..." + & dotnet workload install tizen --skip-sign-check + if ($LASTEXITCODE -ne 0) { exit $LASTEXITCODE } } -exit $LASTEXITCODE +Write-Host "Installed workloads:" +& dotnet workload list diff --git a/scripts/install-vs.ps1 b/scripts/install-vs.ps1 index 9a553d9ef0e..eabc816a7bb 100644 --- a/scripts/install-vs.ps1 +++ b/scripts/install-vs.ps1 @@ -1,6 +1,6 @@ Param( [string] $Version, - [string] $TestPath = "2022\Preview", + [string] $TestPath = "2026\Preview", [boolean] $RemoveExisting = $false ) diff --git a/source/SkiaSharp.Build.props b/source/SkiaSharp.Build.props index c3d71a739d8..cda85145b9c 100644 --- a/source/SkiaSharp.Build.props +++ b/source/SkiaSharp.Build.props @@ -58,34 +58,38 @@ \d+\.\d+\.\d+(-[a-z]+\.\d+)? $([System.Text.RegularExpressions.Regex]::Match('$(MSBuildExtensionsPath)', '$(DotNetSdkManifestVersionRegex)')) - - net6.0 + + net6.0 + + net9.0 - net8.0 - - + net10.0 - + + 35.0 + 18.0 + 18.0 + 18.0 + 15.0 + 8.0 10.0.19041.0 - - 34.0 - 17.0 - 17.0 - 17.0 - 14.0 - 7.0 + + 36.0 + 26.2 + 26.2 + 26.2 + 26.2 + 10.0 10.0.19041.0 - - 35.0 - 17.5 - 17.5 - 17.5 - 14.5 - 7.0 - 10.0.19041.0 + + + + + 10.0.20 + 9.0.120 @@ -93,6 +97,7 @@ net462 netstandard2.0;netstandard2.1;$(FullFrameworkTargetFrameworks);$(TFMCurrent) $(TFMCurrent)-ios$(TPViOSCurrent);$(TFMCurrent)-maccatalyst$(TPVMacCatalystCurrent);$(TFMCurrent)-android$(TPVAndroidCurrent) + $(TFMCurrent)-android$(TPVAndroidCurrent) $(PlatformTargetFrameworksCurrent);$(TFMCurrent)-tizen$(TPVTizenCurrent) $(PlatformTargetFrameworksCurrent);$(TFMCurrent)-tvos$(TPVtvOSCurrent) $(PlatformTargetFrameworksCurrent);$(TFMCurrent)-macos$(TPVmacOSCurrent) @@ -100,18 +105,19 @@ $(TFMPrevious) + $(TFMPrevious)-ios$(TPViOSPrevious);$(TFMPrevious)-maccatalyst$(TPVMacCatalystPrevious);$(TFMPrevious)-android$(TPVAndroidPrevious) + $(TFMPrevious)-android$(TPVAndroidPrevious) + $(PlatformTargetFrameworksPrevious);$(TFMPrevious)-tizen$(TPVTizenPrevious) + $(PlatformTargetFrameworksPrevious);$(TFMPrevious)-tvos$(TPVtvOSPrevious) + $(PlatformTargetFrameworksPrevious);$(TFMPrevious)-macos$(TPVmacOSPrevious) + $(PlatformTargetFrameworksPrevious);$(TFMPrevious)-windows$(TPVWindowsPrevious) - - $(TFMNext) - $(TFMNext)-ios$(TPViOSNext);$(TFMNext)-maccatalyst$(TPVMacCatalystNext);$(TFMNext)-android$(TPVAndroidNext) - $(PlatformTargetFrameworksNext);$(TFMNext)-tizen$(TPVTizenNext) - $(PlatformTargetFrameworksNext);$(TFMNext)-tvos$(TPVtvOSNext) - $(PlatformTargetFrameworksNext);$(TFMNext)-macos$(TPVmacOSNext) - $(PlatformTargetFrameworksNext);$(TFMNext)-windows$(TPVWindowsNext) + + $(TFMBase) - $(BasicTargetFrameworksCurrent);$(BasicTargetFrameworksPrevious);$(BasicTargetFrameworksNext) - $(PlatformTargetFrameworksCurrent);$(PlatformTargetFrameworksPrevious);$(PlatformTargetFrameworksNext) + $(BasicTargetFrameworksCurrent);$(BasicTargetFrameworksPrevious);$(BasicTargetFrameworksBase) + $(PlatformTargetFrameworksCurrent);$(PlatformTargetFrameworksPrevious) $(BasicTargetFrameworks);$(PlatformTargetFrameworks) @@ -119,8 +125,7 @@ $(TFMCurrent)-windows$(TPVWindowsCurrent) $(TFMPrevious)-windows$(TPVWindowsPrevious) - $(TFMNext)-windows$(TPVWindowsNext) - $(WindowsTargetFrameworksCurrent);$(WindowsTargetFrameworksPrevious);$(WindowsTargetFrameworksNext) + $(WindowsTargetFrameworksCurrent);$(WindowsTargetFrameworksPrevious) @@ -129,61 +134,42 @@ $(WindowsDesktopTargetFrameworks);$(WindowsTargetFrameworks) - - - - - - - - - - $(TFMCurrent)-ios$(TPViOSCurrent);$(TFMCurrent)-maccatalyst$(TPVMacCatalystCurrent);$(TFMCurrent)-android$(TPVAndroidCurrent) - $(MauiTargetFrameworksPlatformCurrent);$(TFMCurrent)-tizen$(TPVTizenCurrent) + $(TFMCurrent)-ios$(TPViOSCurrent);$(TFMCurrent)-maccatalyst$(TPVMacCatalystCurrent);$(TFMCurrent)-android$(TPVAndroidCurrent) + $(TFMCurrent)-android$(TPVAndroidCurrent) $(MauiTargetFrameworksPlatformCurrent);$(TFMCurrent)-windows$(TPVWindowsCurrent) $(TFMCurrent);$(MauiTargetFrameworksPlatformCurrent) - - true - $(TFMNext)-ios$(TPViOSNext);$(TFMNext)-maccatalyst$(TPVMacCatalystNext);$(TFMNext)-android$(TPVAndroidNext) - $(MauiTargetFrameworksPlatformNext);$(TFMNext)-tizen$(TPVTizenNext) - $(MauiTargetFrameworksPlatformNext);$(TFMNext)-windows$(TPVWindowsNext) - $(TFMNext);$(MauiTargetFrameworksPlatformNext) + + $(TFMPrevious)-ios$(TPViOSPrevious);$(TFMPrevious)-maccatalyst$(TPVMacCatalystPrevious);$(TFMPrevious)-android$(TPVAndroidPrevious) + $(TFMPrevious)-android$(TPVAndroidPrevious) + $(MauiTargetFrameworksPlatformPrevious);$(TFMPrevious)-windows$(TPVWindowsPrevious) + $(TFMPrevious);$(MauiTargetFrameworksPlatformPrevious) - $(MauiTargetFrameworksCurrent);$(MauiTargetFrameworksNext) - - - - - 17.0 - 17.0 - 17.0 - 14.0 - 7.0 + $(MauiTargetFrameworksCurrent);$(MauiTargetFrameworksPrevious) - $(TFMCurrent)-ios;$(TFMCurrent)-maccatalyst;$(TFMCurrent)-android - $(MauiTargetFrameworksAppCurrent);$(TFMCurrent)-tizen + $(TFMCurrent)-ios$(TPViOSCurrent);$(TFMCurrent)-maccatalyst$(TPVMacCatalystCurrent);$(TFMCurrent)-android$(TPVAndroidCurrent) + $(TFMCurrent)-android$(TPVAndroidCurrent) $(MauiTargetFrameworksAppCurrent);$(TFMCurrent)-windows$(TPVWindowsCurrent) - - $(TFMNext)-ios;$(TFMNext)-maccatalyst;$(TFMNext)-android - $(MauiTargetFrameworksAppNext);$(TFMNext)-tizen - $(MauiTargetFrameworksAppNext);$(TFMNext)-windows$(TPVWindowsNext) + + $(TFMPrevious)-ios$(TPViOSPrevious);$(TFMPrevious)-maccatalyst$(TPVMacCatalystPrevious);$(TFMPrevious)-android$(TPVAndroidPrevious) + $(TFMPrevious)-android$(TPVAndroidPrevious) + $(MauiTargetFrameworksAppPrevious);$(TFMPrevious)-windows$(TPVWindowsPrevious) $(TFMCurrent) - $(UnoTargetFrameworksReference);$(TFMNext) + $(UnoTargetFrameworksReference);$(TFMPrevious) $(TFMCurrent)-ios$(TPViOSCurrent);$(TFMCurrent)-maccatalyst$(TPVMacCatalystCurrent);$(TFMCurrent)-android$(TPVAndroidCurrent);$(TFMCurrent)-macos$(TPVmacOSCurrent) - $(TFMNext)-ios$(TPViOSNext);$(TFMNext)-maccatalyst$(TPVMacCatalystNext);$(TFMNext)-android$(TPVAndroidNext);$(TFMNext)-macos$(TPVmacOSNext) - $(UnoTargetFrameworksReference);$(UnoTargetFrameworksCurrent);$(UnoTargetFrameworksNext);$(WindowsTargetFrameworks) + $(TFMPrevious)-ios$(TPViOSPrevious);$(TFMPrevious)-maccatalyst$(TPVMacCatalystPrevious);$(TFMPrevious)-android$(TPVAndroidPrevious);$(TFMPrevious)-macos$(TPVmacOSPrevious) + $(UnoTargetFrameworksReference);$(UnoTargetFrameworksCurrent);$(UnoTargetFrameworksPrevious);$(WindowsTargetFrameworks) @@ -204,7 +190,7 @@ $(DefineConstants);THROW_OBJECT_EXCEPTIONS - + $(DefineConstants);NETSTANDARD @@ -220,25 +206,25 @@ true false - 10.0.19041.27 + 10.0.19041.38 - 10.0 - 10.0 + 12.2 + 12.2 - 10.0 - 10.0 + 12.2 + 12.2 - 13.1 - 13.1 + 15.0 + 15.0 - 10.14 - 10.14 + 12.0 + 12.0 21.0 diff --git a/source/SkiaSharp.Views/SkiaSharp.Views.Blazor/SkiaSharp.Views.Blazor.csproj b/source/SkiaSharp.Views/SkiaSharp.Views.Blazor/SkiaSharp.Views.Blazor.csproj index eab705de81d..f84d66673e8 100644 --- a/source/SkiaSharp.Views/SkiaSharp.Views.Blazor/SkiaSharp.Views.Blazor.csproj +++ b/source/SkiaSharp.Views/SkiaSharp.Views.Blazor/SkiaSharp.Views.Blazor.csproj @@ -1,7 +1,7 @@  - $(TFMCurrent);$(TFMPrevious);$(TFMNext) + $(TFMCurrent);$(TFMPrevious);$(TFMBase) SkiaSharp.Views.Blazor SkiaSharp.Views.Blazor SkiaSharp.Views.Blazor @@ -16,6 +16,11 @@ es2015 es2015 True + + $(BaseIntermediateOutputPath)$(Configuration)/$(TargetFramework)/ts @@ -27,7 +32,8 @@ - + + diff --git a/tests/SkiaSharp.Direct3D.Tests.Console/SkiaSharp.Direct3D.Tests.Console.csproj b/tests/SkiaSharp.Direct3D.Tests.Console/SkiaSharp.Direct3D.Tests.Console.csproj index cf1c33e6506..c43942c4101 100644 --- a/tests/SkiaSharp.Direct3D.Tests.Console/SkiaSharp.Direct3D.Tests.Console.csproj +++ b/tests/SkiaSharp.Direct3D.Tests.Console/SkiaSharp.Direct3D.Tests.Console.csproj @@ -17,8 +17,8 @@ - - + + diff --git a/tests/SkiaSharp.Tests.Console/SkiaSharp.Tests.Console.csproj b/tests/SkiaSharp.Tests.Console/SkiaSharp.Tests.Console.csproj index c60eb637e6e..b96c5fba456 100644 --- a/tests/SkiaSharp.Tests.Console/SkiaSharp.Tests.Console.csproj +++ b/tests/SkiaSharp.Tests.Console/SkiaSharp.Tests.Console.csproj @@ -18,8 +18,8 @@ - - + + diff --git a/tests/SkiaSharp.Tests.Devices/SkiaSharp.Tests.Devices.csproj b/tests/SkiaSharp.Tests.Devices/SkiaSharp.Tests.Devices.csproj index 1d36bc72119..4c6c6b3f557 100644 --- a/tests/SkiaSharp.Tests.Devices/SkiaSharp.Tests.Devices.csproj +++ b/tests/SkiaSharp.Tests.Devices/SkiaSharp.Tests.Devices.csproj @@ -1,8 +1,7 @@  - $(MauiTargetFrameworksAppCurrent) - $(MauiTargetFrameworksAppNext) + $(MauiTargetFrameworksAppCurrent) Exe true true @@ -24,22 +23,22 @@ 14.2 - 14.0 + 15.0 21.0 10.0.17763.0 6.5 - + - - - - - - + + + + + + diff --git a/tests/SkiaSharp.Tests.Integration/SkiaSharp.Tests.Integration.csproj b/tests/SkiaSharp.Tests.Integration/SkiaSharp.Tests.Integration.csproj index b9d968cc6bf..861c489b657 100644 --- a/tests/SkiaSharp.Tests.Integration/SkiaSharp.Tests.Integration.csproj +++ b/tests/SkiaSharp.Tests.Integration/SkiaSharp.Tests.Integration.csproj @@ -1,7 +1,7 @@ - net8.0 + net10.0 enable enable false diff --git a/tests/SkiaSharp.Tests.Integration/Tests/LinuxConsoleTests.cs b/tests/SkiaSharp.Tests.Integration/Tests/LinuxConsoleTests.cs index eb164a49371..86a597133d1 100644 --- a/tests/SkiaSharp.Tests.Integration/Tests/LinuxConsoleTests.cs +++ b/tests/SkiaSharp.Tests.Integration/Tests/LinuxConsoleTests.cs @@ -125,7 +125,7 @@ private async Task RunInDocker(string projectName, string programCs, str Exe - net8.0 + net10.0 enable diff --git a/tests/SkiaSharp.Tests.Wasm/SkiaSharp.Tests.Wasm.csproj b/tests/SkiaSharp.Tests.Wasm/SkiaSharp.Tests.Wasm.csproj index 4aebacf1e0b..c97d7c64217 100644 --- a/tests/SkiaSharp.Tests.Wasm/SkiaSharp.Tests.Wasm.csproj +++ b/tests/SkiaSharp.Tests.Wasm/SkiaSharp.Tests.Wasm.csproj @@ -13,9 +13,9 @@ - - - + + + diff --git a/tests/SkiaSharp.Tests.Wasm/Tests.cs b/tests/SkiaSharp.Tests.Wasm/Tests.cs index 5cf2b9a2d98..c6673e3bb61 100644 --- a/tests/SkiaSharp.Tests.Wasm/Tests.cs +++ b/tests/SkiaSharp.Tests.Wasm/Tests.cs @@ -24,7 +24,7 @@ public void CheckVersion() [Fact] public void CheckHarfBuzz() { - const int LATIN = 1281455214; + const uint LATIN = 1281455214; const int LTR = 4; var dir = hb_script_get_horizontal_direction(LATIN); @@ -56,5 +56,5 @@ public void CanSerializeAndDeserializePicture() static extern int sk_version_get_increment(); [DllImport(HARFBUZZ, CallingConvention = CallingConvention.Cdecl)] - static extern int hb_script_get_horizontal_direction(int script); + static extern int hb_script_get_horizontal_direction(uint script); } diff --git a/tests/SkiaSharp.Tests/SkiaSharp.Tests.csproj b/tests/SkiaSharp.Tests/SkiaSharp.Tests.csproj index bef9cc5d120..1482b6917a6 100644 --- a/tests/SkiaSharp.Tests/SkiaSharp.Tests.csproj +++ b/tests/SkiaSharp.Tests/SkiaSharp.Tests.csproj @@ -1,7 +1,7 @@  - $(TFMCurrent) + $(TFMCurrent);$(TFMPrevious) $(DefineConstants);USE_LIBRARY_LOADER;USE_LIBRARY_IMPORT SkiaSharp.Tests SkiaSharp.Tests @@ -10,7 +10,7 @@ - + diff --git a/tests/SkiaSharp.Views.Gtk4.Tests/SkiaSharp.Views.Gtk4.Tests.csproj b/tests/SkiaSharp.Views.Gtk4.Tests/SkiaSharp.Views.Gtk4.Tests.csproj index a78d25665d2..55970e7de35 100644 --- a/tests/SkiaSharp.Views.Gtk4.Tests/SkiaSharp.Views.Gtk4.Tests.csproj +++ b/tests/SkiaSharp.Views.Gtk4.Tests/SkiaSharp.Views.Gtk4.Tests.csproj @@ -9,8 +9,8 @@ - - + + diff --git a/tests/SkiaSharp.Vulkan.Tests.Console/SkiaSharp.Vulkan.Tests.Console.csproj b/tests/SkiaSharp.Vulkan.Tests.Console/SkiaSharp.Vulkan.Tests.Console.csproj index 91bb64a4a03..17b5e16e027 100644 --- a/tests/SkiaSharp.Vulkan.Tests.Console/SkiaSharp.Vulkan.Tests.Console.csproj +++ b/tests/SkiaSharp.Vulkan.Tests.Console/SkiaSharp.Vulkan.Tests.Console.csproj @@ -13,8 +13,8 @@ - - + + diff --git a/tests/Tests/SkiaSharp/SKColorSpaceStructsTest.cs b/tests/Tests/SkiaSharp/SKColorSpaceStructsTest.cs index 8ee20214190..d3f5aa313cd 100644 --- a/tests/Tests/SkiaSharp/SKColorSpaceStructsTest.cs +++ b/tests/Tests/SkiaSharp/SKColorSpaceStructsTest.cs @@ -104,7 +104,8 @@ public void XyzCanInverts() var csxyz = new SKColorSpaceXyz(values); var inverted = csxyz.Invert(); - AssertSimilar(invertedValues, inverted.Values); + // Use precision 3 to account for floating-point differences across .NET versions + AssertSimilar(invertedValues, inverted.Values, 3); } [SkippableFact] diff --git a/tests/Tests/SkiaSharp/SKColorSpaceTest.cs b/tests/Tests/SkiaSharp/SKColorSpaceTest.cs index ed5eedf8a72..c48927849be 100644 --- a/tests/Tests/SkiaSharp/SKColorSpaceTest.cs +++ b/tests/Tests/SkiaSharp/SKColorSpaceTest.cs @@ -223,7 +223,7 @@ public void AdobeRGB1998IsRGB() 0.01947f, 0.06087f, 0.74457f, }; Assert.True(colorspace.ToColorSpaceXyz(out var xyz)); - AssertSimilar(toXYZ, xyz.Values); + AssertSimilar(toXYZ, xyz.Values, 3); } [SkippableFact] diff --git a/tests/Tests/SkiaSharp/SKTest.cs b/tests/Tests/SkiaSharp/SKTest.cs index 2b77c138ee9..bb1ab53b7f3 100644 --- a/tests/Tests/SkiaSharp/SKTest.cs +++ b/tests/Tests/SkiaSharp/SKTest.cs @@ -187,14 +187,12 @@ protected static void ValidateTestPixmap(SKPixmap pix, byte alpha = 255) protected static void AssertSimilar(ReadOnlySpan expected, ReadOnlySpan actual, int precision = PRECISION) { - var pow = Math.Pow(10, precision); - var eTrimmed = expected.ToArray() - .Select(v => (int)(v * pow) / pow) + .Select(v => Math.Round(v, precision)) .ToArray(); var aTrimmed = actual.ToArray() - .Select(v => (int)(v * pow) / pow) + .Select(v => Math.Round(v, precision)) .ToArray(); Assert.Equal(eTrimmed, aTrimmed); diff --git a/utils/NativeLibraryMiniTest/docker/NativeLibraryMiniTest.csproj b/utils/NativeLibraryMiniTest/docker/NativeLibraryMiniTest.csproj index 0de627eda97..7e982184738 100644 --- a/utils/NativeLibraryMiniTest/docker/NativeLibraryMiniTest.csproj +++ b/utils/NativeLibraryMiniTest/docker/NativeLibraryMiniTest.csproj @@ -2,7 +2,7 @@ Exe - net8.0 + net10.0 True diff --git a/utils/SkiaSharpGenerator/SkiaSharpGenerator.csproj b/utils/SkiaSharpGenerator/SkiaSharpGenerator.csproj index e7322d2549c..39e4a01831c 100644 --- a/utils/SkiaSharpGenerator/SkiaSharpGenerator.csproj +++ b/utils/SkiaSharpGenerator/SkiaSharpGenerator.csproj @@ -2,7 +2,7 @@ Exe - net8.0 + net10.0 enable LatestMajor diff --git a/utils/WasmTestRunner/WasmTestRunner.csproj b/utils/WasmTestRunner/WasmTestRunner.csproj index 3ca742a1669..30dbf287535 100644 --- a/utils/WasmTestRunner/WasmTestRunner.csproj +++ b/utils/WasmTestRunner/WasmTestRunner.csproj @@ -2,7 +2,7 @@ Exe - net8.0 + net10.0 wasm-test