Pièges du Store #4 : Le trimming .NET a supprimé les liaisons WinUI 3
2026-05-31
Tags: Windows · Microsoft Store · Pièges du Store
Ce problème remonte à mes débuts. En écrivant la série Pièges du Store, je suis tombé sur un ancien e-mail de rejet — j'espère que ce billet servira de référence aux développeurs qui débutent avec la publication WinUI 3 / .NET.
Ce qui s'est passé
Mon application WinUI 3 a été soumise à la certification du Microsoft Store. Le rapport de certification est revenu :
Status: Attention needed
10.1.2.10 Functionality
Unusable Feature: "Download to local cache", "Open File" - The product fails to download copied items to local cache and "Open File" button in the product is not usable
Attendez — j'avais testé en local, et « Download to local cache » ainsi que « Open File » fonctionnaient correctement. Pourquoi cela ne marchait-il pas sur la machine de test de Microsoft ?
Investigation
La différence la plus suspecte : j'utilisais un build Debug en local, alors que la soumission au Store était un build Release. En examinant le fichier .csproj, j'ai trouvé une différence clé entre les configurations Debug et Release :
<!-- Debug -->
<PublishTrimmed>False</PublishTrimmed>
<!-- Release -->
<PublishTrimmed Condition="'$(Configuration)' != 'Debug'">True</PublishTrimmed>Le build Release avait le trimming .NET activé.
Qu'est-ce que le trimming .NET
Le trimming .NET est une fonctionnalité d'optimisation du SDK .NET. Lors de la publication de l'application, le trimmer effectue une analyse statique pour identifier les assemblys, types et méthodes qui ne sont jamais directement référencés dans le code, puis les supprime pour réduire la taille de l'application.
Le problème : le trimmer ne voit que les références statiques. Si le code accède à un type via la réflexion à l'exécution, mais qu'aucune référence statique n'existe au moment de la compilation, le trimmer considère ce type comme « inutilisé » et le supprime.
Pourquoi WinUI 3 est particulièrement vulnérable
WinUI 3 et sa couche d'interopérabilité WinRT sous-jacente reposent largement sur la réflexion et les fonctionnalités dynamiques. Les liaisons {Binding} traditionnelles, les convertisseurs de valeur et la réflexion sur les métadonnées d'interopérabilité WinRT produisent tous des appels d'exécution que l'analyse statique du trimmer ne peut pas suivre. Lorsque le trimmer supprime les modèles de données, commandes, convertisseurs et autres types nécessaires aux liaisons, les traitant comme « inutilisés », les liaisons ne peuvent pas trouver leurs cibles à l'exécution — les boutons cessent de fonctionner, le texte ne se met plus à jour. Pas d'erreur, pas de crash, les choses cessent simplement de fonctionner.
Solution
La méthode la plus directe : désactiver le trimming dans le .csproj :
- <PublishTrimmed Condition="'$(Configuration)' != 'Debug'">True</PublishTrimmed>
+ <PublishTrimmed>False</PublishTrimmed>Reconstruire le paquet et soumettre à nouveau — la certification est passée.
Si vous avez vraiment besoin du trimming pour réduire la taille du paquet, vous pouvez aussi le rendre compatible :
- Appliquer les attributs
[DynamicDependency]ou[DynamicallyAccessedMembers]sur les types nécessaires pour indiquer au trimmer de les conserver - Configurer
<TrimmerRootAssembly>dans le.csprojpour conserver un assembly entier
Mais pour la plupart des applications WinUI 3, désactiver simplement le trimming reste le choix le plus simple.
En résumé
- Le trimming .NET supprime le code qu'il considère comme « inutilisé », mais ne peut pas identifier les appels réflexifs
- Les liaisons de données WinUI 3 dépendent de la réflexion et sont facilement supprimées par erreur
- Si une application WinUI 3 présente des « fonctionnalités inutilisables » lors de la certification du Store mais fonctionne correctement en local, le trimming est la première chose à vérifier
- Les builds Debug n'utilisent pas le trimming par défaut, les builds Release peuvent l'activer — testez toujours le build Release/Publish avant de soumettre au Store
- Nous prévoyons un prochain article avec des conseils de test avant soumission au Store — restez à l'écoute
Partie de la série Pièges du Store.