Nel .NET Framework e fino alla versione 3 di .NET Core, per eseguire codice di inizializzazione una libreria siamo stati costretti a usare strumenti di post compilazione come PostSharp o Mono.Cecil (solo per citarne alcuni), oppure abbiamo messo a disposizione un metodo Startup, Initialize o simile che doveva essere invocato in fase di startup dell'applicazione da chi utilizza la libreria. Entrambi i metodi sono delle soluzioni a un problema strutturale di .NET: non esiste un modo per eseguire codice quando una libreria viene caricata.
Con .NET 5 il discorso cambia, in quanto possiamo creare un metodo e decorarlo con l'attributo ModuleInitializerAttribute. In fase di compilazione un source generator già presente in .NET prende il codice di questo metodo e lo prepara per essere eseguito subito dopo il caricamento della libreria.
using System; using System.Runtime.CompilerServices; namespace ModuleInitializers { class Program { static void Main(string[] args) { Console.WriteLine("Hello World!"); } } class MyInitializer { [ModuleInitializer] public static void Init() { Console.Write("Initialized"); } } }
Per poter essere marcato come module initializer, il metodo:
- deve essere marcato come static;
- non deve accettare parametri;
- deve tornare void;
- non deve essere generic e non deve essere contenuto in una classe generic;
- deve essere internal o public e non può essere una local function.
Commenti
Per inserire un commento, devi avere un account.
Fai il login e torna a questa pagina, oppure registrati alla nostra community.
Approfondimenti
Usare le collection expression per inizializzare una lista di oggetti in C#
Eseguire operazioni sui blob con Azure Storage Actions
Sostituire la GitHub Action di login su private registry
Evitare la script injection nelle GitHub Actions
Eseguire una GroupBy per entity in Entity Framework
Sfruttare i KeyedService in un'applicazione Blazor in .NET 8
Disabilitare automaticamente un workflow di GitHub (parte 2)
Modificare i metadati nell'head dell'HTML di una Blazor Web App
Eseguire attività pianificate con Azure Container Jobs
Utilizzare i primary constructor di C# per inizializzare le proprietà
Utilizzare la versione generica di EntityTypeConfiguration in Entity Framework Core
Sfruttare lo stream rendering per le pagine statiche di Blazor 8
I più letti di oggi
- C# 4
- Spaziatura tra i caratteri in Silverlight 5
- ecco tutte le novità pubblicate sui nostri siti questa settimana: https://aspit.co/wkly buon week-end!
- Segui in tempo reale il TechEd 2004
- da oggi è possibile fare login velocemente con LinkedIn e Google. a questi si aggiunge il supporto già attivo per Facebook, Twitter, Microsoft Account, Windows Hello e OpenID, per darvi sempre più possibilità di accedere semplicemente alla nostra community! #aspitalia
- Migrare una service connection a workload identity federation in Azure DevOps
- Evitare postback multipli in un UpdatePanel