Microsoft présente les MAJ d'ASP.NET Core dans .NET, notamment le code C et C++ dans Blazor WebAssembly, la sortie de Visual Studio 2022 annoncée pour novembre

L’équipe de développement de .NET, le Framework de développement de Microsoft pour les applications d'entreprises, a présenté le 12 octobre son habituelle série mensuelle d'informations sur .NET. « .NET 6 Release Candidate 2 (RC2) est maintenant disponible. .NET 6 RC2 est très proche de la version finale de .NET 6 que nous prévoyons de publier en novembre de cette année, à temps pour la conférence .NET 2021. Il s'agit également d'une version "go live", vous êtes donc invités à l'utiliser en production. La version RC2 de .NET 6 contient principalement des améliorations de la qualité et des corrections de bogues, bien qu'elle contienne également quelques nouvelles fonctionnalités », a déclaré Microsoft dans un billet de blog.

Microsoft .NET est le nom donné à un ensemble de produits et de technologies informatiques de l'entreprise Microsoft pour rendre des applications facilement portables sur Internet. Le mois dernier, Microsoft a annoncé la sortie de la première release candidate de .NET 6, disponible pour Linux, macOS et Windows. Cette version apportait des solutions aux problèmes fonctionnels et les régressions des fonctionnalités. .NET 6 RC1 avait été testé et pris en charge par la Preview 4 de Visual Studio 2022 qui permet de tirer parti des outils Visual Studio développés pour .NET 6, tels que le développement dans .NET MAUI, Hot Reload pour les applications C#, le nouveau Live Preview pour WebForms, et d'autres améliorations de performances dans l’expérience avec l’IDE.

Nom : ASP CORE.png
Affichages : 48692
Taille : 3,1 Ko

La version RC2 de .NET 6 contient principalement des améliorations de la qualité et des corrections de bogues sur ASP.NET Core, bien qu'elle contienne également quelques nouvelles fonctionnalités. Une nouvelle fonctionnalité clé est arrivée dans le cadre Blazor pour les applications Web. Rappelons qu'ASP.NET Core est un Framework Web gratuit et open-source, développé par Microsoft. Il est plus performant qu'ASP.NET. C'est un Framework modulaire qui fonctionne à la fois avec le Framework .NET, sous Windows et .NET Core en multiplateforme.

Dépendances natives pour les applications Blazor WebAssembly

Les applications Blazor WebAssembly dans .NET 6 peuvent maintenant utiliser des dépendances natives qui ont été construites pour fonctionner avec WebAssembly. Le responsable principal du programme, Daniel Roth, a décrit les dépendances natives pour les applications Blazor WebAssembly (Wasm), ce qui signifie que « tout code natif portable peut être utilisé comme dépendance native. » Cela signifie à son tour que le code C, par exemple, peut être appelé à partir du code C# exécuté dans le navigateur. Le code C# et le code C seront compilés en Wasm, donc techniquement, cela peut sembler une petite étape, mais c'est joliment emballé pour fonctionner de la même manière que l'interopérabilité du code natif pour C# sur le serveur ou le bureau.

La nouvelle fonctionnalité dépend d'un composant de Visual Studio appelé .NET WebAssembly build tools, qui installe un tas de choses, y compris la chaîne d'outils du compilateur Emscripten pour C++ et C. La principale limitation est que le code doit être portable, bien que d'autres codes (tels que ceux qui utilisent des variables int 64-bit) peuvent s'exécuter lentement puisque JavaScript n'a pas de type int 64-bit natif. Roth a cité en exemple la bibliothèque graphique 2D SkiaSharp, qui englobe la bibliothèque graphique native Skia et offre une prise en charge préalable de Blazor WebAssembly.

Il est possible de lier statiquement les dépendances natives au moteur d'exécution .NET WebAssembly à l'aide des outils de construction .NET WebAssembly, les mêmes outils qui sont utilisés dans .NET 6 pour compiler à l'avance (AOT) l’application Blazor vers WebAssembly ou pour lier à nouveau le moteur d'exécution afin de supprimer les fonctionnalités inutilisées.

Pour installer les outils de compilation .NET WebAssembly, il faut sélectionner le composant facultatif dans le programme d'installation de Visual Studio ou exécutez dotnet workload install wasm-tools à partir d'une invite de commande élevée. Les outils de construction .NET WebAssembly sont basés sur Emscripten, une chaîne d'outils de compilation pour la plateforme Web.

L’ajout des éléments NativeFileReference dans un fichier de projet permet d’ajouter des dépendances natives aux applications Blazor WebAssembly. Lorsque le projet est construit, chaque NativeFileReference est transmise à Emscripten par les outils de construction de .NET WebAssembly afin qu'elle soit compilée et liée au runtime.

En général, tout code natif portable peut être utilisé comme dépendance native avec Blazor WebAssembly. Il est possible d’ajouter des dépendances natives au code C/C++ ou au code précédemment compilé à l'aide d'Emscripten : fichiers objets (.o), fichiers d'archive (.a), bitcode (.bc), ou modules WebAssembly autonomes (.wasm). Les dépendances préconstruites doivent généralement être construites en utilisant la même version d'Emscripten que celle utilisée pour construire le moteur d'exécution .NET WebAssembly (actuellement 2.0.23).

Utilisation du code natif d'une application Blazor WebAssembly

Pour ajouter une simple fonction C native à une application Blazor WebAssembly, il faut :
  1. Créez un nouveau projet Blazor WebAssembly ;
  2. Ajoutez un fichier Test.c au projet;
  3. Ajoutez une fonction C dans Test.c pour calculer des factorielles.


Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
int fact(int n)
{
    if (n == 0) return 1;
    return n * fact(n - 1);
}

Ajoutez une NativeFileReference pour Test.c dans le fichier de projet :

Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
<ItemGroup>
  <NativeFileReference Include="Test.c" />
</ItemGroup>

Dans Pages/Index.razor, ajoutez une DllImport [/I]pour la fonction fact dans la bibliothèque Test générée :

Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
@using System.Runtime.InteropServices
 
...
 
@code {
    [DllImport("Test")]
    static extern int fact(int n);
}

Appelez la méthode fact depuis votre code .NET.

Lorsque une application est construite avec les outils de construction .NET WebAssembly installés, le code C natif est compilé et lié dans dotnet.wasm. Cela peut prendre quelques minutes. Une fois la construction de l'application terminée, Microsoft recommande de l’exécuter pour voir la valeur factorielle rendue.

Utilisation de bibliothèques avec des dépendances natives


Les paquets NuGet peuvent contenir des dépendances natives à utiliser avec WebAssembly. Ces bibliothèques et leurs fonctionnalités natives peuvent alors être utilisées à partir de n'importe quelle application Blazor WebAssembly. Les fichiers pour les dépendances natives doivent être construits pour WebAssembly et empaquetés dans le dossier spécifique à l'architecture browser-wasm. Les dépendances spécifiques à WebAssembly ne seront pas référencées automatiquement et devront être référencées manuellement en tant que NativeFileReference.

Les auteurs de paquets peuvent choisir d'ajouter les références natives en incluant un fichier .props dans le paquet avec les références. SkiaSharp est une bibliothèque graphique 2D multiplateforme pour .NET, basée sur la bibliothèque graphique native Skia, et elle prend désormais en charge, Blazor WebAssembly en version preview.

Pour utiliser SkiaSharp dans une application Blazor WebAssembly :

  1. Ajoutez une référence au paquet SkiaSharp.Views.Blazor à partir de votre projet Blazor WebAssembly
    dotnet add package -prerelease SkiaSharp.Views.Blazor ;
  2. Ajoutez un composant SKCanvasView à votre application.


Code : Sélectionner tout - Visualiser dans une fenêtre à part
<SKCanvasView OnPaintSurface="OnPaintSurface" />

Ajoutez une logique de dessin :

Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
@code {
    void OnPaintSurface(SKPaintSurfaceEventArgs e)
    {
        var canvas = e.Surface.Canvas;
        canvas.Clear(SKColors.White);
        using var paint = new SKPaint
        {
            Color = SKColors.Black,
            IsAntialias = true,
            TextSize = 24
        };
        canvas.DrawText("SkiaSharp", 0, 24, paint);
    }
}
Lancez l'application pour voir le dessin personnalisé avec SkiaSharp

Nom : snarpB.png
Affichages : 3279
Taille : 45,3 Ko

Analyse du code source

Dans la RC2, l’équipe de développement de .NET a ajouté quelques analyseurs pour aider à trouver rapidement des problèmes ou pour avertir lorsqu'il y a des problèmes de configuration incorrecte pour le middleware. L'analyseur vérifiera l'ordre des intergiciels pour WebApplicationBuilder et avertira lorsqu'une configuration ou un ordre incorrect des intergiciels est détecté. Elle a également ajouté un support pour détecter lorsqu'un type qui implémente IActionResult est renvoyé par le gestionnaire de route et avertir de la sérialisation non intentionnelle du résultat en JSON. Voir l'exemple ci-dessous :

Code : Sélectionner tout - Visualiser dans une fenêtre à part
app.Map("/", () => new JsonResult(new { Hello = "World" }));

En outre, Microsoft a introduit un nouvel analyseur qui détectera lorsque des attributs sont placés sur une méthode appelée par un lambda au lieu du lambda lui-même. Par exemple, le code suivant produira un avertissement :

Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
app.Map("/payment", () => SubmitPayment());
[Authorize]
void SubmitPayment() { }

Enfin, pour les liaisons de paramètres optionnels, Microsoft a ajouté un analyseur qui lèvera une exception en cas d'incompatibilité entre les options des paramètres. La chaîne de route ci-dessous définit le paramètre uuid comme optionnel mais qu'il est défini comme requis dans la fonction lambda(string uuid) => $"{uuid}".

Code : Sélectionner tout - Visualiser dans une fenêtre à part
app.MapGet("/todo/{uuid?}", (string uuid) => $"{uuid}");

OpenAPI
L’équipe de développement de .NET a ajouté des améliorations pour permettre de décrire si le corps de la requête est requis ou non en utilisant la méthode d'extension Accepts<TRequest>() ou l'attribut [Consumes(typeof(Todo), "application/json", IsRequired = false)]. La méthode d'extension Accepts et l'attribut Consumes permettent d'exprimer à la fois le type Todo et le contentTypeapplication/json pour vos documents open-api générés, comme indiqué dans l'exemple ci-dessous.

Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
app.MapPost("/todo", async (HttpRequest request) =>
{
    var todo =  await request.Body.ReadAsJsonAsync<Todo>();
    return todo is Todo ? Results.Ok(todo) : Results.Ok();
})
.Accepts<Todo>(isRequired: false, contentType: "application/json");
 
app.MapPost("/todo", HandlePostTodo);
[Consumes(typeof(Todo), "application/json", IsRequired = false)]
IResult HandlePostTodo(HttpRequest request)
{
    var todo =  await request.Body.ReadAsJsonAsync<Todo>();
    return todo is Todo ? Results.Ok(todo) : Results.Ok();
}

Si les utilisateurs souhaitent regrouper des points d'extrémité connexes dans différentes collections dans les documents OpenAPI (Swagger), il est possible de le faire en utilisant la méthode d'extension WithTagsqui permet de fournir les métadonnées des balises de regroupement. Voir l'exemple d'utilisation ci-dessous :

Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
app.MapGet("/", () => "Hello World!")
    .WithTags("Examples");
 
app.MapGet("/todos/sample", () => new[]
    {
        new Todo { Id = 1, Title = "Do this" },
        new Todo { Id = 2, Title = "Do this too" }
    })
    .WithTags("Examples", "TodoApi");

C# 10

Le responsable du programme Richard Lander a fait remarquer que Visual Studio 2019 ne fonctionnera jamais avec .NET 6 ; les développeurs devront passer à Visual Studio 2022. Dans son message, il décrit également les caractéristiques de C#10, qui est livré avec .NET 6. C#10 apporte la prise en charge des structures d'enregistrement. Cette nouvelle fonctionnalité est similaire aux enregistrements C#9 (basés sur les classes), avec quelques différences essentielles. Pour l'essentiel, les structures d'enregistrement ont été ajoutées par souci d'exhaustivité, afin que les structures puissent bénéficier des mêmes avantages que les classes en matière d'enregistrement.

Cependant, Microsoft ne s'est pas contentée de structurer les enregistrements, mais a décidé d'aligner les enregistrements struct avec ValueTuple autant que les enregistrements de classe. En conséquence de cette approche de conception, les propriétés des structures d'enregistrement sont mutables par défaut, tandis que les propriétés des classes d'enregistrement sont immuables. Notons qu’il est possible de déclarer une structure d'enregistrement en lecture seule, qui est immuable et correspond à la sémantique de la classe d'enregistrement.

À un haut niveau, les structures d'enregistrement ne remplacent pas les classes d'enregistrement. Il est déconseillé de migrer des classes d'enregistrement vers les structures d'enregistrement. Les conseils concernant l'utilisation des classes par rapport aux structures s'appliquent également aux classes d'enregistrements et aux structures d'enregistrements. En d'autres termes, le choix entre classes et structures doit être fait avant de choisir d'utiliser des enregistrements.

Mise à jour de macOS et Windows Arm64


Il y a également quelques changements dans la façon dont .NET 6 prend en charge macOS. Lander a déclaré que le SDK Arm64, nécessaire pour prendre en charge Apple Silicon, permet désormais le développement à la fois sur Arm64 et x64, et il recommande donc aux développeurs d'utiliser uniquement le SDK Arm64. Dès que .NET 6 sera publié, le SDK Arm64 de .NET 5 ne sera plus pris en charge. Il est donc recommandé aux développeurs qui utilisent la version actuelle de changer rapidement.

« Nous avons de bonnes nouvelles, mais aussi des changements de rupture à partager. Le projet de prise en charge de macOS et Windows arm64 est presque terminé. Nous y travaillons depuis plus d'un an, avec l'aide, quand nous en avons eu besoin, des excellents membres des équipes macOS et Windows », a déclaré Richard Lander.

Au début, nous pensions que le projet ne concernait que la prise en charge d'Arm64 sur macOS et que Rosetta 2 couvrirait x64. En creusant un peu plus, il est devenu évident que la coexistence x64 + Arm64 était la plus grande tâche à accomplir, centrée sur le CLI et les installateurs, y compris quelques endroits où ils doivent s'accorder. Avec .NET 6 RC2, Microsoft publie des versions de .NET qui offrent une meilleure expérience.

Source : Microsoft (1, 2)

Et vous ?

Quel est votre avis sur le sujet ?

Quel MAJ de ASP.NET Core vous intéresse le plus ?

Quelles améliorations souhaiteriez-vous voir ?

Voir aussi :

Microsoft annonce la sortie de la première release candidate de .NET 6, disponible pour Linux, macOS et Windows, elle résout les problèmes fonctionnels et les régressions des fonctionnalités

Visual Studio 2022 Preview 4 est disponible et s'accompagne d'améliorations sur la productivité personnelle et d'équipe, le chargement à chaud dans ASP.NET Core et la gestion de thèmes

Microsoft améliore les performances de l'outil d'allocation d'objets .NET, un kit appartenant à la suite d'outils Performance Profiler

La première version EAP de ReSharper 2021.3 est disponible : prise en charge de Visual Studio 2022 Preview, support de C# 10 et bien d'autres améliorations et nouveautés