Equivalent à AssemblyInfo dans dotnet core / csproj

236

Depuis que le noyau dotnet est revenu au .csprojformat, il existe un nouveau générateur automatique MyProject.AssemblyInfo.csqui contient entre autres.

[assembly: AssemblyCompany("MyProject")]
[assembly: AssemblyVersion("1.0.0.0")]

Notez que cela est automatiquement régénéré à chaque build. Auparavant, le fichier était trouvé dans le répertoire / obj /, il semble maintenant être uniquement en mémoire car le fichier est introuvable sur le disque et cliquer sur le message d'erreur n'ouvre aucun fichier.

Voici le message d'erreur: entrez la description de l'image ici

Puisqu'ils y sont définis, je ne peux pas les définir moi-même dans le classique AssemblyInfo.cs.

Où / comment puis-je définir la société et la version d'un projet?

hultqvist
la source
5
Notez que cela n'est pas strictement lié au noyau dotnet. Ceci est plutôt lié au nouveau format basé sur .csproj. Il est parfaitement possible d'utiliser ce nouveau format .csproj avec le ciblage de l'ancien .NET Framework, par exemple net461
Jim Aho

Réponses:

334

Comme vous l'avez déjà remarqué, vous pouvez contrôler la plupart de ces paramètres dans .csproj.

Si vous préférez les conserver dans AssemblyInfo.cs, vous pouvez désactiver les attributs d'assembly générés automatiquement.

<PropertyGroup>
   <GenerateAssemblyInfo>false</GenerateAssemblyInfo>
</PropertyGroup> 

Si vous voulez voir ce qui se passe sous le capot, consultez Microsoft.NET.GenerateAssemblyInfo.targets à l' intérieur de Microsoft.NET.Sdk.

natemcmaster
la source
41
Heureux de voir que je peux désactiver cette chose. Appelez-moi à l'ancienne, mais je préfère le bon vieux fichier AssemblyInfo.cs que le contenu généré automatiquement par .netcore. En outre, j'utilise des outils externes pour gérer mes versions et le contenu des autres entrées AssembyInfo. J'ai essayé d'utiliser une cible personnalisée pour garder mes propriétés hors du projet lui-même, mais cela m'a étranglé pendant un certain temps.
Ivaylo Slavov
1
Pareil ici. Avec le nouveau système basé sur csproj, je ne pouvais pas utiliser mes outils hérités. Avec cette propriété, je peux maintenant y retourner, ce que j'adore!
Structuré le
5
NuGet ne lit pas AssemblyInfo.cs. Vous devez toujours utiliser les propriétés MSBuild pour définir la version du package NuGet.
natemcmaster
6
lorsque le fichier est généré automatiquement, comment définir l'attribut InternalsVisibleTo dans le nouveau format csproj?
Shubhan
8
@Shubhan ce n'est pas l'un des attributs générés automatiquement. Créez un fichier .cs vide quelque part dans votre projet et ajoutez-y le code InternalsVisibleTo
natemcmaster
128

Ces paramètres ont été déplacés dans le fichier .csproj.

Par défaut, ils n'apparaissent pas, mais vous pouvez les découvrir à partir de Visual Studio 2017 dans l' Packageonglet des propriétés du projet .

Propriétés du projet, onglet Package

Une fois enregistrées, ces valeurs peuvent être trouvées dans MyProject.csproj

<Project Sdk="Microsoft.NET.Sdk">
  <PropertyGroup>
    <TargetFramework>net461</TargetFramework>
    <Version>1.2.3.4</Version>
    <Authors>Author 1</Authors>
    <Company>Company XYZ</Company>
    <Product>Product 2</Product>
    <PackageId>MyApp</PackageId>
    <AssemblyVersion>2.0.0.0</AssemblyVersion>
    <FileVersion>3.0.0.0</FileVersion>
    <NeutralLanguage>en</NeutralLanguage>
    <Description>Description here</Description>
    <Copyright>Copyright</Copyright>
    <PackageLicenseUrl>License URL</PackageLicenseUrl>
    <PackageProjectUrl>Project URL</PackageProjectUrl>
    <PackageIconUrl>Icon URL</PackageIconUrl>
    <RepositoryUrl>Repo URL</RepositoryUrl>
    <RepositoryType>Repo type</RepositoryType>
    <PackageTags>Tags</PackageTags>
    <PackageReleaseNotes>Release</PackageReleaseNotes>
  </PropertyGroup>

Dans l'onglet d'informations sur les propriétés de l'explorateur de fichiers, FileVersions'affiche comme "Version du fichier" et Versioncomme "Version du produit"

hultqvist
la source
1
Les paramètres dans les propriétés du projet semblent être manquants si mon type de projet est Class Library (.NET Standard). Tu sais pourquoi? J'utilise la version 15.1, version 26403.7, Community Edition.
ventiseis
2
J'utilise Class Library (.NET Standard) et le vois dans l'onglet Packages. Le voyez-vous là-bas? Une fois que vous "Enregistrer" autre chose que les valeurs par défaut, il apparaîtra dans le csproj.
tofutim
3
Comment utilisez-vous un caractère générique comme 1.0. *. * Lorsque vous utilisez l'onglet packages?
Soenhay
@Soenhay, le caractère générique n'a pas beaucoup de sens lors de la définition de la version du package, uniquement lors de sa consommation.
Paul Hatcher
@Soenhay, je comprends que vous ne pouvez pas sauf si vous utilisez une fonctionnalité similaire dans des outils tiers.
hultqvist
115

Je fais ce qui suit pour mes projets .NET Standard 2.0.

Créez un Directory.Build.propsfichier (par exemple à la racine de votre référentiel) et déplacez les propriétés à partager du .csprojfichier vers ce fichier.

MSBuild le récupérera automatiquement et les appliquera à la génération automatique AssemblyInfo.cs.

Ils sont également appliqués au package nuget lors de la création d'un avec dotnet packou via l'interface utilisateur dans Visual Studio 2017.

Voir https://docs.microsoft.com/en-us/visualstudio/msbuild/customize-your-build

pfx
la source
12
Cela devrait obtenir plus de votes positifs, agréable pour permettre la génération automatique, mais toujours partager des éléments dans une solution
Dan
@Dan D'accord, c'est tellement loin en dessous des autres réponses que je soupçonne que la plupart des gens ne finissent pas par lire ceci.
Lunyx
1
@Justin, vous ne les verrez pas dans vos fichiers de projet; ils sont appliqués sur les assemblages construits résultants.
pfx
1
Et ceux d'entre nous qui n'utilisent pas msbuild?
Joe Phillips
1
Ce fut une excellente réponse. Je vous remercie. Nous l'avons utilisé dans notre grande solution qui produit des packages NuGet et c'est une excellente alternative aux anciennes informations d'assemblage pour les nouveaux projets de style sdk
David Anderson
57

Vous pouvez toujours ajouter votre propre AssemblyInfo.cs , qui est utile pour InternalsVisibleToAttribute, CLSCompliantAttributeet d'autres qui ne sont pas générés automatiquement.

Ajout de AssemblyInfo.cs à un projet

  1. Dans l'Explorateur de solutions, cliquez avec le bouton droit sur <project name> > Add > New Folder.

Ajouter un nouveau dossier

  1. Nommez le dossier "Propriétés".

Propriétés du dossier de noms

  1. Faites un clic droit sur le dossier "Propriétés", puis cliquez sur Add > New Item....

Ajoute un nouvel objet

  1. Sélectionnez "Classe" et nommez-le "AssemblyInfo.cs".

Fichier de nom AssemblyInfo.cs

Suppression des attributs générés automatiquement

Si vous souhaitez déplacer vos attributs vers AssemblyInfo.cs au lieu de les générer automatiquement, vous pouvez les supprimer dans MSBuild comme natemcmaster l'a souligné dans sa réponse .

NightOwl888
la source
1
Merci NightOwl888, c'est la réponse que je cherche.
Juniuz
3
J'éviterais de supposer que tout le monde a Visual Studio ces jours-ci, il existe d'autres éditeurs qui pourraient être utilisés, ce qui rend cette réponse difficile à suivre pour certains (par exemple, je le fais sur un Mac / Mono utilisant Jetbrains Rider)
PandaWood
Parfois, les nouveaux prospects Microsoft devraient envisager de conserver ce qui fonctionne bien avec AssemblyInfo.cs afin que les générations automatisées puissent toujours fonctionner pour modifier les numéros de génération.
justdan23
6

En ajoutant à la réponse de NightOwl888, vous pouvez aller plus loin et ajouter une AssemblyInfoclasse plutôt qu'une simple classe:

entrez la description de l'image ici

datchung
la source
5
Il n'y a pas de "fichier d'informations d'assemblage" lorsque j'ouvre cette boîte de dialogue dans VS2019 pour un projet netstandard 1.1.
SwissCoder
Merci d'avoir posté ça! J'utilise .NET Core 3.1 et c'était juste là! Il ajoute toutes les pièces clés par défaut.
justdan23
6

Je souhaite étendre ce sujet / réponses avec ce qui suit. Comme quelqu'un l'a mentionné, cet AssemblyInfo généré automatiquement peut être un obstacle pour les outils externes. Dans mon cas, en utilisant FinalBuilder , j'ai eu un problème que AssemblyInfo n'était pas mis à jour par l'action de génération. Apparemment, FinalBuilder s'appuie sur un ~projfichier pour trouver l'emplacement de AssemblyInfo . Je pensais qu'il cherchait n'importe où dans le dossier du projet. Non. Donc, changer ça

<PropertyGroup>
   <GenerateAssemblyInfo>false</GenerateAssemblyInfo>
</PropertyGroup> 

n'a fait que la moitié du travail, il a permis des informations d'assemblage personnalisées si elles étaient construites par VS IDE / MS Build. Mais j'avais besoin que FinalBuilder le fasse aussi sans manipulations manuelles dans le fichier d'informations d'assemblage. J'avais besoin de satisfaire tous les programmes, MSBuild / VS et FinalBuilder.

J'ai résolu cela en ajoutant une entrée à l'existant ItemGroup

<ItemGroup>
   <Compile Remove="Common\**" />
   <Content Remove="Common\**" />
   <EmbeddedResource Remove="Common\**" />
   <None Remove="Common\**" />
   <!-- new added item -->
   <None Include="Properties\AssemblyInfo.cs" />
</ItemGroup>

Maintenant, ayant cet élément, FinalBuilder trouve l'emplacement de AssemblyInfo et modifie le fichier. Tandis que l'action Nonepermet à MSBuild / DevEnv d'ignorer cette entrée et de ne plus signaler une erreur basée sur l' Compileaction qui est généralement fournie avec l'entrée Infos d'assemblage dans les projfichiers.

C: \ Program Files \ dotnet \ sdk \ 2.0.2 \ Sdks \ Microsoft.NET.Sdk \ build \ Microsoft.NET.Sdk.DefaultItems.targets (263,5): erreur: des éléments de «compilation» en double ont été inclus. Le SDK .NET comprend par défaut les éléments de «compilation» de votre répertoire de projet. Vous pouvez soit supprimer ces éléments de votre fichier de projet, soit définir la propriété «EnableDefaultCompileItems» sur «false» si vous souhaitez les inclure explicitement dans votre fichier de projet. Pour plus d'informations, voir https://aka.ms/sdkimplicititems . Les éléments en double étaient: «AssemblyInfo.cs»

TS
la source