Skip to Content
Nouvelle version 12 disponible 🎉

Fusion des assemblies

Vous pouvez fusionner des assemblies avec l’outil en ligne de commande babel, la tâche MSBuild Babel ou Babel Desktop.

Les applications Avalonia ne peuvent pas être fusionnées. Avalonia compile le XAML de chaque assembly en types CompiledAvaloniaXaml propres à cet assembly et en un unique blob !AvaloniaResources, et résout les ressources au moyen d’URI avares://<AssemblyName>/… indexés par l’identité de l’assembly. La fusion des assemblies qui contiennent du XAML provoque des collisions entre ces types et ces ressources et rompt la résolution de avares:// à l’exécution. Pour distribuer une application Avalonia en un seul fichier, utilisez plutôt l’incorporation des assemblies, qui préserve l’identité de chaque assembly.

Fusionner depuis la ligne de commande

Avec l’outil babel, vous fusionnez des assemblies en indiquant l’assembly cible, suivi de la liste des fichiers d’assembly à fusionner avec l’assembly principal et des autres options de configuration :

babel <primary assembly source> [<other assemblies>...] [options]

Babel Obfuscator propose plusieurs options pour configurer la fusion des assemblies.

—[no]copyattrs [regex]

Cette option indique si Babel doit copier les attributs de niveau assembly dans l’assembly principal. Vous pouvez aussi fournir une expression régulière facultative qui correspond au nom complet des attributs à fusionner. Répétez l’option --copyattrs pour définir plusieurs filtres d’attributs. Pour désactiver la copie des attributs de niveau assembly, utilisez l’option --nocopyattrs.

Si les attributs de niveau assembly sont copiés, des règles XML permettent de filtrer les attributs à copier ou à exclure au moyen des propriétés CopyAttributes et NoCopyAttributes, qui prennent une expression régulière correspondant au nom de type complet de l’attribut de niveau assembly :

<Rule name="merge attributes" feature="merge" exclude="false"> <Target>Assembly</Target> <Pattern>*</Pattern> <Properties> <NoCopyAttributes>.*TypeLibVersion</NoCopyAttributes> </Properties> </Rule>

L’expression de filtre CopyAttributes sert à inclure de façon sélective des attributs de niveau assembly dans l’assembly fusionné, d’après le nom complet de leur type. Autrement dit, seuls les attributs qui correspondent à l’expression de filtre sont fusionnés dans l’assembly cible, tous les autres étant exclus.

À l’inverse, l’expression de filtre NoCopyAttributes sert à exclure de façon sélective des attributs de niveau assembly de l’assembly fusionné, d’après le nom complet de leur type. Aucun attribut correspondant à l’expression de filtre n’est donc fusionné dans l’assembly cible, tous les autres étant inclus.

—[no]internalize:

Lorsqu’elle est activée, cette option fait passer de public à internal la visibilité de tous les types des assemblies fusionnés.

Modifier la visibilité des types peut empêcher l’utilisation des types fusionnés en dehors de l’assembly principal ; n’activez donc cette option que si les types fusionnés sont destinés à être utilisés uniquement par l’assembly principal.

Fusionner depuis la tâche MSBuild Babel

Pour fusionner des assemblies avec la tâche Babel, définissez un élément ItemGroup supplémentaire dans le fichier de projet MSBuild. Cet ItemGroup contient tous les assemblies à fusionner avec l’assembly principal. La tâche Babel utilise ensuite cet ItemGroup pour effectuer la fusion pendant le build.

Voici un exemple de définition de l’élément ItemGroup :

<ItemGroup> <MergeAssembly Include="path/to/assembly1.dll"/> <MergeAssembly Include="path/to/assembly2.dll"/> </ItemGroup>

Dans cet exemple, path/to/assembly1.dll et path/to/assembly2.dll sont les chemins des assemblies à fusionner avec l’assembly principal. Vous pouvez inclure autant d’assemblies que nécessaire dans l’ItemGroup.

Une fois l’ItemGroup défini, vous pouvez le transmettre à la tâche Babel avec le paramètre MergeAssemblies :

<Babel MergeAssemblies="@(MergeAssembly)" Internalize="true" />

L’attribut Internalize indique s’il faut faire passer de public à internal la visibilité des types fusionnés.

Fusionner depuis Babel Desktop

Pour fusionner des assemblies avec Babel Desktop, procédez comme suit :

Ouvrir ou créer un projet

Ouvrez un projet existant ou créez-en un nouveau.

Ajouter les assemblies

Ajoutez au canevas du projet l’assembly principal et les assemblies à fusionner.

Relier les dépendances

Reliez chaque dépendance à l’assembly principal : faites glisser du point d’ancrage inférieur de la dépendance vers le point d’ancrage supérieur de l’assembly principal.

Régler le type de dépendance sur Fusionner

Vérifiez que le type de dépendance est Fusionner. Les nouvelles dépendances prennent automatiquement le type Fusionner lorsque l’assembly principal référence la dépendance ; sinon, cliquez sur la ligne de la dépendance et changez son type.

Configurer les options de fusion

Sélectionnez l’assembly principal pour configurer les options de fusion dans le panneau des propriétés, par exemple Internalize et CopyAttributes dans le groupe Optimisation.

Voir Projets d’obfuscation pour en savoir plus sur le canevas du projet.

Last updated on