Equivalente a AssemblyInfo in dotnet core / csproj


236

Poiché il core dotnet è tornato al .csprojformato, esiste un nuovo generatore automatico MyProject.AssemblyInfo.csche contiene tra l'altro.

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

Nota che questo viene rigenerato automaticamente ad ogni build. In precedenza il file era stato trovato nella directory / obj /, ora sembra essere solo in memoria poiché il file non può essere trovato sul disco e facendo clic sul messaggio di errore non si apre alcun file.

Questo è il messaggio di errore: inserisci qui la descrizione dell'immagine

Dato che sono definiti lì, non posso definirli io stesso nel classico AssemblyInfo.cs.

Dove / come posso definire la società e la versione di un progetto?


5
Si noti che questo non è strettamente correlato al core dotnet. Questo è piuttosto correlato al nuovo formato basato su .csproj. Va benissimo usare questo nuovo formato .csproj con il targeting del vecchio .NET Framework, ad esempio net461
Jim Aho,

Risposte:


334

Come hai già notato, puoi controllare la maggior parte di queste impostazioni in .csproj.

Se preferisci mantenerli in AssemblyInfo.cs, puoi disattivare gli attributi di assemblaggio generati automaticamente.

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

Se vuoi vedere cosa succede sotto il cofano, controlla Microsoft.NET.GenerateAssemblyInfo.targets all'interno di Microsoft.NET.Sdk.


41
Sono contento di vedere che posso spegnere questa cosa. Chiamami vecchio stile, ma preferisco il buon vecchio file AssemblyInfo.cs rispetto alle cose generate automaticamente di .netcore. Inoltre utilizzo strumenti esterni per gestire le mie versioni e il contenuto delle altre voci di AssembyInfo. Ho cercato di utilizzare un target personalizzato per mantenere le mie proprietà fuori dal progetto stesso ma mi ha fatto soffocare per un po '.
Ivaylo Slavov,

1
Anch'io. Con il nuovo sistema basato su csproj, non ho potuto usare i miei strumenti legacy. Con questa proprietà, ora posso tornare indietro, che adoro!
Strutturato il

5
NuGet non legge AssemblyInfo.cs. Devi ancora usare le proprietà MSBuild per definire la versione del pacchetto NuGet.
natemcmaster il

6
quando il file viene generato automaticamente, come impostare l'attributo InternalsVisibleTo nel nuovo formato csproj?
Shubhan,

8
@Shubhan questo non è uno degli attributi generati automaticamente. Crea un file .cs vuoto da qualche parte nel tuo progetto e aggiungi il codice InternalsVisibleTo ad esso
natemcmaster

128

Tali impostazioni sono state spostate nel file .csproj.

Per impostazione predefinita, non vengono visualizzati ma puoi scoprirli da Visual Studio 2017 nella Packagescheda delle proprietà del progetto .

Proprietà del progetto, scheda Pacchetto

Una volta salvati, questi valori possono essere trovati 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>

Nella scheda Informazioni sulle proprietà di Esplora file, FileVersionviene visualizzato come "Versione file" e Versionviene visualizzato come "Versione prodotto"


1
Le impostazioni nelle proprietà del progetto sembrano mancare se il mio tipo di progetto è Class Library (.NET Standard). Hai idea del perché? Sto usando la versione 15.1, versione 26403.7, Community Edition.
Ventiseis,

2
Sto usando Class Library (.NET Standard) e lo vedo nella scheda Pacchetti. Lo vedi lì? Una volta che "Salva" qualcosa di diverso dalle impostazioni predefinite, verrà visualizzato nel csproj.
Tofutim,

3
Come si usa un carattere jolly come 1.0. *. * Quando si utilizza la scheda Pacchetti?
Soenhay,

@Soenhay, il jolly non ha molto senso quando si definisce la versione del pacchetto, solo quando la si consuma.
Paul Hatcher,

@Soenhay la mia comprensione è che non è possibile a meno che non si utilizzi una funzione simile negli strumenti di terze parti.
hultqvist,

115

Faccio quanto segue per i miei progetti .NET Standard 2.0.

Creare un Directory.Build.propsfile (ad es. Nella radice del repository) e spostare le proprietà da condividere dal .csprojfile a questo file.

MSBuild lo raccoglierà automaticamente e li applicherà alla generazione automatica AssemblyInfo.cs.

Vengono inoltre applicati al pacchetto nuget durante la creazione di uno con dotnet packo tramite l'interfaccia utente in Visual Studio 2017.

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


12
Questo dovrebbe ottenere più voti, bello consentire l'autogenerazione ma condividere comunque alcune cose in una soluzione
Dan

@Dan concordato, questo è molto al di sotto delle altre risposte che sospetto che la maggior parte delle persone non finisca per leggere questo.
Lunyx,

1
@Justin, non li vedrai nei file del tuo progetto; vengono applicati sugli assiemi creati risultanti.
pfx

1
Che dire di quelli di noi che non usano msbuild?
Joe Phillips,

1
Questa è stata un'ottima risposta. Grazie. Utilizzato nella nostra grande soluzione che produce alcuni pacchetti NuGet e questa è un'ottima alternativa alle vecchie informazioni di assemblaggio per nuovi progetti in stile sdk
David Anderson,

57

Puoi sempre aggiungere il tuo AssemblyInfo.cs , utile per te InternalsVisibleToAttribute, CLSCompliantAttributee altri che non vengono generati automaticamente.

Aggiunta di AssemblyInfo.cs a un progetto

  1. In Esplora soluzioni, fare clic con il tasto destro su <project name> > Add > New Folder.

Aggiungi nuova cartella

  1. Denominare la cartella "Proprietà".

Proprietà della cartella dei nomi

  1. Fare clic con il tasto destro sulla cartella "Proprietà" e fare clic Add > New Item....

Aggiungi un nuovo elemento

  1. Selezionare "Classe" e denominarlo "AssemblyInfo.cs".

Nome file AssemblyInfo.cs

Soppressione degli attributi generati automaticamente

Se si desidera spostare nuovamente i propri attributi in AssemblyInfo.cs invece di generarli automaticamente, è possibile eliminarli in MSBuild come indicato da natemcmaster nella sua risposta .


1
Grazie NightOwl888, questa è la risposta che sto cercando.
Juniuz,

3
Eviterei di supporre che tutti abbiano Visual Studio in questi giorni, ci sono altri editor che potrebbero essere usati rendendo questa risposta difficile da seguire per alcuni (ad esempio, lo sto facendo su un Mac / Mono usando Jetbrains Rider)
PandaWood

A volte, i nuovi lead Microsoft dovrebbero considerare di mantenere ciò che funziona bene con AssemblyInfo.cs in modo che le build automatizzate possano ancora funzionare per modificare i numeri di build.
justdan23

6

Aggiungendo alla risposta di NightOwl888, puoi fare un ulteriore passo avanti e aggiungere una AssemblyInfoclasse anziché una semplice classe:

inserisci qui la descrizione dell'immagine


5
Non esiste un "file di informazioni sull'assemblaggio" quando apro questa finestra di dialogo in VS2019 per un progetto 1.1 netstandard.
SwissCoder,

Grazie per aver pubblicato questo! Sto usando .NET Core 3.1 ed era proprio lì! Aggiunge tutte le parti predefinite chiave.
justdan23,

6

Voglio estendere questo argomento / risposte con quanto segue. Come qualcuno ha detto, questo AssemblyInfo generato automaticamente può essere un ostacolo per gli strumenti esterni. Nel mio caso, usando FinalBuilder , ho avuto un problema che AssemblyInfo non veniva aggiornato dall'azione build. Apparentemente, FinalBuilder si affida al ~projfile per trovare la posizione di AssemblyInfo . Ho pensato, stava cercando ovunque nella cartella del progetto. No. Quindi, cambiando questo

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

ha svolto solo la metà del lavoro, ha consentito informazioni sull'assemblaggio personalizzato se creato da VS IDE / MS Build. Ma avevo bisogno che anche FinalBuilder lo facesse senza manipolazioni manuali nel file di informazioni sull'assemblaggio. Avevo bisogno di soddisfare tutti i programmi, MSBuild / VS e FinalBuilder.

Ho risolto questo aggiungendo una voce all'esistente ItemGroup

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

Ora, con questo elemento, FinalBuilder trova la posizione di AssemblyInfo e modifica il file. Mentre action Noneconsente a MSBuild / DevEnv di ignorare questa voce e di non segnalare più un errore in base Compileall'azione che di solito viene fornita con la voce Informazioni sull'assembly nei projfile.

C: \ Programmi \ dotnet \ sdk \ 2.0.2 \ Sdks \ Microsoft.NET.Sdk \ build \ Microsoft.NET.Sdk.DefaultItems.targets (263,5): errore: sono stati inclusi elementi 'Compile' duplicati. .NET SDK include gli elementi 'Compila' dalla directory del progetto per impostazione predefinita. È possibile rimuovere questi elementi dal file di progetto o impostare la proprietà "EnableDefaultCompileItems" su "false" se si desidera includerli esplicitamente nel file di progetto. Per ulteriori informazioni, consultare https://aka.ms/sdkimplicititems . Gli elementi duplicati erano: 'AssemblyInfo.cs'

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.