Skip to content

NativeAOT and DependencyInjection is broken #81779

@eerhardt

Description

@eerhardt

Description

It looks like #81532 has broken NativeAOT + DependencyInjection.

Reproduction Steps

dotnet publish the following app:

<Project Sdk="Microsoft.NET.Sdk">

  <PropertyGroup>
    <TargetFramework>net8.0</TargetFramework>
    <OutputType>exe</OutputType>
    <Nullable>enable</Nullable>
    <ImplicitUsings>enable</ImplicitUsings>
    <PublishAot>true</PublishAot>
    <RuntimeFrameworkVersion>8.0.0-preview.2.23107.1</RuntimeFrameworkVersion>
  </PropertyGroup>
  <ItemGroup>
    <PackageReference Include="Microsoft.Extensions.DependencyInjection" Version="$(RuntimeFrameworkVersion)" />
  </ItemGroup>
</Project>
using Microsoft.Extensions.DependencyInjection;
using System.Diagnostics.CodeAnalysis;

var services = new ServiceCollection();
services.AddTransient(typeof(IOptionsFactory<>), typeof(OptionsFactory<>));

var sp = services.BuildServiceProvider();

var options = sp.GetRequiredService<IOptionsFactory<RouteHandlerOptions>>().Create();
Console.WriteLine(options.ToString());


public sealed class RouteHandlerOptions
{
    public RouteHandlerOptions() { }

    public bool ThrowOnBadRequest { get; set; }
}

public interface IOptionsFactory<[DynamicallyAccessedMembers(DynamicallyAccessedMemberTypes.PublicParameterlessConstructor)] TOptions>
    where TOptions : class
{
    TOptions Create();
}

public class OptionsFactory<[DynamicallyAccessedMembers(DynamicallyAccessedMemberTypes.PublicParameterlessConstructor)] TOptions> :
    IOptionsFactory<TOptions>
    where TOptions : class
{
    public TOptions Create()
    {
        return Activator.CreateInstance<TOptions>();
    }
}

Expected behavior

The app should print RouteHandlerOptions.

Actual behavior

The app fails:

Unhandled Exception: System.MissingMethodException: Constructor on type 'RouteHandlerOptions' not found.
   at System.Activator.CreateInstance[T]() + 0x78
   at Program.<Main>$(String[] args) + 0x9c
   at Net8Api!<BaseAddress>+0x170849

Regression?

Yes. This worked in previous builds.

Known Workarounds

No response

Configuration

No response

Other information

cc @vitek-karas

Metadata

Metadata

Assignees

Type

No type

Projects

No projects

Milestone

No milestone

Relationships

None yet

Development

No branches or pull requests

Issue actions