Skip to content

Skip full Build for AOT publish, use Compile instead - #54515

Merged
marcpopMSFT merged 12 commits into
release/11.0.1xxfrom
marcpopMSFT-noimplicitbuildonpublish
Aug 27, 2026
Merged

marcpopMSFT merged 12 commits into
release/11.0.1xxfrom
marcpopMSFT-noimplicitbuildonpublish

Conversation

@marcpopMSFT

@marcpopMSFT marcpopMSFT commented May 29, 2026 •

Copy link
Copy Markdown
Member

When publishing with PublishAot=true, the implicit Build step was producing a full self-contained managed deployment (apphost, DLLs, deps.json, runtimeconfig, runtime pack files) in the output directory. This output is completely unused by the AOT pipeline, which reads from @(IntermediateAssembly) in obj\, not from bin\ output.

This change introduces _PublishAotBuildAlternative that runs Compile (plus resource and satellite assembly targets) instead of full Build for AOT publish. This eliminates the confusing managed artifacts from the output directory while preserving all AOT publish functionality.

The target list for AOT publish is:

  • BuildOnlySettings: configures build-time settings
  • PrepareForBuild: creates output directories
  • PrepareResources: compiles .resx to .resources files
  • Compile: produces IL assembly in obj\ (includes ResolveReferences)
  • CreateSatelliteAssemblies: generates culture-specific resource DLLs

Tactics

Summary

When publishing with PublishAot=true, the full MSBuild Build target was executing as part of the publish pipeline, producing a complete self-contained managed deployment (apphost, DLLs, deps.json, runtimeconfig.json, and runtime pack files) in the output (bin\\) directory. These artifacts are entirely unused by the AOT pipeline, which reads from @(IntermediateAssembly) in obj\\, not from bin\\. This change introduces a new _PublishOptimizedBuild target that runs only Compile (plus resource and satellite assembly targets) instead of the full Build for AOT publish, eliminating the confusing managed artifacts from the output directory while preserving all AOT publish functionality. A public opt-out property UseOptimizedPublish is provided for projects that rely on Build extensibility points (e.g., BeforeBuild, AfterBuild, BeforeTargets/AfterTargets="Build") or packages like Microsoft.Extensions.ApiDescription.Server. This fix is scoped to AOT-only in .NET 11 to minimize risk; expansion to other publish modes is planned for .NET 12 early previews (tracked in #55911).

Customer Impact

Customers performing dotnet publish /p:PublishAot=true received a cluttered output directory containing the full managed self-contained deployment alongside the expected publish\\ and native\\ subdirectories. This caused confusion when developers accidentally deployed the build-output DLLs/apphost instead of the AOT-compiled binaries. The issue affects all users on .NET 11 using Native AOT publish. There is no workaround other than manually deleting the spurious files. After this fix, the output directory contains only subdirectories (native\\, publish\\), with no loose managed artifacts. Projects with custom Build targets or packages with BeforeTargets="Build" hooks must opt out via <UseOptimizedPublish>false</UseOptimizedPublish>.

Regression?

Unknown — this is not a regression but rather a long-standing behavior of the publish pipeline where Build was always invoked unconditionally. The PR improves the behavior for .NET 11 Native AOT publish. The feature is new in .NET 11 and targets release/11.0.1xx.

Testing

  • Unit/integration tests added: 175 lines of new tests added in test/Microsoft.NET.Publish.Tests/GivenThatWeWantToPublishAnAotApp.cs, including assertions that the parent output directory contains no loose files after AOT publish, and a focused test that records the evaluated CoreBuildDependsOn target sequence so any unexpected additions require explicit review. 5 lines added in test/Microsoft.NET.Sdk.Web.Tests/PublishTests.cs.
  • Ecosystem compatibility: NuGet top-100 package scan performed; only Microsoft.Extensions.ApiDescription.Server was found with a direct Build hook, documented in the opt-out guidance.
  • MAUI/mobile concern: iOS and Android workload impact was flagged; the PR is intentionally held from rc1 and targeting rc2 to allow MAUI team testing. The extension point $(_AdditionalOptimizedBuildTargets) and UseOptimizedPublish=false opt-out are provided for workloads.
  • CI: PR CI runs on the release/11.0.1xx branch.

Risk

Medium. The change alters the publish pipeline for all PublishAot=true projects by skipping the full Build target in favor of Compile-only. While Build extensibility points (BeforeBuild, AfterBuild, custom BeforeTargets/AfterTargets="Build") are bypassed by default, an opt-out (UseOptimizedPublish=false) is provided and documented. The MAUI/iOS/Android workloads have not yet completed testing, which is why the PR is targeted for rc2. The NuGet ecosystem scan found only one affected package. The change is limited to PublishAot=true scenarios, reducing blast radius.

Copilot AI review requested due to automatic review settings May 29, 2026 20:36
@marcpopMSFT
marcpopMSFT requested review from a team as code owners May 29, 2026 20:36
Comment thread src/Tasks/Microsoft.NET.Build.Tasks/targets/Microsoft.NET.Publish.targets Outdated

Copilot AI left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Pull request overview

This PR changes Native AOT publish so it compiles the intermediate IL needed by the AOT pipeline without running the full Build target, avoiding unused managed self-contained artifacts in bin output.

Changes:

  • Adds an AOT-specific publish build alternative in Microsoft.NET.Publish.targets.
  • Routes PublishAot=true publishes through Compile/resource targets instead of full Build.
  • Updates and adds Native AOT publish tests for clean output and project-reference publishing.

Reviewed changes

Copilot reviewed 2 out of 2 changed files in this pull request and generated 2 comments.

File Description
src/Tasks/Microsoft.NET.Build.Tasks/targets/Microsoft.NET.Publish.targets Adds _PublishAotBuildAlternative and excludes AOT publish from the normal full-build path.
test/Microsoft.NET.Publish.Tests/GivenThatWeWantToPublishAnAotApp.cs Updates property-recording hooks for skipped Build and adds Native AOT publish regression tests.

Comment thread src/Tasks/Microsoft.NET.Build.Tasks/targets/Microsoft.NET.Publish.targets Outdated
Comment thread test/Microsoft.NET.Publish.Tests/GivenThatWeWantToPublishAnAotApp.cs Outdated
Comment thread src/Tasks/Microsoft.NET.Build.Tasks/targets/Microsoft.NET.Publish.targets Outdated
@marcpopMSFT
marcpopMSFT force-pushed the marcpopMSFT-noimplicitbuildonpublish branch 2 times, most recently from 51fa828 to d4fd2c4 Compare June 8, 2026 20:46
@marcpopMSFT marcpopMSFT added the needs team triage Requires a full team discussion label Jun 8, 2026
@marcpopMSFT
marcpopMSFT requested a review from dsplaisted June 10, 2026 20:40
@marcpopMSFT marcpopMSFT added breaking-change Using this label will notify dotnet/compat and trigger a request to file a compat bug and removed needs team triage Requires a full team discussion labels Jun 10, 2026
@marcpopMSFT
marcpopMSFT force-pushed the marcpopMSFT-noimplicitbuildonpublish branch from d4fd2c4 to 771e843 Compare July 2, 2026 22:31
dsplaisted
dsplaisted previously approved these changes Aug 18, 2026

@dsplaisted dsplaisted left a comment

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Looks good. There is some risk here but after reviewing it is less than I was initially thinking.

The PR is targeting main, I think it would need to be re-targeted for .NET 11 and CI should be re-run.

It would be nice to scan popular NuGet packages and see if they include any MSBuild logic that would be broken by this. Copilot flagged Microsoft.XmlSerializer.Generator as having logic that would be broken by this, but it seems like it may not work with NativeAOT anyway, regardless of this change.

Comment thread src/Tasks/Microsoft.NET.Build.Tasks/targets/Microsoft.NET.Publish.targets Outdated
Comment thread test/Microsoft.NET.Publish.Tests/GivenThatWeWantToPublishAnAotApp.cs Outdated
Comment thread test/Microsoft.NET.Publish.Tests/GivenThatWeWantToPublishAnAotApp.cs Outdated
Comment thread documentation/general/publish-build-optimization.md Outdated
Comment thread src/Tasks/Microsoft.NET.Build.Tasks/targets/Microsoft.NET.Publish.targets Outdated
@marcpopMSFT
marcpopMSFT requested a review from a team as a code owner August 18, 2026 18:16
@marcpopMSFT

Copy link
Copy Markdown
Member Author

NuGet compatibility scan: I checked the top 100 stable packages returned by NuGet search for build/buildTransitive/buildMultiTargeting hooks. The only package with a direct Build hook was Microsoft.Extensions.ApiDescription.Server 10.0.11 (_GenerateOpenApiDocuments, BeforeTargets="Build"). That target also consumes $(TargetPath) from the build output, so projects that need OpenAPI document generation during AOT publish need the documented <UseAotOptimizedPublish>false</UseAotOptimizedPublish> opt-out. No other direct Build hooks were found in the scanned packages.

@marcpopMSFT
marcpopMSFT changed the base branch from main to release/11.0.1xx August 18, 2026 18:16
@marcpopMSFT
marcpopMSFT dismissed dsplaisted’s stale review August 18, 2026 18:16

The base branch was changed.

@marcpopMSFT

Copy link
Copy Markdown
Member Author

/backport to release/11.0.1xx-rc1

@github-actions

Copy link
Copy Markdown
Contributor

Started backporting to release/11.0.1xx-rc1 (link to workflow run)

@github-actions

Copy link
Copy Markdown
Contributor

@marcpopMSFT backporting to release/11.0.1xx-rc1 was not run because the source pull request has not been merged. Please merge this pull request before requesting a backport.

@agocke
agocke requested a review from sbomer August 20, 2026 17:36
@jonathanpeppers

Copy link
Copy Markdown
Member

@marcpopMSFT have we checked this doesn't break iOS and Android?

Comment thread src/Tasks/Microsoft.NET.Build.Tasks/targets/Microsoft.NET.Publish.targets Outdated
@marcpopMSFT

Copy link
Copy Markdown
Member Author

Per request of maui who expects to be impacted by this, we'll old it from rc1 but get it merged for rc2 early so testing can be done.

Comment thread src/Tasks/Microsoft.NET.Build.Tasks/targets/Microsoft.NET.Publish.targets Outdated
Comment thread documentation/general/publish-build-optimization.md Outdated
Comment thread documentation/general/publish-build-optimization.md Outdated
@dotnet-milestone-bot dotnet-milestone-bot Bot added this to the 11.0-rc2 milestone Sep 1, 2026
jamescrosswell added a commit to getsentry/sentry-dotnet that referenced this pull request Oct 19, 2026
From RC 2 the .NET 11 SDK publishes Native AOT apps without running Build:
UseOptimizedPublish defaults to true when PublishAot is set, and Publish depends on
_PublishOptimizedBuildAlternative, which runs only Compile and the publish targets
(dotnet/sdk#54515). CheckSentryCLI, which every upload and release target depends on,
hooked AfterTargets="Build", so symbol upload and release creation silently stopped.
This is decided by the SDK, not the TFM, so net8.0-net10.0 apps are affected too.

CheckSentryCLI, _CreateSentryRelease and _SentrySetCommits now also run after
_PublishOptimizedBuildAlternative. Ported by hand from the version7 fix: _GetSentryRelease
already runs after PrepareSentryCLI on main, so it needs no change.

Fixes #5727

Co-authored-by: Claude Opus 5.5 <noreply@anthropic.com>
jamescrosswell added a commit to getsentry/sentry-dotnet that referenced this pull request Oct 19, 2026
* feat: add support for .NET 11 RC 2

Bumps the SDK, workload set and prerelease Microsoft.* package references
from RC 1 to RC 2.

The RC 2 Apple packs (27.0.12212) only accept platform version 27.0 and
require Xcode 27.0, so the iOS and Mac Catalyst TFMs move to 27.0 everywhere
the version is spelled out. The macos-26 runner image tops out at Xcode 26.6,
so the macOS jobs move to the preview xcode-27 image.

XHarness 26117.1's mlaunch can't start the simulator under Xcode 27, which
replaced Simulator.app with DeviceHub.app, and reports the failure as
APP_CRASH. 26506.3 handles it.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>

* fix(apple): adopt the UIScene lifecycle in the iOS and Mac Catalyst apps

Apps built with the Xcode 27 SDKs must use the UIScene lifecycle. Without it
Sentry.Samples.Maui sat on the launch screen on an iOS 27 simulator, and the
device test and integration test apps would have done the same.

The MAUI apps get the manifest and an empty MauiUISceneDelegate subclass,
as in the MAUI RC 2 templates. Sentry.Samples.Ios builds its UI in the
SceneDelegate it already had.

UIKit doesn't call application-level activation callbacks under scenes,
so the integration test app's OnActivated hook moves to its SceneDelegate.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>

* fix(maui): report in_foreground for apps using the UIScene lifecycle

Sentry.Maui set InForeground from the application-level OnActivated,
OnResignActivation and DidEnterBackground events. For apps using the UIScene
lifecycle, which Xcode 27 requires, MAUI raises SceneOnActivated and friends
instead, so InForeground stayed null and in_foreground disappeared from every
iOS and Mac Catalyst event.

The iOS integration test now asserts "in_foreground":true; without the
Scene* handlers it fails in both Release and Debug.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>

* fix(apple): upload framework symbols only from the assemblies that ship

#5566 collected framework PDBs from both "linked" and
"postprocessed-assemblies", assuming only one exists per SDK. .NET 11 RC 2
writes both. The post-processor rewrites some assemblies (Microsoft.MacCatalyst,
Microsoft.Maui.Controls and Microsoft.Maui.Essentials in the MAUI sample) and
gives them new PDB IDs, and only the postprocessed copies end up in the app
bundle. So every PDB was uploaded twice, and the "linked" copies of the
rewritten assemblies matched nothing that ships.

"linked" is now only the fallback for SDKs without
"postprocessed-assemblies". cli.Tests.ps1 compares file names with
Sort-Object -Unique, so it couldn't catch this; it now asserts that nothing is
collected from "linked".

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>

* fix: upload symbols and create releases when publishing Native AOT with the .NET 11 SDK

From RC 2 the .NET 11 SDK publishes Native AOT apps without running Build:
UseOptimizedPublish defaults to true when PublishAot is set, and Publish
depends on _PublishOptimizedBuildAlternative, which runs only Compile and the
publish targets (dotnet/sdk#54515). CheckSentryCLI, which every upload and
release target depends on, hooked AfterTargets="Build", so the symbol upload
silently stopped. This is decided by the SDK, not the TFM, so net8.0-net10.0
apps published with the .NET 11 SDK are affected too.

CheckSentryCLI and the release targets now also run after
_PublishOptimizedBuildAlternative. Caught by the native AOT publish cases in
cli.Tests.ps1, which failed for both net10.0 and net11.0.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>

* docs: extend the .NET upgrade checklist with the RC 2 breakages

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>

* docs: keep only the recurring RC 2 lessons in the upgrade checklist

Drops the UIScene row, a one-off Apple requirement. Trims the XHarness
row to the part that recurs, and folds the AOT publish and trimmer
directory rows into one row about symbol upload depending on SDK
internals.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>

* Update src/Sentry/buildTransitive/Sentry.targets

* fix(maui): keep in_foreground true while another window is active

Opening a second window on iPad fires SceneOnResignActivation and
SceneDidEnterBackground for the first scene after SceneOnActivated for the
second, so InForeground ended up false while the app was in use. Resign and
background now leave it true if another connected scene is ForegroundActive.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>

---------

Co-authored-by: Claude Opus 5.5 <noreply@anthropic.com>
jamescrosswell added a commit to getsentry/sentry-dotnet that referenced this pull request Oct 20, 2026
* chore: update modules/sentry-cocoa to 9.30.2 (#5735)

Co-authored-by: GitHub <noreply@github.com>

* fix: avoid first-chance exception when getting length of non-seekable attachment streams (#5736)

* chore(deps): update Java SDK to v8.61.0 (#5734)

* chore: update scripts/update-java.ps1 to 8.61.0

* fix(android): drop SentryEventProcessor marker interface from bindings

Java SDK 8.61.0 adds io.sentry.internal.eventprocessor.SentryEventProcessor,
an empty internal marker interface extending EventProcessor. The binding
generator surfaces EventProcessor's default methods on it as explicit
interface implementations qualified as `Sentry.JavaSdk.IEventProcessor`
without `global::`, which resolves against IO.Sentry and fails with
CS0538/CS0234. Nothing in .NET uses it, and the generated code for its
implementers is unchanged without it.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>

---------

Co-authored-by: GitHub <noreply@github.com>
Co-authored-by: James Crosswell <jamescrosswell@users.noreply.github.com>
Co-authored-by: Claude Opus 5.5 <noreply@anthropic.com>

* fix: don't upload pre-trim PDBs for trimmed iOS and Mac Catalyst builds (#5732)

* fix: don't upload pre-trim PDBs for trimmed iOS and Mac Catalyst builds

When a trimmer output directory exists, take PDBs only from it
(postprocessed-assemblies, else linked) and scan the output directory
for native symbols only. The outer build of a multi-RID Apple build
leaves PDBs out too, since each RID's inner build uploads its own.

cli.Tests.ps1 gains a Mac Catalyst case, and both Apple cases now check
that every uploaded PDB matches an assembly in the app bundle.

Closes #5728

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>

* fix: only skip output-directory PDBs on iOS and Mac Catalyst

On desktop the trimmer runs during publish, after Build, so a linked
directory at upload time is left over from an earlier publish. Removing
the PDB types there left a console app's call with no -t at all, and
sentry-cli then uploaded the apphost and runtime dylibs too. Other
platforms now keep main's commands, split over the two calls.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>

---------

Co-authored-by: Claude Opus 5.5 <noreply@anthropic.com>

* build(deps): bump the github-actions group across 1 directory with 7 updates (#5738)

* build(deps): bump the github-actions group across 1 directory with 7 updates

Bumps the github-actions group with 7 updates in the / directory:

| Package | From | To |
| --- | --- | --- |
| [actions/upload-artifact](https://github.com/actions/upload-artifact) | `7.0.1` | `7.0.2` |
| [actions/download-artifact](https://github.com/actions/download-artifact) | `8.0.1` | `8.0.2` |
| [getsentry/craft/.github/workflows/changelog-preview.yml](https://github.com/getsentry/craft) | `2.33.3` | `2.34.1` |
| [github/codeql-action/init](https://github.com/github/codeql-action) | `4.38.2` | `4.38.3` |
| [github/codeql-action/analyze](https://github.com/github/codeql-action) | `4.38.2` | `4.38.3` |
| [actions/create-github-app-token](https://github.com/actions/create-github-app-token) | `3.2.0` | `3.3.0` |
| [getsentry/craft](https://github.com/getsentry/craft) | `2.33.3` | `2.34.1` |



Updates `actions/upload-artifact` from 7.0.1 to 7.0.2
- [Release notes](https://github.com/actions/upload-artifact/releases)
- [Commits](actions/upload-artifact@043fb46...cf430e0)

Updates `actions/download-artifact` from 8.0.1 to 8.0.2
- [Release notes](https://github.com/actions/download-artifact/releases)
- [Commits](actions/download-artifact@3e5f45b...9000827)

Updates `getsentry/craft/.github/workflows/changelog-preview.yml` from 2.33.3 to 2.34.1
- [Release notes](https://github.com/getsentry/craft/releases)
- [Changelog](https://github.com/getsentry/craft/blob/master/CHANGELOG.md)
- [Commits](getsentry/craft@4e16427...3f2abdc)

Updates `github/codeql-action/init` from 4.38.2 to 4.38.3
- [Release notes](https://github.com/github/codeql-action/releases)
- [Changelog](https://github.com/github/codeql-action/blob/main/CHANGELOG.md)
- [Commits](github/codeql-action@2892aa5...24c5418)

Updates `github/codeql-action/analyze` from 4.38.2 to 4.38.3
- [Release notes](https://github.com/github/codeql-action/releases)
- [Changelog](https://github.com/github/codeql-action/blob/main/CHANGELOG.md)
- [Commits](github/codeql-action@2892aa5...24c5418)

Updates `actions/create-github-app-token` from 3.2.0 to 3.3.0
- [Release notes](https://github.com/actions/create-github-app-token/releases)
- [Changelog](https://github.com/actions/create-github-app-token/blob/main/CHANGELOG.md)
- [Commits](actions/create-github-app-token@bcd2ba4...64ab729)

Updates `getsentry/craft` from 2.33.3 to 2.34.1
- [Release notes](https://github.com/getsentry/craft/releases)
- [Changelog](https://github.com/getsentry/craft/blob/master/CHANGELOG.md)
- [Commits](getsentry/craft@4e16427...3f2abdc)

---
updated-dependencies:
- dependency-name: actions/upload-artifact
  dependency-version: 7.0.2
  dependency-type: direct:production
  update-type: version-update:semver-patch
  dependency-group: github-actions
- dependency-name: actions/download-artifact
  dependency-version: 8.0.2
  dependency-type: direct:production
  update-type: version-update:semver-patch
  dependency-group: github-actions
- dependency-name: getsentry/craft/.github/workflows/changelog-preview.yml
  dependency-version: 2.34.1
  dependency-type: direct:production
  update-type: version-update:semver-minor
  dependency-group: github-actions
- dependency-name: github/codeql-action/init
  dependency-version: 4.38.3
  dependency-type: direct:production
  update-type: version-update:semver-patch
  dependency-group: github-actions
- dependency-name: github/codeql-action/analyze
  dependency-version: 4.38.3
  dependency-type: direct:production
  update-type: version-update:semver-patch
  dependency-group: github-actions
- dependency-name: actions/create-github-app-token
  dependency-version: 3.3.0
  dependency-type: direct:production
  update-type: version-update:semver-minor
  dependency-group: github-actions
- dependency-name: getsentry/craft
  dependency-version: 2.34.1
  dependency-type: direct:production
  update-type: version-update:semver-minor
  dependency-group: github-actions
...

Signed-off-by: dependabot[bot] <support@github.com>

* ci(release): Pass the release bot's client ID as client-id

create-github-app-token deprecated app-id in favor of client-id, so every release run logs a deprecation warning. The action reads client-id first and falls back to app-id, so the token it creates stays the same.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>

---------

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
Co-authored-by: Ricardo Colombo Oliveira <github@ricoliv.com>
Co-authored-by: Claude Opus 5.5 <noreply@anthropic.com>

* chore: update modules/sentry-native to 0.17.4 (#5743)

Co-authored-by: GitHub <noreply@github.com>

* fix: run Sentry CLI targets after Native AOT optimized publish (#5731)

From RC 2 the .NET 11 SDK publishes Native AOT apps without running Build:
UseOptimizedPublish defaults to true when PublishAot is set, and Publish depends on
_PublishOptimizedBuildAlternative, which runs only Compile and the publish targets
(dotnet/sdk#54515). CheckSentryCLI, which every upload and release target depends on,
hooked AfterTargets="Build", so symbol upload and release creation silently stopped.
This is decided by the SDK, not the TFM, so net8.0-net10.0 apps are affected too.

CheckSentryCLI, _CreateSentryRelease and _SentrySetCommits now also run after
_PublishOptimizedBuildAlternative. Ported by hand from the version7 fix: _GetSentryRelease
already runs after PrepareSentryCLI on main, so it needs no change.

Fixes #5727

Co-authored-by: Claude Opus 5.5 <noreply@anthropic.com>

* feat(hangfire): send the recurring job's cron schedule as the monitor config (#5665)

* feat(hangfire): Send recurring job schedule as monitor config

Opt-in via UseSentry(o => o.SendRecurringJobSchedule = true). The
in-progress check-in of a recurring job carries the job's cron and time
zone so Sentry can create the monitor. Unsupported schedules fall back
to a check-in without config.

Co-Authored-By: Claude <noreply@anthropic.com>

* ref(hangfire): Validate the recurring job schedule before capturing

Check the crontab up front so the check-in goes out in a single call
instead of relying on the hub to swallow an exception from Interval.
The validator is shared with Sentry.Hangfire as a linked source file,
since the unsigned assembly can't see Sentry's internals.

Read the job through GetRecurringJobs, look up time zones with
FindSystemTimeZoneById on .NET 6+, and add tests for UTC, unknown
zones, deleted jobs, the UseSentry overload, and a real recurring job.

Co-Authored-By: Claude <noreply@anthropic.com>

* test(hangfire): Skip time zone tests when the zone is missing

The linux-musl CI containers have no time zone database, so lookups
of Europe/Berlin and Etc/UTC fail there.

Co-Authored-By: Claude <noreply@anthropic.com>

* fix(hangfire): Skip schedules Sentry would read differently

Hangfire runs a job only on days that match both the day-of-month and
day-of-week fields, while Sentry runs it on days that match either
unless one of them starts with '*'. Don't send those schedules, nor
ones with a reversed range such as 5-1 or SAT-SUN, which Sentry
rejects.

Co-Authored-By: Claude <noreply@anthropic.com>

* feat(hangfire): Send recurring job schedules by default

Jobs are only monitored when they have [SentryMonitorSlug], so sending
the recurring job's schedule lets Sentry create or update the monitor,
like the Spring and Quartz integrations. Set SendRecurringJobSchedule
to false to keep managing the schedule in Sentry.

Co-Authored-By: Claude <noreply@anthropic.com>

* fix(hangfire): Create the check-in ID before the in-progress check-in

The final check-in reused the ID returned for the in-progress one, which
is empty when that one isn't captured. Create the ID up front, send it
with the in-progress check-in, and store it in the job's items as before.

Co-Authored-By: Claude <noreply@anthropic.com>

* ref(hangfire): Rename SendRecurringJobSchedule to SendMonitorConfig

Matches SentryQuartzOptions.SendMonitorConfig.

Co-Authored-By: Claude <noreply@anthropic.com>

* feat(hangfire): Don't send a monitor config when recurring jobs share a slug with different schedules

* fix(hangfire): Don't treat a recurring job as conflicting with its own cached schedule

Co-Authored-By: Claude <noreply@anthropic.com>

---------

Co-authored-by: Claude <noreply@anthropic.com>

* fix(maui): report in_foreground for apps using the UIScene lifecycle (#5730)

* fix(maui): report in_foreground for apps using the UIScene lifecycle

Sentry.Maui set InForeground from the application-level OnActivated,
OnResignActivation and DidEnterBackground events. For apps using the UIScene
lifecycle, which Xcode 27 requires, MAUI raises SceneOnActivated and friends
instead, so InForeground stayed null and in_foreground disappeared from every
iOS and Mac Catalyst event.

The iOS integration test now asserts "in_foreground":true; without the
Scene* handlers it fails in both Release and Debug.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
(cherry picked from commit e75e6c9)

* test(maui): adopt the UIScene lifecycle in the iOS integration test app

The new "in_foreground":true assertion only guards the Scene* handlers if
the app runs under scenes; otherwise the application-level OnActivated
handler still sets InForeground and the assertion passes without the fix.

UIKit stops calling the application-level OnActivated under scenes, so the
OnActivated test hook moves to the SceneDelegate. Mirrors what #5725 did for
integration-test/maui-device on version7.

Refs #5726

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>

* fix(maui): keep in_foreground true while another window is active

Opening a second window on iPad fires SceneOnResignActivation and
SceneDidEnterBackground for the first scene after SceneOnActivated for the
second, so InForeground ended up false while the app was in use. Resign and
background now leave it true if another connected scene is ForegroundActive.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>

---------

Co-authored-by: Claude Opus 5.5 <noreply@anthropic.com>

* build(deps): bump dotnet-sdk from 10.0.401 to 10.0.402 (#5737)

* build(deps): bump dotnet-sdk from 10.0.401 to 10.0.402

Bumps [dotnet-sdk](https://github.com/dotnet/sdk) from 10.0.401 to 10.0.402.
- [Release notes](https://github.com/dotnet/sdk/releases)
- [Commits](dotnet/sdk@v10.0.401...v10.0.402)

---
updated-dependencies:
- dependency-name: dotnet-sdk
  dependency-version: 10.0.402
  dependency-type: direct:production
  update-type: version-update:semver-patch
...

Signed-off-by: dependabot[bot] <support@github.com>

* build: keep workload set 10.0.401 with SDK 10.0.402

Workload set 10.0.402 moves the iOS/MacCatalyst/macOS packs to 27.0.10722,
which requires Xcode 27.0 and drops iOS 26.5 as a TargetPlatformVersion.
The macos-26 runners only ship Xcode 26.x (Xcode 27 is a preview image), so
keep the 10.0.401 workload set, which is in the same 10.0.400 feature band.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>

* Revert "build: keep workload set 10.0.401 with SDK 10.0.402"

This reverts commit fcfffea.

* ci: move to Xcode 27 for the 10.0.402 workload set

Workload set 10.0.402 ships the iOS/MacCatalyst/macOS 27.0.10722 packs,
which require Xcode 27.0 and drop iOS 26.5 as a TargetPlatformVersion.

- Run macOS jobs on the xcode-27 runner image and pin Xcode 27.0
- Target iOS 27.0 in the device test apps and simulator lookup
- Disable PRI generation for Sentry.Maui's Windows TFM on macOS: MAUI
  10.0.110 ships Microsoft.Maui.Controls.pri, so the WinAppSDK targets
  now invoke makepri.exe, which can't run on macOS

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>

* fix(apple): adopt the UIScene lifecycle in the iOS and Mac Catalyst apps

Apps built with the Xcode 27 SDKs must use the UIScene lifecycle, or they
sit on the launch screen. Port of f673d4b from #5725 (version7), with
integration-test/maui-device mapped to integration-test/net9-maui.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>

* build: fix Mac Catalyst/macOS minimums and IL2037 on the 27.0 packs

- The 27.0 packs require Mac Catalyst 17.0 and macOS 14.0 for apps; raise
  the samples to match (as version7 already does)
- The net10 iOS 27.0 pack emits spurious IL2037 for explicit-interface
  members in MAUI Compatibility (dotnet/macios#26529, fixed in .NET 11
  only), which TreatWarningsAsErrors turns into a device test app failure

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>

* ci: bump XHarness to 11.0.0-prerelease.26506.3 for Xcode 27

The older mlaunch looks for Simulator.app where Xcode 27 no longer ships it
(MT1008), so ios-tests failed to launch the app. Same bump as #5725.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>

---------

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
Co-authored-by: James Crosswell <jamescrosswell@users.noreply.github.com>
Co-authored-by: Claude Opus 5.5 <noreply@anthropic.com>

* build: keep the prerelease suffix until VersionPrefix has its own label

Removing it in #5747 made Release builds pack as stable 7.0.0, which
NuGet rejects (NU5104) while the packages depend on .NET 11 RC packages.
The suffix now only applies to a bare prefix, so craft's bump to
7.0.0-rc.2 still publishes as exactly 7.0.0-rc.2.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>

* test: ask MSBuild for the package version in the integration tests

The hand-written Directory.Build.props parser couldn't follow the new
conditional VersionSuffix: PowerShell returned the XmlElement, so the
tests looked for Sentry.7.0.0-System.Xml.XmlElement.nupkg.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>

* test: pick the version line from MSBuild's output and report failures

On the macOS runner the version lookup failed with no detail, because
MSBuild's output was discarded. Match the version line instead of taking
the last one, and include the exit code and output when it fails.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>

* test: read the package version from the built package in CI

The publishing build runs the integration tests in a sparse checkout
that has the built packages but no Sentry.csproj, so MSBuild couldn't
evaluate the version there (MSB1009). Local runs still ask MSBuild.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>

* test: expect CoreCLR debug files in the Mac Catalyst CLI test

The test came from main (#5732), where MAUI on .NET 10 runs on Mono.
version7 runs this suite on .NET 11, where Mac Catalyst uses CoreCLR,
so the uploads match the iOS test's list plus maui-app.r2r.dylib and
Microsoft.MacCatalyst.pdb.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>

---------

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: github-actions[bot] <41898282+github-actions[bot]@users.noreply.github.com>
Co-authored-by: GitHub <noreply@github.com>
Co-authored-by: Stefan Jandl <reg@bitfox.at>
Co-authored-by: Claude Opus 5.5 <noreply@anthropic.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
Co-authored-by: Ricardo Colombo Oliveira <github@ricoliv.com>
Co-authored-by: Dan Fuller <dfuller@sentry.io>
jamescrosswell added a commit to getsentry/sentry-dotnet that referenced this pull request Oct 20, 2026
* chore: update modules/sentry-cocoa to 9.30.2 (#5735)

Co-authored-by: GitHub <noreply@github.com>

* fix: avoid first-chance exception when getting length of non-seekable attachment streams (#5736)

* chore(deps): update Java SDK to v8.61.0 (#5734)

* chore: update scripts/update-java.ps1 to 8.61.0

* fix(android): drop SentryEventProcessor marker interface from bindings

Java SDK 8.61.0 adds io.sentry.internal.eventprocessor.SentryEventProcessor,
an empty internal marker interface extending EventProcessor. The binding
generator surfaces EventProcessor's default methods on it as explicit
interface implementations qualified as `Sentry.JavaSdk.IEventProcessor`
without `global::`, which resolves against IO.Sentry and fails with
CS0538/CS0234. Nothing in .NET uses it, and the generated code for its
implementers is unchanged without it.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>

---------

Co-authored-by: GitHub <noreply@github.com>
Co-authored-by: James Crosswell <jamescrosswell@users.noreply.github.com>
Co-authored-by: Claude Opus 5.5 <noreply@anthropic.com>

* fix: don't upload pre-trim PDBs for trimmed iOS and Mac Catalyst builds (#5732)

* fix: don't upload pre-trim PDBs for trimmed iOS and Mac Catalyst builds

When a trimmer output directory exists, take PDBs only from it
(postprocessed-assemblies, else linked) and scan the output directory
for native symbols only. The outer build of a multi-RID Apple build
leaves PDBs out too, since each RID's inner build uploads its own.

cli.Tests.ps1 gains a Mac Catalyst case, and both Apple cases now check
that every uploaded PDB matches an assembly in the app bundle.

Closes #5728

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>

* fix: only skip output-directory PDBs on iOS and Mac Catalyst

On desktop the trimmer runs during publish, after Build, so a linked
directory at upload time is left over from an earlier publish. Removing
the PDB types there left a console app's call with no -t at all, and
sentry-cli then uploaded the apphost and runtime dylibs too. Other
platforms now keep main's commands, split over the two calls.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>

---------

Co-authored-by: Claude Opus 5.5 <noreply@anthropic.com>

* build(deps): bump the github-actions group across 1 directory with 7 updates (#5738)

* build(deps): bump the github-actions group across 1 directory with 7 updates

Bumps the github-actions group with 7 updates in the / directory:

| Package | From | To |
| --- | --- | --- |
| [actions/upload-artifact](https://github.com/actions/upload-artifact) | `7.0.1` | `7.0.2` |
| [actions/download-artifact](https://github.com/actions/download-artifact) | `8.0.1` | `8.0.2` |
| [getsentry/craft/.github/workflows/changelog-preview.yml](https://github.com/getsentry/craft) | `2.33.3` | `2.34.1` |
| [github/codeql-action/init](https://github.com/github/codeql-action) | `4.38.2` | `4.38.3` |
| [github/codeql-action/analyze](https://github.com/github/codeql-action) | `4.38.2` | `4.38.3` |
| [actions/create-github-app-token](https://github.com/actions/create-github-app-token) | `3.2.0` | `3.3.0` |
| [getsentry/craft](https://github.com/getsentry/craft) | `2.33.3` | `2.34.1` |



Updates `actions/upload-artifact` from 7.0.1 to 7.0.2
- [Release notes](https://github.com/actions/upload-artifact/releases)
- [Commits](actions/upload-artifact@043fb46...cf430e0)

Updates `actions/download-artifact` from 8.0.1 to 8.0.2
- [Release notes](https://github.com/actions/download-artifact/releases)
- [Commits](actions/download-artifact@3e5f45b...9000827)

Updates `getsentry/craft/.github/workflows/changelog-preview.yml` from 2.33.3 to 2.34.1
- [Release notes](https://github.com/getsentry/craft/releases)
- [Changelog](https://github.com/getsentry/craft/blob/master/CHANGELOG.md)
- [Commits](getsentry/craft@4e16427...3f2abdc)

Updates `github/codeql-action/init` from 4.38.2 to 4.38.3
- [Release notes](https://github.com/github/codeql-action/releases)
- [Changelog](https://github.com/github/codeql-action/blob/main/CHANGELOG.md)
- [Commits](github/codeql-action@2892aa5...24c5418)

Updates `github/codeql-action/analyze` from 4.38.2 to 4.38.3
- [Release notes](https://github.com/github/codeql-action/releases)
- [Changelog](https://github.com/github/codeql-action/blob/main/CHANGELOG.md)
- [Commits](github/codeql-action@2892aa5...24c5418)

Updates `actions/create-github-app-token` from 3.2.0 to 3.3.0
- [Release notes](https://github.com/actions/create-github-app-token/releases)
- [Changelog](https://github.com/actions/create-github-app-token/blob/main/CHANGELOG.md)
- [Commits](actions/create-github-app-token@bcd2ba4...64ab729)

Updates `getsentry/craft` from 2.33.3 to 2.34.1
- [Release notes](https://github.com/getsentry/craft/releases)
- [Changelog](https://github.com/getsentry/craft/blob/master/CHANGELOG.md)
- [Commits](getsentry/craft@4e16427...3f2abdc)

---
updated-dependencies:
- dependency-name: actions/upload-artifact
  dependency-version: 7.0.2
  dependency-type: direct:production
  update-type: version-update:semver-patch
  dependency-group: github-actions
- dependency-name: actions/download-artifact
  dependency-version: 8.0.2
  dependency-type: direct:production
  update-type: version-update:semver-patch
  dependency-group: github-actions
- dependency-name: getsentry/craft/.github/workflows/changelog-preview.yml
  dependency-version: 2.34.1
  dependency-type: direct:production
  update-type: version-update:semver-minor
  dependency-group: github-actions
- dependency-name: github/codeql-action/init
  dependency-version: 4.38.3
  dependency-type: direct:production
  update-type: version-update:semver-patch
  dependency-group: github-actions
- dependency-name: github/codeql-action/analyze
  dependency-version: 4.38.3
  dependency-type: direct:production
  update-type: version-update:semver-patch
  dependency-group: github-actions
- dependency-name: actions/create-github-app-token
  dependency-version: 3.3.0
  dependency-type: direct:production
  update-type: version-update:semver-minor
  dependency-group: github-actions
- dependency-name: getsentry/craft
  dependency-version: 2.34.1
  dependency-type: direct:production
  update-type: version-update:semver-minor
  dependency-group: github-actions
...

Signed-off-by: dependabot[bot] <support@github.com>

* ci(release): Pass the release bot's client ID as client-id

create-github-app-token deprecated app-id in favor of client-id, so every release run logs a deprecation warning. The action reads client-id first and falls back to app-id, so the token it creates stays the same.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>

---------

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
Co-authored-by: Ricardo Colombo Oliveira <github@ricoliv.com>
Co-authored-by: Claude Opus 5.5 <noreply@anthropic.com>

* chore: update modules/sentry-native to 0.17.4 (#5743)

Co-authored-by: GitHub <noreply@github.com>

* fix: run Sentry CLI targets after Native AOT optimized publish (#5731)

From RC 2 the .NET 11 SDK publishes Native AOT apps without running Build:
UseOptimizedPublish defaults to true when PublishAot is set, and Publish depends on
_PublishOptimizedBuildAlternative, which runs only Compile and the publish targets
(dotnet/sdk#54515). CheckSentryCLI, which every upload and release target depends on,
hooked AfterTargets="Build", so symbol upload and release creation silently stopped.
This is decided by the SDK, not the TFM, so net8.0-net10.0 apps are affected too.

CheckSentryCLI, _CreateSentryRelease and _SentrySetCommits now also run after
_PublishOptimizedBuildAlternative. Ported by hand from the version7 fix: _GetSentryRelease
already runs after PrepareSentryCLI on main, so it needs no change.

Fixes #5727

Co-authored-by: Claude Opus 5.5 <noreply@anthropic.com>

* feat(hangfire): send the recurring job's cron schedule as the monitor config (#5665)

* feat(hangfire): Send recurring job schedule as monitor config

Opt-in via UseSentry(o => o.SendRecurringJobSchedule = true). The
in-progress check-in of a recurring job carries the job's cron and time
zone so Sentry can create the monitor. Unsupported schedules fall back
to a check-in without config.

Co-Authored-By: Claude <noreply@anthropic.com>

* ref(hangfire): Validate the recurring job schedule before capturing

Check the crontab up front so the check-in goes out in a single call
instead of relying on the hub to swallow an exception from Interval.
The validator is shared with Sentry.Hangfire as a linked source file,
since the unsigned assembly can't see Sentry's internals.

Read the job through GetRecurringJobs, look up time zones with
FindSystemTimeZoneById on .NET 6+, and add tests for UTC, unknown
zones, deleted jobs, the UseSentry overload, and a real recurring job.

Co-Authored-By: Claude <noreply@anthropic.com>

* test(hangfire): Skip time zone tests when the zone is missing

The linux-musl CI containers have no time zone database, so lookups
of Europe/Berlin and Etc/UTC fail there.

Co-Authored-By: Claude <noreply@anthropic.com>

* fix(hangfire): Skip schedules Sentry would read differently

Hangfire runs a job only on days that match both the day-of-month and
day-of-week fields, while Sentry runs it on days that match either
unless one of them starts with '*'. Don't send those schedules, nor
ones with a reversed range such as 5-1 or SAT-SUN, which Sentry
rejects.

Co-Authored-By: Claude <noreply@anthropic.com>

* feat(hangfire): Send recurring job schedules by default

Jobs are only monitored when they have [SentryMonitorSlug], so sending
the recurring job's schedule lets Sentry create or update the monitor,
like the Spring and Quartz integrations. Set SendRecurringJobSchedule
to false to keep managing the schedule in Sentry.

Co-Authored-By: Claude <noreply@anthropic.com>

* fix(hangfire): Create the check-in ID before the in-progress check-in

The final check-in reused the ID returned for the in-progress one, which
is empty when that one isn't captured. Create the ID up front, send it
with the in-progress check-in, and store it in the job's items as before.

Co-Authored-By: Claude <noreply@anthropic.com>

* ref(hangfire): Rename SendRecurringJobSchedule to SendMonitorConfig

Matches SentryQuartzOptions.SendMonitorConfig.

Co-Authored-By: Claude <noreply@anthropic.com>

* feat(hangfire): Don't send a monitor config when recurring jobs share a slug with different schedules

* fix(hangfire): Don't treat a recurring job as conflicting with its own cached schedule

Co-Authored-By: Claude <noreply@anthropic.com>

---------

Co-authored-by: Claude <noreply@anthropic.com>

* fix(maui): report in_foreground for apps using the UIScene lifecycle (#5730)

* fix(maui): report in_foreground for apps using the UIScene lifecycle

Sentry.Maui set InForeground from the application-level OnActivated,
OnResignActivation and DidEnterBackground events. For apps using the UIScene
lifecycle, which Xcode 27 requires, MAUI raises SceneOnActivated and friends
instead, so InForeground stayed null and in_foreground disappeared from every
iOS and Mac Catalyst event.

The iOS integration test now asserts "in_foreground":true; without the
Scene* handlers it fails in both Release and Debug.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
(cherry picked from commit e75e6c9)

* test(maui): adopt the UIScene lifecycle in the iOS integration test app

The new "in_foreground":true assertion only guards the Scene* handlers if
the app runs under scenes; otherwise the application-level OnActivated
handler still sets InForeground and the assertion passes without the fix.

UIKit stops calling the application-level OnActivated under scenes, so the
OnActivated test hook moves to the SceneDelegate. Mirrors what #5725 did for
integration-test/maui-device on version7.

Refs #5726

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>

* fix(maui): keep in_foreground true while another window is active

Opening a second window on iPad fires SceneOnResignActivation and
SceneDidEnterBackground for the first scene after SceneOnActivated for the
second, so InForeground ended up false while the app was in use. Resign and
background now leave it true if another connected scene is ForegroundActive.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>

---------

Co-authored-by: Claude Opus 5.5 <noreply@anthropic.com>

* build(deps): bump dotnet-sdk from 10.0.401 to 10.0.402 (#5737)

* build(deps): bump dotnet-sdk from 10.0.401 to 10.0.402

Bumps [dotnet-sdk](https://github.com/dotnet/sdk) from 10.0.401 to 10.0.402.
- [Release notes](https://github.com/dotnet/sdk/releases)
- [Commits](dotnet/sdk@v10.0.401...v10.0.402)

---
updated-dependencies:
- dependency-name: dotnet-sdk
  dependency-version: 10.0.402
  dependency-type: direct:production
  update-type: version-update:semver-patch
...

Signed-off-by: dependabot[bot] <support@github.com>

* build: keep workload set 10.0.401 with SDK 10.0.402

Workload set 10.0.402 moves the iOS/MacCatalyst/macOS packs to 27.0.10722,
which requires Xcode 27.0 and drops iOS 26.5 as a TargetPlatformVersion.
The macos-26 runners only ship Xcode 26.x (Xcode 27 is a preview image), so
keep the 10.0.401 workload set, which is in the same 10.0.400 feature band.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>

* Revert "build: keep workload set 10.0.401 with SDK 10.0.402"

This reverts commit fcfffea.

* ci: move to Xcode 27 for the 10.0.402 workload set

Workload set 10.0.402 ships the iOS/MacCatalyst/macOS 27.0.10722 packs,
which require Xcode 27.0 and drop iOS 26.5 as a TargetPlatformVersion.

- Run macOS jobs on the xcode-27 runner image and pin Xcode 27.0
- Target iOS 27.0 in the device test apps and simulator lookup
- Disable PRI generation for Sentry.Maui's Windows TFM on macOS: MAUI
  10.0.110 ships Microsoft.Maui.Controls.pri, so the WinAppSDK targets
  now invoke makepri.exe, which can't run on macOS

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>

* fix(apple): adopt the UIScene lifecycle in the iOS and Mac Catalyst apps

Apps built with the Xcode 27 SDKs must use the UIScene lifecycle, or they
sit on the launch screen. Port of f673d4b from #5725 (version7), with
integration-test/maui-device mapped to integration-test/net9-maui.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>

* build: fix Mac Catalyst/macOS minimums and IL2037 on the 27.0 packs

- The 27.0 packs require Mac Catalyst 17.0 and macOS 14.0 for apps; raise
  the samples to match (as version7 already does)
- The net10 iOS 27.0 pack emits spurious IL2037 for explicit-interface
  members in MAUI Compatibility (dotnet/macios#26529, fixed in .NET 11
  only), which TreatWarningsAsErrors turns into a device test app failure

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>

* ci: bump XHarness to 11.0.0-prerelease.26506.3 for Xcode 27

The older mlaunch looks for Simulator.app where Xcode 27 no longer ships it
(MT1008), so ios-tests failed to launch the app. Same bump as #5725.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>

---------

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
Co-authored-by: James Crosswell <jamescrosswell@users.noreply.github.com>
Co-authored-by: Claude Opus 5.5 <noreply@anthropic.com>

* docs: hand-written release notes for 7.0.0

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>

* build: keep the prerelease suffix until VersionPrefix has its own label

Removing it in #5747 made Release builds pack as stable 7.0.0, which
NuGet rejects (NU5104) while the packages depend on .NET 11 RC packages.
The suffix now only applies to a bare prefix, so craft's bump to
7.0.0-rc.2 still publishes as exactly 7.0.0-rc.2.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>

* Apply batched suggestions from code review

Co-authored-by: James Crosswell <jamescrosswell@users.noreply.github.com>

* test: ask MSBuild for the package version in the integration tests

The hand-written Directory.Build.props parser couldn't follow the new
conditional VersionSuffix: PowerShell returned the XmlElement, so the
tests looked for Sentry.7.0.0-System.Xml.XmlElement.nupkg.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>

* test: pick the version line from MSBuild's output and report failures

On the macOS runner the version lookup failed with no detail, because
MSBuild's output was discarded. Match the version line instead of taking
the last one, and include the exit code and output when it fails.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>

* docs: add #5740 to the 7.0.0 release notes

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>

* test: read the package version from the built package in CI

The publishing build runs the integration tests in a sparse checkout
that has the built packages but no Sentry.csproj, so MSBuild couldn't
evaluate the version there (MSB1009). Local runs still ask MSBuild.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>

* test: expect CoreCLR debug files in the Mac Catalyst CLI test

The test came from main (#5732), where MAUI on .NET 10 runs on Mono.
version7 runs this suite on .NET 11, where Mac Catalyst uses CoreCLR,
so the uploads match the iOS test's list plus maui-app.r2r.dylib and
Microsoft.MacCatalyst.pdb.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>

---------

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: github-actions[bot] <41898282+github-actions[bot]@users.noreply.github.com>
Co-authored-by: GitHub <noreply@github.com>
Co-authored-by: Stefan Jandl <reg@bitfox.at>
Co-authored-by: Claude Opus 5.5 <noreply@anthropic.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
Co-authored-by: Ricardo Colombo Oliveira <github@ricoliv.com>
Co-authored-by: Dan Fuller <dfuller@sentry.io>

This branch had an error being deployed

1 failed deployment
copilot-pat-pool — e83ba571 Deployed Aug 27, 2026 by marcpopMSFT via pre_activation #1352
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

breaking-change Using this label will notify dotnet/compat and trigger a request to file a compat bug

Projects

None yet

Development

Successfully merging this pull request may close these issues.

6 participants