AotAssemblyScan 0.1.3

dotnet add package AotAssemblyScan --version 0.1.3
                    
NuGet\Install-Package AotAssemblyScan -Version 0.1.3
                    
This command is intended to be used within the Package Manager Console in Visual Studio, as it uses the NuGet module's version of Install-Package.
<PackageReference Include="AotAssemblyScan" Version="0.1.3" />
                    
For projects that support PackageReference, copy this XML node into the project file to reference the package.
<PackageVersion Include="AotAssemblyScan" Version="0.1.3" />
                    
Directory.Packages.props
<PackageReference Include="AotAssemblyScan" />
                    
Project file
For projects that support Central Package Management (CPM), copy this XML node into the solution Directory.Packages.props file to version the package.
paket add AotAssemblyScan --version 0.1.3
                    
#r "nuget: AotAssemblyScan, 0.1.3"
                    
#r directive can be used in F# Interactive and Polyglot Notebooks. Copy this into the interactive tool or source code of the script to reference the package.
#:package AotAssemblyScan@0.1.3
                    
#:package directive can be used in C# file-based apps starting in .NET 10 preview 4. Copy this into a .cs file before any lines of code to reference the package.
#addin nuget:?package=AotAssemblyScan&version=0.1.3
                    
Install as a Cake Addin
#tool nuget:?package=AotAssemblyScan&version=0.1.3
                    
Install as a Cake Tool

AotAssemblyScan

AotAssemblyScan is a library designed to enhance assembly scanning by leveraging source generators instead of traditional C# reflection. It streamlines the process of discovering types in assemblies, improving performance and flexibility.

How to use

Using the library is straightforward. Here's how:

  1. Add a nuget package
    dotnet add package AotAssemblyScan
    
  2. Define a partial method and annotate it with the [AssemblyScan] attribute.
  3. Add other attributes to filter the types based on your requirements.

Example:

using AotAssemblyScan;

public static partial class AssemblyUtils
{
    [AssemblyScan]
    [IsInterface(false), IsAbstract(false)]
    [HasAttribute<MarkerAttribute>, HasAttribute<Marker2Attribute>]
    [IsAssignableTo<IMarkerInterface>, IsAssignableTo<IMarkerInterface2>]
    public static partial IReadOnlyList<Type> GetMarkedTypes();
}

For more details, check out the sample project.

Limitations

To ensure source code generation, your method must meet certain criteria. If these aren’t followed, the generator will not produce any output.

Signature

  • The method must be non-generic and accept no parameters.
  • It must return one of the following types:
    • IEnumerable<Type>
    • IReadOnlyList<Type>
    • ICollection<Type>
    • IList<Type>
    • Type[]

Selection criteria

Currently, the library offers several filters to fine-tune your assembly scanning:

[IAssignableTo<T>]

Includes types that are assignable to the specified type T. The type must either inherit from T, implement T if it's an interface, or be T itself.

[HasAttribute<T>]

Includes types that have the specified attribute T.

[IsInterface(isInsterface = true | false)]

Includes types based on whether they’re interfaces. Set isInterface to true to include interfaces, or false to include only non-interface types.

[IsAbstractClass(isAbstractClass = true | false)]

Includes types based on whether they’re abstract classes. Set isAbstractClass to true for abstract types and false for non-abstract types.

Benchmarks

This benchmark is available in the repository and compares AotAssemblyScan against traditional reflection. Here are the results:

<img src="img/repo-sample-benchmark.png" alt="Repository Sample Benchmark">

This benchmark was conducted in a project with over 40,000 lines of code that we run in production. Although the exact code can’t be shared, the results highlight the library’s real-world performance. Hope, I’ll be running more benchmarks using a large open-source project to see how AotAssemblyScan holds up in different environments.

<img src="img/enterprise-app-benchmark.png" alt="Enterprise App Benchmark">

Product Compatible and additional computed target framework versions.
.NET net5.0 was computed.  net5.0-windows was computed.  net6.0 was computed.  net6.0-android was computed.  net6.0-ios was computed.  net6.0-maccatalyst was computed.  net6.0-macos was computed.  net6.0-tvos was computed.  net6.0-windows was computed.  net7.0 was computed.  net7.0-android was computed.  net7.0-ios was computed.  net7.0-maccatalyst was computed.  net7.0-macos was computed.  net7.0-tvos was computed.  net7.0-windows was computed.  net8.0 was computed.  net8.0-android was computed.  net8.0-browser was computed.  net8.0-ios was computed.  net8.0-maccatalyst was computed.  net8.0-macos was computed.  net8.0-tvos was computed.  net8.0-windows was computed.  net9.0 was computed.  net9.0-android was computed.  net9.0-browser was computed.  net9.0-ios was computed.  net9.0-maccatalyst was computed.  net9.0-macos was computed.  net9.0-tvos was computed.  net9.0-windows was computed.  net10.0 was computed.  net10.0-android was computed.  net10.0-browser was computed.  net10.0-ios was computed.  net10.0-maccatalyst was computed.  net10.0-macos was computed.  net10.0-tvos was computed.  net10.0-windows was computed. 
.NET Core netcoreapp2.0 was computed.  netcoreapp2.1 was computed.  netcoreapp2.2 was computed.  netcoreapp3.0 was computed.  netcoreapp3.1 was computed. 
.NET Standard netstandard2.0 is compatible.  netstandard2.1 was computed. 
.NET Framework net461 was computed.  net462 was computed.  net463 was computed.  net47 was computed.  net471 was computed.  net472 was computed.  net48 was computed.  net481 was computed. 
MonoAndroid monoandroid was computed. 
MonoMac monomac was computed. 
MonoTouch monotouch was computed. 
Tizen tizen40 was computed.  tizen60 was computed. 
Xamarin.iOS xamarinios was computed. 
Xamarin.Mac xamarinmac was computed. 
Xamarin.TVOS xamarintvos was computed. 
Xamarin.WatchOS xamarinwatchos was computed. 
Compatible target framework(s)
Included target framework(s) (in package)
Learn more about Target Frameworks and .NET Standard.

NuGet packages

This package is not used by any NuGet packages.

GitHub repositories

This package is not used by any popular GitHub repositories.

Version Downloads Last Updated
0.1.3 301 12/5/2024
0.1.2 169 12/2/2024
0.1.1 183 12/2/2024

Downgraded Microsoft.CodeAnalysis.CSharp to 4.3.0 since it wasn't compatible with some of the build tools