Official agent skill

.NET Native AOT Compatibility

by dotnet in dotnet/skills

Makes .NET projects compatible with Native AOT and trimming by resolving IL trim and AOT analyzer warnings through annotations rather than suppressions.

OfficialMITAuto-check passedDevelopment

Install .NET Native AOT Compatibility

skills CLI
$ npx skills add dotnet/skills --skill dotnet-aot-compat -a claude-code

Project install by default; add -g for ~/.claude/skills/.

GitHub CLI
$ gh skill install dotnet/skills dotnet-aot-compat --agent claude-code

Project scope by default; add --scope user for a personal install. Needs GitHub CLI 2.90.0 or later (public preview).

Manual copy
$ git clone --depth 1 https://github.com/dotnet/skills.git skills-src && mkdir -p .claude/skills && cp -r skills-src/plugins/dotnet-upgrade/skills/dotnet-aot-compat .claude/skills/dotnet-aot-compat && rm -rf skills-src

Use ~/.claude/skills/ instead of .claude/skills for a personal install. The folder must contain SKILL.md.

Claude Code skills documentation · loads skills from .claude/skills/

Facts

Skill name
dotnet-aot-compat
GitHub stars
5.6k
Used in
2 other repos
Token cost
~4.2k tokens
SKILL.md length
1,764 words
Files
2 (incl. references)
Skills in repo
91
Repo updated
First seen
Licence
MIT

At a glance

Makes .NET projects compatible with Native AOT and trimming by resolving IL trim and AOT analyzer warnings through annotations rather than suppressions.

  • Works in 6 steps: Enable AOT analysis in the .csproj → Build and collect warnings → Triage warnings by code (do NOT read… → …
  • Making a library or app AOT-compatible
  • SKILL.md covers When to Use This Skill, When Not to Use This Skill, Prerequisites and Background: What AOT…, plus 7 more sections
  • Calls dotnet

What it does

The skill works through warnings such as IL2026, IL2070, IL2067, IL2072 and IL3050, and through enabling `IsAotCompatible` in a `.csproj`. It explains why reflection trips up the trimmer, which cannot see which types and members are used at runtime, and requires a project targeting net8.0 or later with the matching SDK. Projects that target only .NET Framework are out of scope because the analyzers do not exist there.

Its rules are strict: never silence IL warnings with `#pragma warning disable` or `[UnconditionalSuppressMessage]`, because the linker and AOT compiler still see the problem. Prefer `[DynamicallyAccessedMembers]` annotations to carry type information through the call chain, refactor away patterns that break that flow such as boxing a `Type` in an `object[]`, and mark truly incompatible methods with `[RequiresUnreferencedCode]`, `[RequiresDynamicCode]` or `[RequiresAssemblyFiles]` so callers must acknowledge them. It does not cover publishing AOT binaries, shrinking binary size or replacing reflection-heavy libraries.

When your agent uses it

  • Making a library or app AOT-compatible
  • Fixing trimming and IL analyzer warnings after upgrading to net8.0
  • Adding DynamicallyAccessedMembers annotations to reflection code

Example prompts

  • “Make this project AOT-compatible and resolve the IL2070 and IL2067 warnings.”
  • “Enable IsAotCompatible in my .csproj and fix the resulting trim warnings.”
  • “Annotate the reflection code in our serializer for the trimmer.”

Requirements

  • .NET SDK and a project targeting net8.0 or later

Workflow steps

6 steps, taken from the step headings in SKILL.md.

  1. Enable AOT analysis in the .csproj
  2. Build and collect warnings
  3. Triage warnings by code (do NOT read every file)
  4. Fix warnings iteratively (innermost first)
  5. Rebuild and repeat
  6. Validate all TFMs

What it can do on your machine

Read from SKILL.md and the folder at commit 8d670fa. It shows what the files ask for, not the result of running them.

  • Tool permissions

    Pre-approves nothing: there is no allowed-tools line, so your agent's usual permission prompts apply.

    From allowed-tools in the SKILL.md frontmatter.

  • Runs code

    Shell commands in SKILL.md call:

    • dotnet

    From the folder's file list and the shell code blocks in SKILL.md.

  • Network

    Links to these hosts (documentation or services it may open):

    • learn.microsoft.com

    From URLs in SKILL.md, links to its own repository left out.

  • Credentials

    Names no API keys, tokens, secrets or passwords.

    From names ending in _API_KEY, _TOKEN, _SECRET, _KEY or _PASSWORD in SKILL.md.

Context cost

.NET Native AOT Compatibility loads about 4.2k tokens when it runs, and up to ~4.6k if it reads all its reference files. Until then it costs about 127 tokens; SKILL.md has 1,764 words of instructions outside code blocks.

Always · name and description, kept in context so the agent knows when to use it
~127
When it runs · the whole SKILL.md, loaded when a task matches
~4.2k
With references · SKILL.md plus every file in references/, read only if the agent opens them
~4.6k

Estimates: characters ÷ 4, the usual rule of thumb; real counts depend on the model's tokenizer. Scripts and assets cost tokens only if the agent reads them.

Safety

Auto-check passed

The automated check found no risky patterns in SKILL.md.

Automated static check — not a guarantee. Review scripts before installing. It scans the text of SKILL.md for risky patterns (piping downloads into a shell, reading credential files, hidden Unicode, destructive commands); files beside SKILL.md are not scanned.

SKILL.md

The full file from dotnet/skills at commit 8d670fa, republished under its MIT licence (© dotnet). 1,764 words, ~4,192 tokens.

Download SKILL.mdSave it as .claude/skills/dotnet-aot-compat/SKILL.md (or your agent's skills folder). This skill also uses 1 other file; get the full folder from GitHub.
name
dotnet-aot-compat
description
Make .NET projects compatible with Native AOT and trimming by systematically resolving IL trim/AOT analyzer warnings. USE FOR: making projects AOT-compatible, fixing trimming warnings, resolving IL warnings (IL2026, IL2070, IL2067, IL2072, IL3050), adding DynamicallyAccessedMembers annotations, enabling IsAotCompatible. DO NOT USE FOR: publishing native AOT binaries, optimizing binary size, replacing reflection-heavy libraries with alternatives. INVOKES: no tools — pure knowledge skill.
license
MIT

dotnet-aot-compat

Make .NET projects compatible with Native AOT and trimming by systematically resolving all IL trim/AOT analyzer warnings.

When to Use This Skill

  • "Make this project AOT-compatible"
  • "Fix trimming warnings" or "fix IL warnings"
  • "Resolve IL2070 / IL2067 / IL2072 / IL2026 / IL3050 warnings"
  • "Add DynamicallyAccessedMembers annotations"
  • "Enable IsAotCompatible in my .csproj"
  • "My project has trim analyzer warnings after upgrading to net8.0"
  • "Annotate reflection code for the trimmer"

When Not to Use This Skill

Do not use this skill when the project exclusively targets .NET Framework (net4x), which does not support the trim/AOT analyzers.

Prerequisites

An existing .NET project targeting net8.0 or later (or multi-targeting with at least one net8.0+ TFM) and the corresponding .NET SDK installed.

Background: What AOT Compatibility Means

Native AOT and the IL trimmer perform static analysis to determine what code is reachable. Reflection can break this analysis because the trimmer can't see what types/members are accessed at runtime. The IsAotCompatible property enables analyzers that flag these issues as build warnings (ILXXXX codes).

Critical Rules

❌ Never suppress warnings incorrectly
  • NEVER use #pragma warning disable for IL warnings. It hides warnings from the Roslyn analyzer at build time, but the IL linker and AOT compiler still see the issue. The code will fail at trim/publish time.
  • NEVER use [UnconditionalSuppressMessage]. It tells both the analyzer AND the linker to ignore the warning, meaning the trimmer cannot verify safety. Raising an error at build time is always preferable to hiding the issue and having it silently break at runtime.
💡 Preferred approaches
  • Prefer [DynamicallyAccessedMembers] annotations to flow type information through the call chain.
  • Prefer refactoring to eliminate patterns that break annotation flow (e.g., boxing Type through object[]).
  • Use [RequiresUnreferencedCode] / [RequiresDynamicCode] / [RequiresAssemblyFiles] to mark methods as fundamentally incompatible with trimming, propagating the requirement to callers. This surfaces the issue clearly rather than hiding it — callers must explicitly acknowledge the incompatibility.
Annotation flow is key

The trimmer tracks [DynamicallyAccessedMembers] annotations through assignments, parameter passing, and return values. If this flow is broken (e.g., by boxing a Type into object, storing in an untyped collection, or casting through interfaces), the trimmer loses track and warns. The fix is to preserve the flow, not suppress the warning.

Step-by-Step Procedure

Do not explore the codebase up-front. The build warnings tell you exactly which files and lines need changes. Follow a tight loop: build → pick a warning → open that file at that line → apply the fix recipe → rebuild. Reading or analyzing source files beyond what a specific warning points you to is wasted effort and leads to timeouts. Let the compiler guide you.

❌ Do NOT run find, ls, or grep to understand the project structure before building. Do NOT read README, docs, or architecture files. Your first action should be Step 1 (enable AOT analysis), then build.

Step 1: Enable AOT analysis in the .csproj

Add IsAotCompatible. If the project doesn't exclusively target net8.0+, add a TFM condition (AOT analysis requires net8.0+):

xml
<PropertyGroup>
  <IsAotCompatible Condition="$([MSBuild]::IsTargetFrameworkCompatible('$(TargetFramework)', 'net8.0'))">true</IsAotCompatible>
</PropertyGroup>

This automatically sets EnableTrimAnalyzer=true and EnableAotAnalyzer=true for compatible TFMs. For multi-targeting projects (e.g., netstandard2.0;net8.0), the condition ensures no NETSDK1210 warnings on older TFMs.

Step 2: Build and collect warnings
bash
dotnet build <project.csproj> -f <net8.0-or-later-tfm> --no-incremental 2>&1 | grep 'IL[0-9]\{4\}'

Sort and deduplicate. Common warning codes:

  • IL2070: Reflection call on a Type parameter missing [DynamicallyAccessedMembers]
  • IL2067: Passing an unannotated Type to a method expecting [DynamicallyAccessedMembers]
  • IL2072: Return value or extracted value missing annotation (often from unboxing)
  • IL2057: Type.GetType(string) with a non-constant argument
  • IL2026: Calling a method marked [RequiresUnreferencedCode]
  • IL2050: P/invoke method with COM marshalling parameters
  • IL2075: Return value flows into reflection without annotation
  • IL2091: Generic argument missing [DynamicallyAccessedMembers] required by constraint
  • IL3000: Assembly.Location returns empty string in single-file/AOT apps
  • IL3050: Calling a method marked [RequiresDynamicCode]
Step 3: Triage warnings by code (do NOT read every file)

Group the warnings from Step 2 by warning code and count them. Do not open individual files yet. Identify the top 1-2 patterns by count — these drive your fix strategy:

PatternTypical fix
Many IL2026 + IL3050 from JsonSerializerGo to Strategy C immediately — create a JsonSerializerContext, then batch-update all call sites
IL2070/IL2087 on Type parametersAdd [DynamicallyAccessedMembers] to the innermost method, then cascade outward
IL2067 passing unannotated TypeAnnotate the parameter at the source

In most real projects, IL2026/IL3050 from JsonSerializer dominate. Start with Strategy C unless the warning breakdown clearly shows otherwise. After the batch JSON fix, handle remaining warnings with Strategies A–B. Only use Strategy D as a last resort.

Step 4: Fix warnings iteratively (innermost first)

Work from the innermost reflection call outward. Each fix may cascade new warnings to callers.

Stay warning-driven. For each warning, open only the file and line the compiler reported, identify the pattern, apply the matching fix recipe below, and move on. Do not scan the codebase for similar patterns or try to understand the full architecture — fix what the compiler tells you, rebuild, and let new warnings guide the next change. Fix a small batch of warnings (5-10), then rebuild immediately to check progress.

Use sub-agents when available. If you can launch sub-agents (e.g., via a task tool), dispatch multiple sub-agents in parallel to edit different files simultaneously. Keep the main loop focused on building, parsing warnings, and dispatching — delegate actual file edits to sub-agents. For batch JSON updates, give each sub-agent 5-10 files to update in one prompt. After 2 build-fix cycles, dispatch all remaining file edits to sub-agents in parallel — do not continue fixing files sequentially. Example:

Update these files to use source-generated JSON: src/Models/Resource.Serialization.cs, src/Models/Identity.Serialization.cs, src/Models/Plan.Serialization.cs. In each file, replace JsonSerializer.Serialize(writer, value) with JsonSerializer.Serialize(writer, value, MyProjectJsonContext.Default.TypeName) and JsonSerializer.Deserialize<T>(ref reader) with JsonSerializer.Deserialize(ref reader, MyProjectJsonContext.Default.TypeName). Only edit the JsonSerializer call sites.

Strategy A: Add [DynamicallyAccessedMembers] (preferred)

When a method uses reflection on a Type parameter, annotate the parameter to tell the trimmer what members are needed:

csharp
using System.Diagnostics.CodeAnalysis;

// Before (warns IL2070):
void Process(Type t) {
    var method = t.GetMethod("Foo");  // trimmer can't verify
}

// After (clean):
void Process([DynamicallyAccessedMembers(DynamicallyAccessedMemberTypes.PublicMethods)] Type t) {
    var method = t.GetMethod("Foo");  // trimmer preserves public methods
}

When you annotate a parameter, all callers must now pass properly annotated types. This cascades outward — follow each caller and annotate or refactor as needed. The caller's annotation must include at least the same member types as the callee's. If the callee requires PublicConstructors | NonPublicConstructors, the caller must specify the same or a superset — using only NonPublicConstructors will produce IL2091.

Strategy B: Refactor to preserve annotation flow

When annotation flow is broken by boxing (storing Type in object, object[], or untyped collections), refactor to pass the Type directly:

csharp
// BROKEN: Type boxed into object[], annotation lost
void Process(object[] args) {
    Type t = (Type)args[0];  // IL2072: annotation lost through boxing
    Evaluate(t, ...);
}

// FIXED: Pass Type as a separate, annotated parameter
void Process(
    object[] args,
    [DynamicallyAccessedMembers(DynamicallyAccessedMemberTypes.PublicMethods)] Type calleeType,
    ...) {
    Evaluate(calleeType, ...);  // annotation flows cleanly
}

Common patterns that break flow and how to fix them:

  • object[] parameter bags: Extract the Type into a dedicated annotated parameter
  • Dictionary/List storage: Use a typed field with annotation instead
  • Interface indirection: Add annotation to the interface method's parameter
  • Property with boxing getter: Annotate the property's return type
Show full SKILL.md (696 more words)Show less
Strategy C: Source-generated JSON serialization (batch fix)

When most warnings are IL2026/IL3050 from JsonSerializer.Serialize/Deserialize, this is a single mechanical fix applied in bulk:

  1. Collect affected types — grep for all JsonSerializer.Serialize and JsonSerializer.Deserialize call sites. Extract the type being serialized (the <T> in Deserialize<T>, or the runtime type of the object in Serialize).

  2. Create one JsonSerializerContext with [JsonSerializable] for every type found. Skip types from external packages (e.g., ResponseError from Azure.Core) — they won't source-generate for types you don't own. Handle external types separately via Gotcha #1 below.

csharp
[JsonSerializerContext]
[JsonSerializable(typeof(ManagedServiceIdentity))]
[JsonSerializable(typeof(SystemData))]
// ... one attribute per type YOU OWN
// Do NOT add types from external packages (e.g., ResponseError)
internal partial class MyProjectJsonContext : JsonSerializerContext { }
  1. Batch-update all call sites — do not read each file individually. Apply the pattern mechanically:

    • JsonSerializer.Serialize(obj) → JsonSerializer.Serialize(obj, MyProjectJsonContext.Default.TypeName)
    • JsonSerializer.Deserialize<T>(json) → JsonSerializer.Deserialize(json, MyProjectJsonContext.Default.TypeName)

    Find and update all call sites in one pass:

    bash
    # Find all files with JsonSerializer calls
    grep -rl 'JsonSerializer\.\(Serialize\|Deserialize\)' src/ --include='*.cs'

    Then use sequential edit calls to apply the same transformation to every matching file. Do not use sed for C# code — generics like Deserialize<T>() have angle brackets and nested parentheses that sed will mangle.

  2. Build once to verify. Remaining warnings will be non-serialization issues — handle those with Strategies A–B or D.

Strategy D: [RequiresUnreferencedCode] (last resort)

When a method fundamentally requires arbitrary reflection that cannot be statically described:

csharp
[RequiresUnreferencedCode("Loads plugins by name using Assembly.Load")]
public void LoadPlugin(string assemblyName) {
    var asm = Assembly.Load(assemblyName);
    // ...
}

This propagates to callers — they must also be annotated with [RequiresUnreferencedCode]. Use sparingly; it marks the entire call chain as trim-incompatible.

Step 5: Rebuild and repeat

After each small batch of fixes (5-10 warnings), rebuild with --no-incremental and check for new warnings. Do not attempt to fix all warnings before rebuilding — frequent rebuilds catch mistakes early and reveal cascading warnings. Fixes cascade — annotating an inner method may surface warnings in its callers. Repeat until 0 Warning(s).

Step 6: Validate all TFMs

Build all target frameworks to ensure:

  • 0 IL warnings on net8.0+ TFMs
  • No NETSDK1210 warnings (the IsAotCompatible condition handles this)
  • Clean builds on older TFMs (netstandard2.0, net472, etc.)
bash
dotnet build <project.csproj>  # builds all TFMs

Stop Signals

  • Do not analyze more than 2-3 representative files per warning pattern. After identifying the fix for a pattern, apply it to all matching files without reading each one first.
  • Start fixing after one build. Do not do a second analysis pass — begin implementing fixes for the most common warning pattern immediately after Step 3 triage.
  • Stop after achieving 0 IL warnings for net8.0+ TFMs. Don't optimize or refactor already-clean annotations.
  • If a warning requires architectural refactoring beyond annotation flow fixes (e.g., replacing an entire serialization layer), document it and stop — don't rewrite large subsystems.
  • Limit to 3 build-fix iterations per warning. If annotation flow doesn't resolve it after 3 attempts, escalate to [RequiresUnreferencedCode].
  • Don't chase warnings in third-party dependencies you can't modify. Note them and move on.
  • If the user asked a scoped question (e.g., "fix warnings in this file"), don't expand to the entire project.

Polyfills for Older TFMs

For multi-targeting projects that include netstandard2.0 or net472, you need polyfills for DynamicallyAccessedMembersAttribute and related types. See references/polyfills.md.

Common Gotchas

  1. External types without AOT-safe serialization: When a type comes from a dependency you can't modify (e.g., ResponseError from Azure.Core) and it lacks a source-generated serializer, Options.GetConverter<T>() is reflection-based and will produce IL warnings. First check if the type implements IJsonModel<T> (common in Azure SDK) — if so, bypass JsonSerializer entirely:
csharp
// Before (IL2026 — JsonSerializer uses reflection):
JsonSerializer.Serialize(writer, errorValue);

// After (AOT-safe — uses IJsonModel directly):
((IJsonModel<ResponseError>)errorValue).Write(writer, ModelReaderWriterOptions.Json);

// For deserialization:
var error = ((IJsonModel<ResponseError>)new ResponseError()).Create(ref reader, ModelReaderWriterOptions.Json);

Do not add the external type to your JsonSerializerContext — it won't source-generate for types you don't own. If the type doesn't implement IJsonModel<T>, write a custom JsonConverter<T> with manual Utf8JsonReader/Utf8JsonWriter logic and register it via [JsonSourceGenerationOptions] on your context.

  1. Serialization libraries: Most reflection-based serializers (e.g., Newtonsoft.Json, XmlSerializer) are not AOT-compatible. Migrate to a source-generation-based serializer such as System.Text.Json with a JsonSerializerContext. If migration is not feasible, mark the serialization call site with [RequiresUnreferencedCode].

  2. Shared projects / projitems: When source is shared between multiple projects via <Import>, annotations added to shared code affect ALL consuming projects. Verify that all consumers still build cleanly.

References

Limitations Conceptual: Understanding trimming How-to: trim compat

Checklist

  • Added <IsAotCompatible> with TFM condition to .csproj
  • Built with AOT analyzers enabled (net8.0+ TFM)
  • Fixed all IL warnings via annotations or refactoring
  • No #pragma warning disable or [UnconditionalSuppressMessage] used for any IL warning
  • Polyfills present for older TFMs if needed
  • All target frameworks build with 0 warnings
  • Verified shared/linked source doesn't break sibling projects

© dotnet, MIT. Rendered from Markdown: HTML in the file is shown as text, images as links, and headings moved down two levels. Raw file

Files

SKILL.md and 1 other file (references) in plugins/dotnet-upgrade/skills/dotnet-aot-compat of dotnet/skills.

  • SKILL.md
  • references/polyfills.md

Open the folder on GitHubat commit 8d670fa

Used in 2 other repositories

We found 3 copies of this SKILL.md (exact, near-identical or edited) in other folders, from 2 other GitHub owners. This page covers the copy in dotnet/skills, which our catalogue first saw on October 7, 2026.

Compare with similar skills

.NET Native AOT Compatibility next to the 5 skills that share the most tags, products or categories with it. Stars are the repository's; “used in” counts other GitHub owners with a copy.

.NET Native AOT Compatibility compared with similar skills
SkillStarsUsed inTokensAuto-checkLicenceRepo updated
.NET Native AOT Compatibility this skilldotnet/skills5.6k2 repos~4.2kAutomated safety check: PassMIT
Dynamo Dotnet ExpertDynamoDS/Dynamo2k—~909Automated safety check: PassApache-2.0
Systematic Code Refactoringluongnv89/claude-howto42k—~3kAutomated safety check: PassMIT
Dignified Python Standardsdocling-project/docling68k—~1.5kAutomated safety check: PassApache-2.0
Clean Code GuardamElnagdy/guard-skills1.3k2 repos~4.3kAutomated safety check: PassMIT
Code Refactoring Workflowluongnv89/claude-howto42k—~3.1kAutomated safety check: PassMIT

Similar skills

  • Dynamo Dotnet Expert

    DynamoDS/Dynamo

    Write and review C/.NET code in Dynamo following Dynamo coding standards, modern C patterns, and repo conventions.

    2k GitHub stars~909 tokensUpdated today
    DevelopmentAuto-check passed
  • Systematic Code Refactoring

    luongnv89/claude-howto

    Guides refactoring in phases based on Martin Fowler's method: research, test coverage check, planning and small tested steps, with your approval at each phase.

    42k GitHub stars~3k tokensUpdated 7 days ago
    DevelopmentAuto-check passed
  • Dignified Python Standards

    docling-project/docling

    Applies opinionated production Python conventions chosen by the project's Python version: modern type syntax, pathlib, explicit checks and interface guidance.

    68k GitHub stars~1.5k tokensUpdated yesterday
    DevelopmentAuto-check passed
  • Clean Code Guard

    amElnagdy/guard-skills

    Reviews generated or changed production code against Clean Code, SOLID, DRY, KISS, YAGNI and LLM-specific failure modes before it ships, in any language.

    1.3k GitHub starsUsed in 2 repos~4.3k tokens
    DevelopmentAuto-check passed
  • Code Refactoring Workflow

    luongnv89/claude-howto

    Guides systematic, test-backed refactoring in the style of Martin Fowler, moving through research, planning and small incremental changes with your approval at each phase.

    42k GitHub stars~3.1k tokensUpdated 7 days ago
    DevelopmentAuto-check passed
  • A code-change gate for the iPolloWork repository: search and reuse first, keep one source of truth, justify every new file or dependency, and audit the change.

    6.7k GitHub stars~2.7k tokensUpdated yesterday
    DevelopmentAuto-check passed

More from dotnet/skills

All 91 skills in this repo
  • Official

    Resolves .NET runtime frames in Apple .ips crash logs to function names, source files and line numbers using dSYM symbols, atos and the Microsoft symbol server.

    5.6k GitHub starsUsed in 1 repo~2.4k tokens
    Auto-check passed
  • Official

    Resolves native crash frames from .NET Android tombstones to function names, source files and line numbers using BuildIds, Microsoft's symbol server and llvm-symbolizer.

    5.6k GitHub starsUsed in 1 repo~2.1k tokens
    Auto-check passed
  • Official

    Scans C# and .NET code for about 50 performance anti-patterns and reports prioritized findings with concrete fixes, at a scan depth you choose.

    5.6k GitHub starsUsed in 3 repos~3.1k tokens
    Auto-check passed
  • Official

    Statically pairs source files with test files to list code that no test references, using Roslyn for C# or tree-sitter for many languages, with no build.

    5.6k GitHub starsUsed in 1 repo~3.3k tokens
    Auto-check passed
  • Microbenchmarking

    dotnet/skills

    Official

    Activate this skill when BenchmarkDotNet (BDN) is involved in the task — creating, running, configuring, or reviewing BDN benchmarks.

    5.6k GitHub starsUsed in 3 repos~3.3k tokens
    Auto-check passed
  • Official

    Configures automatic crash dumps or captures dumps from running processes for modern .NET apps on Linux, macOS and Windows, including Docker and Kubernetes.

    5.6k GitHub starsUsed in 2 repos~1.1k tokens
    Auto-check passed

Works with

Categories

Questions about .NET Native AOT Compatibility

What does .NET Native AOT Compatibility do?

Makes .NET projects compatible with Native AOT and trimming by resolving IL trim and AOT analyzer warnings through annotations rather than suppressions. csproj`.0 or later with the matching SDK.

When should I use .NET Native AOT Compatibility?

.NET Native AOT Compatibility fits situations like: making a library or app AOT-compatible; fixing trimming and IL analyzer warnings after upgrading to net8.0; adding DynamicallyAccessedMembers annotations to reflection code.

How do I install .NET Native AOT Compatibility in Claude Code?

Run `npx skills add dotnet/skills --skill dotnet-aot-compat -a claude-code`. Or copy the skill folder (plugins/dotnet-upgrade/skills/dotnet-aot-compat in dotnet/skills) into .claude/skills/dotnet-aot-compat in your project. Claude Code loads it when a task matches its description.

How do I install .NET Native AOT Compatibility in Codex?

Run `npx skills add dotnet/skills --skill dotnet-aot-compat -a codex`. Or copy the skill folder (plugins/dotnet-upgrade/skills/dotnet-aot-compat in dotnet/skills) into .agents/skills/dotnet-aot-compat in your project. Codex loads it when a task matches its description.

Can I use .NET Native AOT Compatibility in Cursor, Gemini CLI or GitHub Copilot?

Cursor, Gemini CLI, GitHub Copilot and OpenCode also load SKILL.md folders. With the skills CLI, run `npx skills add dotnet/skills --skill dotnet-aot-compat -a cursor` (or -a gemini-cli, github-copilot or opencode for the others). To copy it by hand, put the folder in .cursor/skills/dotnet-aot-compat, .gemini/skills/dotnet-aot-compat, .github/skills/dotnet-aot-compat and .opencode/skills/dotnet-aot-compat in your project.

What does .NET Native AOT Compatibility need to run?

Going by SKILL.md and its folder, .NET Native AOT Compatibility needs the command-line tools its instructions call (dotnet). Our summary lists: .NET SDK and a project targeting net8.0 or later.

Does .NET Native AOT Compatibility access the network?

SKILL.md names 1 domain. As links in the text: learn.microsoft.com. This is read from the text; nothing was executed.

Is .NET Native AOT Compatibility safe to install?

Our automated static check of SKILL.md found no risky patterns, such as piping downloads into a shell, reading credential files or hidden Unicode. It is not a guarantee. Review the folder before installing.

What licence does .NET Native AOT Compatibility use?

.NET Native AOT Compatibility is published under the MIT licence (declared in SKILL.md). It allows redistribution, so the full SKILL.md is shown on this page.

How many tokens does .NET Native AOT Compatibility use?

About 4.2k tokens (SKILL.md is roughly 17k characters). Agents keep only the skill's name and description in context until a task matches; then they load SKILL.md in full. Its references folder adds about 407 tokens, read only when the agent opens those files.

What are the alternatives to .NET Native AOT Compatibility?

Skills that share tags, products or a category with .NET Native AOT Compatibility: Dynamo Dotnet Expert (DynamoDS/Dynamo, 2k stars), Systematic Code Refactoring (luongnv89/claude-howto, 42k stars), Dignified Python Standards (docling-project/docling, 68k stars) and Clean Code Guard (amElnagdy/guard-skills, 1.3k stars). The comparison table on this page puts their stars, adoption, token cost, safety result and licence side by side.

Who maintains .NET Native AOT Compatibility?

dotnet (a GitHub organization, an official publisher) maintains it in dotnet/skills, which has 5,568 GitHub stars. The repository holds 91 skills in this directory. The repository was last updated on October 7, 2026.

Source: dotnet/skills on GitHub. Facts on this page come from the repository at the commit we read; the author's words are quoted as theirs.