AotAssemblyScan 0.1.3
dotnet add package AotAssemblyScan --version 0.1.3
NuGet\Install-Package AotAssemblyScan -Version 0.1.3
<PackageReference Include="AotAssemblyScan" Version="0.1.3" />
<PackageVersion Include="AotAssemblyScan" Version="0.1.3" />
<PackageReference Include="AotAssemblyScan" />
paket add AotAssemblyScan --version 0.1.3
#r "nuget: AotAssemblyScan, 0.1.3"
#:package AotAssemblyScan@0.1.3
#addin nuget:?package=AotAssemblyScan&version=0.1.3
#tool nuget:?package=AotAssemblyScan&version=0.1.3
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:
- Add a nuget package
dotnet add package AotAssemblyScan - Define a partial method and annotate it with the
[AssemblyScan]attribute. - 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 | Versions 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. |
-
.NETStandard 2.0
- Microsoft.CodeAnalysis.CSharp (>= 4.3.0)
NuGet packages
This package is not used by any NuGet packages.
GitHub repositories
This package is not used by any popular GitHub repositories.
Downgraded Microsoft.CodeAnalysis.CSharp to 4.3.0 since it wasn't compatible with some of the build tools