Lors de la création d'un projet .NET Core/Standard 2.0, Visual Studio ne génère pas automatiquement le fichier AssemblyInfo.cs comme dans les projets .NET Framework. En ajoutant manuellement un tel fichier, une erreur CS0579 survient : « Duplicate 'AssemblyFileVersionAttribute' attribute ».
Cette erreur est causée par le fait que .NET Core/Standard 2.0 génère automatiquement les informations d'assembly via les propriétés du projet. Les étapes clés sont :
- Les attributs d'asesmbly (version, description) sont configurés dans la page « Package » des propriétés du projet.
- Le compilateur génère alors un fichier .AssemblyInfo.cs contenant des attributs comme AssemblyFileVersionAttribute.
- Si un fichier AssemblyInfo.cs personnalisé existe, il contient également ces attributs, ce qui provoque une duplication interdite.
Les solutions courantes incluent :
- Supprimer le fichier AssemblyInfo.cs et utiliser uniquement les configurations du projet (inconvénient : perte de flexibilité).
- Ajouter des directives #if dans le fichier personnalisé pour ignorer les attributs sous .NET Core/Standard 2.0 (solution complexe).
Solution
Pour empêcher la génération automatique des attributs d'assembly tout en conservant le contrôle personnalisé, modifier le fichier csproj :
<project sdk="Microsoft.NET.Sdk">
<propertygroup>
<outputtype>Exe</outputtype>
<targetframework>netcoreapp2.0</targetframework>
<assemblyname>ConsoleExample</assemblyname>
<rootnamespace>ConsoleExample</rootnamespace>
<generateassemblyinfo>false</generateassemblyinfo>
</propertygroup>
</project>
Ce changement désactive la génération automatique du fichier .AssemblyInfo.cs, permettant ainsi d'utiliser librement le fichier personnalisé sans conflits.
Mécanisme de génération
Le fichier .AssemblyInfo.cs généré contient des attributs comme :
[assembly: AssemblyFileVersion("1.0.0.0")]
[assembly: AssemblyVersion("1.0.0.0")]
Ce comportement est contrôlé par le fichier Microsoft.NET.GenerateAssemblyInfo.targets, qui définit les règles de génération. Pour une gestion partielle, désactiver certains attributs via des propriétés spécifiques :
<propertygroup>
<generateassemblyconfigurationattribute>false</generateassemblyconfigurationattribute>
<generateassemblycompanyattribute>false</generateassemblycompanyattribute>
<generateassemblyproductattribute>false</generateassemblyproductattribute>
</propertygroup>
Cela permet de conserver certains attributs générés tout en utilisant des configurations personnalisées.