Skip to content

[release/10.0] Fix Mono AOT crash on struct fields with unsupported marshal conversion#125618

Open
github-actions[bot] wants to merge 1 commit intorelease/10.0from
backport/pr-125575-to-release/10.0
Open

[release/10.0] Fix Mono AOT crash on struct fields with unsupported marshal conversion#125618
github-actions[bot] wants to merge 1 commit intorelease/10.0from
backport/pr-125575-to-release/10.0

Conversation

@github-actions
Copy link
Contributor

@github-actions github-actions bot commented Mar 16, 2026

Backport of #125575 to release/10.0

/cc @lewing

Customer Impact

  • Customer reported
  • Found internally

This is both an infrastructure fix and a correctness fix. The test is actively failing in ci, the change fixes an aot compiler crash and turns it (correctly) into a runtime error.

Regression

  • Yes
  • No

[If yes, specify when the regression was introduced. Provide the PR or commit if known.]

Testing

Fails continuously in runtime-llvm pipeline but is marked as Known Build Error

Risk

Low, the previous code was

IMPORTANT: If this backport is for a servicing release, please verify that:

  • For .NET 8 and .NET 9: The PR target branch is release/X.0-staging, not release/X.0.
  • For .NET 10+: The PR target branch is release/X.0 (no -staging suffix).

Package authoring no longer needed in .NET 9

IMPORTANT: Starting with .NET 9, you no longer need to edit a NuGet package's csproj to enable building and bump the version.
Keep in mind that we still need package authoring in .NET 8 and older versions.

When a struct contains a reference type field (string, class, array)
with MONO_MARSHAL_CONV_NONE (e.g. from UnmanagedType.CustomMarshaler),
the AOT compiler hits g_assert_not_reached() in emit_struct_conv_full,
causing a SIGABRT.

This happens with StructWithCustomMarshalerField in the ICustomMarshaler
test: a struct with [MarshalAs(UnmanagedType.CustomMarshaler)] on a
string field. The test expects a TypeLoadException at runtime, but the
AOT compiler crashes before it gets there.

Handle MONO_TYPE_STRING, MONO_TYPE_CLASS, MONO_TYPE_OBJECT,
MONO_TYPE_SZARRAY, and MONO_TYPE_ARRAY in the MONO_MARSHAL_CONV_NONE
path by emitting a MarshalDirectiveException instead of asserting.
This lets the AOT compiler complete and the runtime throw the expected
exception.

Fixes #125168

Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

area-VM-meta-mono Servicing-consider Issue for next servicing release review

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant