Entspricht AssemblyInfo in dotnet core / csproj

236

Da der Dotnet-Kern wieder in das .csprojFormat zurückgekehrt ist, gibt es einen neuen automatisch generierten Kern, der MyProject.AssemblyInfo.csunter anderem enthält.

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

Beachten Sie, dass dies bei jedem Build automatisch neu generiert wird. Früher wurde die Datei im Verzeichnis / obj / gefunden, jetzt scheint sie sich nur im Speicher zu befinden, da die Datei nicht auf der Festplatte gefunden werden kann und durch Klicken auf die Fehlermeldung keine Datei geöffnet wird.

Dies ist die Fehlermeldung: Geben Sie hier die Bildbeschreibung ein

Da sie dort definiert sind, kann ich sie im Klassischen nicht selbst definieren AssemblyInfo.cs.

Wo / wie kann ich das Unternehmen und die Version eines Projekts definieren?

hultqvist
quelle
5
Beachten Sie, dass dies nicht ausschließlich mit dem Dotnet-Kern zusammenhängt. Dies hängt eher mit dem neuen .csproj-basierten Format zusammen. Es ist vollkommen in Ordnung, dieses neue .csproj-Format für die Ausrichtung auf das alte .NET Framework zu verwenden, z. B. net461
Jim Aho

Antworten:

333

Wie Sie bereits bemerkt haben, können Sie die meisten dieser Einstellungen in .csproj steuern.

Wenn Sie diese lieber in AssemblyInfo.cs behalten möchten, können Sie automatisch generierte Assemblyattribute deaktivieren.

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

Wenn Sie sehen möchten, was unter der Haube vor sich geht, überprüfen Sie Microsoft.NET.GenerateAssemblyInfo.targets in Microsoft.NET.Sdk.

Natemcmaster
quelle
41
Schön zu sehen, dass ich das Ding ausschalten kann. Nennen Sie mich altmodisch, aber ich bevorzuge die gute alte AssemblyInfo.cs-Datei als das automatisch generierte Zeug von .netcore. Außerdem verwende ich externe Tools, um meine Versionen und den Inhalt der anderen AssembyInfo-Einträge zu verwalten. Ich habe versucht, ein benutzerdefiniertes Ziel zu verwenden, um meine Eigenschaften aus dem Projekt selbst herauszuhalten, aber es hat mich für eine Weile erstickt.
Ivaylo Slavov
1
Hier gilt das gleiche. Mit dem neuen csproj-basierten System konnte ich meine alten Tools nicht verwenden. Mit dieser Eigenschaft kann ich jetzt zurückgehen, was ich liebe!
Strukturiert am
5
NuGet liest AssemblyInfo.cs nicht. Sie müssen weiterhin die MSBuild-Eigenschaften verwenden, um die NuGet-Paketversion zu definieren.
Natemcmaster
6
Wie wird das InternalsVisibleTo-Attribut im neuen csproj-Format festgelegt, wenn die Datei automatisch generiert wird?
Shubhan
8
@Shubhan Dies ist nicht eines der automatisch generierten Attribute. Erstellen Sie eine leere CS-Datei irgendwo in Ihrem Projekt und fügen Sie den InternalsVisibleTo-Code hinzu
Natemcmaster
128

Diese Einstellungen wurden in die .csproj-Datei verschoben.

Standardmäßig werden sie nicht angezeigt, aber Sie können sie in Visual Studio 2017 auf der PackageRegisterkarte Projekteigenschaften erkennen .

Projekteigenschaften, Registerkarte Paket

Nach dem Speichern finden Sie diese Werte in 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>

Auf der Registerkarte mit den Informationen zu den Eigenschaften des Datei-Explorers FileVersionwird "Dateiversion" und Version"Produktversion" angezeigt.

hultqvist
quelle
1
Die Einstellungen in den Projekteigenschaften scheinen zu fehlen, wenn mein Projekttyp ist Class Library (.NET Standard). Hast du eine Idee warum? Ich verwende Version 15.1, Release 26403.7, Community Edition.
Ventiseis
2
Ich verwende die Klassenbibliothek (.NET Standard) und sehe sie auf der Registerkarte Pakete. Siehst du es dort Sobald Sie etwas anderes als die Standardeinstellungen "speichern", wird es im csproj angezeigt.
Tofutim
3
Wie verwenden Sie einen Platzhalter wie 1.0. *. *, Wenn Sie die Registerkarte "Pakete" verwenden?
Soenhay
@Soenhay, Wildcarding macht beim Definieren der Paketversion nur beim Konsumieren wenig Sinn.
Paul Hatcher
@Soenhay Mein Verständnis ist, dass Sie nicht können, wenn Sie ähnliche Funktionen in Tools von Drittanbietern verwenden.
Hultqvist
115

Ich mache Folgendes für meine .NET Standard 2.0-Projekte.

Erstellen Sie eine Directory.Build.propsDatei (z. B. im Stammverzeichnis Ihres Repos) und verschieben Sie die freizugebenden Eigenschaften aus der .csprojDatei in diese Datei.

MSBuild nimmt es automatisch auf und wendet es auf die automatisch generierte an AssemblyInfo.cs.

Sie werden auch auf das Nuget-Paket angewendet, wenn Sie eines mit dotnet packoder über die Benutzeroberfläche in Visual Studio 2017 erstellen .

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

pfx
quelle
12
Dies sollte mehr Upvotes bekommen, schön, um das automatisch generierte zu ermöglichen, aber trotzdem einige Dinge in einer Lösung zu teilen
Dan
@ Dan Einverstanden, dies ist so weit unter den anderen Antworten, dass ich vermute, dass die meisten Leute dies einfach nicht lesen.
Lunyx
1
@Justin, Sie werden sie nicht in Ihren Projektdateien sehen. Sie werden auf die resultierenden Baugruppen angewendet.
Pfx
1
Was ist mit denen von uns, die msbuild nicht verwenden?
Joe Phillips
1
Dies war eine großartige Antwort. Danke dir. Verwendet es in unserer großen Lösung, die einige NuGet-Pakete produziert, und dies ist eine großartige Alternative zu den alten Baugruppeninformationen für neue Projekte im SDK-Stil
David Anderson,
55

Sie können jederzeit Ihre eigenen AssemblyInfo.cs hinzufügen , was praktisch ist InternalsVisibleToAttribute, CLSCompliantAttributeund andere, die nicht automatisch generiert werden.

Hinzufügen von AssemblyInfo.cs zu einem Projekt

  1. Klicken Sie im Projektmappen-Explorer mit der rechten Maustaste auf <project name> > Add > New Folder.

Neuen Ordner hinzufügen

  1. Nennen Sie den Ordner "Eigenschaften".

Eigenschaften des Namensordners

  1. Klicken Sie mit der rechten Maustaste auf den Ordner "Eigenschaften" und klicken Sie auf Add > New Item....

Füge neuen Gegenstand hinzu

  1. Wählen Sie "Klasse" und nennen Sie es "AssemblyInfo.cs".

Namensdatei AssemblyInfo.cs

Automatisch generierte Attribute unterdrücken

Wenn Sie Ihre Attribute zurück in AssemblyInfo.cs verschieben möchten, anstatt sie automatisch generieren zu lassen, können Sie sie in MSBuild unterdrücken, wie natemcmaster in seiner Antwort ausgeführt hat .

NightOwl888
quelle
1
Danke NightOwl888, das ist die Antwort, die ich suche.
Juniuz
3
Ich würde vermeiden anzunehmen, dass heutzutage jeder über Visual Studio verfügt. Es gibt andere Editoren, die verwendet werden könnten, um diese Antwort für einige schwer zu befolgen (z. B. mache ich dies auf einem Mac / Mono mit Jetbrains Rider)
PandaWood
6

Ich möchte dieses Thema / diese Antworten mit folgendem erweitern. Wie bereits erwähnt, kann diese automatisch generierte AssemblyInfo ein Hindernis für die externen Tools sein. In meinem Fall hatte ich mit FinalBuilder ein Problem, dass AssemblyInfo nicht durch eine Build-Aktion aktualisiert wurde. Anscheinend stützt sich FinalBuilder auf die ~projDatei, um den Speicherort der AssemblyInfo zu finden . Ich dachte, es würde irgendwo unter dem Projektordner suchen. Also, das ändern

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

hat nur die Hälfte der Arbeit erledigt und benutzerdefinierte Assembly-Informationen zugelassen, wenn diese von VS IDE / MS Build erstellt wurden. Aber ich musste FinalBuilder auch ohne manuelle Manipulationen an der Assembly-Info-Datei ausführen . Ich musste alle Programme, MSBuild / VS und FinalBuilder, erfüllen.

Ich habe dies gelöst, indem ich dem vorhandenen einen Eintrag hinzugefügt habe ItemGroup

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

Mit diesem Element findet FinalBuilder den Speicherort von AssemblyInfo und ändert die Datei. Während die Aktion Nonees MSBuild / DevEnv ermöglicht, diesen Eintrag zu ignorieren und keinen Fehler mehr zu melden, der auf der CompileAktion basiert , die normalerweise mit dem Eintrag "Assembly Info" in projDateien einhergeht .

C: \ Programme \ dotnet \ sdk \ 2.0.2 \ Sdks \ Microsoft.NET.Sdk \ build \ Microsoft.NET.Sdk.DefaultItems.targets (263,5): Fehler: Doppelte 'Kompilierungs'-Elemente wurden eingeschlossen. Das .NET SDK enthält standardmäßig Elemente zum Kompilieren aus Ihrem Projektverzeichnis. Sie können diese Elemente entweder aus Ihrer Projektdatei entfernen oder die Eigenschaft 'EnableDefaultCompileItems' auf 'false' setzen, wenn Sie sie explizit in Ihre Projektdatei aufnehmen möchten. Weitere Informationen finden Sie unter https://aka.ms/sdkimplicititems . Die doppelten Elemente waren: 'AssemblyInfo.cs'

TS
quelle
5

Wenn Sie die Antwort von NightOwl888 ergänzen, können Sie noch einen Schritt weiter gehen und eine AssemblyInfoKlasse hinzufügen , anstatt nur eine einfache Klasse:

Geben Sie hier die Bildbeschreibung ein

Datchung
quelle
5
Es gibt keine "Assembly Information File", wenn ich diesen Dialog in VS2019 für ein Netstandard 1.1-Projekt öffne.
SwissCoder