[ci-fix] Use DoNotWrapExceptions across ReflectionMemberAccessor Invoke paths#129212
Open
github-actions[bot] wants to merge 10 commits into
Open
[ci-fix] Use DoNotWrapExceptions across ReflectionMemberAccessor Invoke paths#129212github-actions[bot] wants to merge 10 commits into
github-actions[bot] wants to merge 10 commits into
Conversation
… accessors On Mono/tvOS (AOT environments), System.Text.Json uses ReflectionMemberAccessor which calls MethodInfo.Invoke() for property getters/setters. This wraps any exception thrown by the property in TargetInvocationException, unlike CoreCLR which uses IL-emitted delegates that propagate exceptions directly. The constructor delegates in the same class already unwrap TargetInvocationException; this commit adds the same treatment to CreatePropertyGetter and CreatePropertySetter using ExceptionDispatchInfo.Capture to preserve the original stack trace. Fixes the tvOS Mono test failure where AsyncEnumerableTests.SerializeAsyncEnumerable_PartialItemFailure tests expect InvalidOperationException but receive TargetInvocationException. Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
Closed
Co-authored-by: kotlarmilos <11523312+kotlarmilos@users.noreply.github.com>
Open
3 tasks
Co-authored-by: kotlarmilos <11523312+kotlarmilos@users.noreply.github.com>
Co-authored-by: kotlarmilos <11523312+kotlarmilos@users.noreply.github.com>
Co-authored-by: kotlarmilos <11523312+kotlarmilos@users.noreply.github.com>
Co-authored-by: kotlarmilos <11523312+kotlarmilos@users.noreply.github.com>
Co-authored-by: kotlarmilos <11523312+kotlarmilos@users.noreply.github.com>
Co-authored-by: kotlarmilos <11523312+kotlarmilos@users.noreply.github.com>
Copilot
AI
changed the title
[ci-fix] Unwrap TargetInvocationException in ReflectionMemberAccessor property accessors
[ci-fix] Use DoNotWrapExceptions across ReflectionMemberAccessor Invoke paths
Jun 17, 2026
jkotas
reviewed
Jun 17, 2026
jkotas
reviewed
Jun 17, 2026
jkotas
reviewed
Jun 17, 2026
Closed
…essor Invoke paths Apply BindingFlags.DoNotWrapExceptions on NET and a single stack preserving ExceptionDispatchInfo based catch and rethrow on non NET across every user code Invoke site, and revert the unrelated union accessor null check for a separate PR. Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
Contributor
There was a problem hiding this comment.
Pull request overview
Updates System.Text.Json’s reflection-based MemberAccessor implementation to avoid TargetInvocationException wrapping when invoking constructors/methods via reflection, aligning exception propagation with the ReflectionEmit-based accessor paths.
Changes:
- Use
BindingFlags.DoNotWrapExceptionsfor reflectionInvokecalls when targeting#if NET. - On non-
NETTFMs, unwrapTargetInvocationException.InnerExceptionviaExceptionDispatchInfoto preserve the original exception and stack. - Apply this across parameterless/parameterized constructors, add-method delegates, and property getter/setter delegates.
Show a summary per file
| File | Description |
|---|---|
| src/libraries/System.Text.Json/src/System/Text/Json/Serialization/Metadata/ReflectionMemberAccessor.cs | Adjusts reflection invocation patterns to avoid exception wrapping and preserve original exception behavior. |
Copilot's findings
- Files reviewed: 1/1 changed files
- Comments generated: 1
Comment on lines
+37
to
+45
| return () => | ||
| { | ||
| #if NET | ||
| return ctorInfo.Invoke( | ||
| BindingFlags.DoNotWrapExceptions, | ||
| binder: null, | ||
| parameters: null, | ||
| culture: null); | ||
| #else |
This was referenced Jul 3, 2026
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
Workflow artifact: ci-fix
Artifact kind: help
Linked KBE: #128766
> [!NOTE]
> This is an AI/Copilot-generated fix updated after PR feedback and validated with targeted local build/test runs.
Root cause (best analysis)
AsyncEnumerableTests.SerializeAsyncEnumerable_*_PartialItemFailure_PriorItemsAreFullyWrittenfails on tvos-arm64 AllSubsets_Mono because the test expectsInvalidOperationExceptionbut receivesTargetInvocationException.The failing log line:
On Mono/tvOS (AOT environments),
System.Text.JsonusesReflectionMemberAccessor, where reflectionInvokecan wrap target exceptions. CoreCLR commonly usesReflectionEmitMemberAccessor, which propagates underlying exceptions directly.Attempted fix
Updated
ReflectionMemberAccessorto applyBindingFlags.DoNotWrapExceptionsonNETtargets across relevant reflectionInvokecall sites in the file (including property accessors and otherInvokeusages raised in review), while preserving non-NETcompatibility paths.Additional polish from feedback:
ReflectionEmitMemberAccessorfor add-method delegate behavior.What is unverified / where I need help
Validation
./build.sh clr+libs -rc release✅./build.sh clr+libs+host -rc release -lc release✅dotnet build src/libraries/System.Text.Json/src/System.Text.Json.csproj -c Release✅dotnet build /t:test src/libraries/System.Text.Json/tests/System.Text.Json.Tests/System.Text.Json.Tests.csproj -p:Configuration=Release /p:XunitMethodName=System.Text.Json.Serialization.Tests.AsyncEnumerableTests_AsyncPipeSerializer.SerializeAsyncEnumerable_TopLevelValues_PartialItemFailure_PriorItemsAreFullyWritten✅Evidence
Help wanted
area-System.Text.Json):@StephenMolloy,@dotnet/area-system-text-jsonFiled by
ci-failure-fix. Comment here or on the workflow file to suggest changes;ci-failure-scan-feedbackreads in-scope feedback daily and opens (or updates) a PR with prompt edits.> [!WARNING]
>
> Generated by CI Outer-Loop Failure Fixer · ● 35M · ◷