Domanda

Ho una soluzione con più progetti.Sto cercando di ottimizzare i file AssemblyInfo.cs collegando un file di informazioni sull'assembly a livello di soluzione.Quali sono le migliori pratiche per farlo?Quali attributi dovrebbero essere presenti nel file dell'intera soluzione e quali sono specifici del progetto/assembly?


Modificare:Se sei interessato c'è una domanda di follow-up Quali sono le differenze tra AssemblyVersion, AssemblyFileVersion e AssemblyInformationalVersion?

È stato utile?

Soluzione

Utilizziamo un file globale denominato GlobalAssemblyInfo.cs e uno locale denominato AssemblyInfo.cs.Il file globale contiene i seguenti attributi:

 [assembly: AssemblyProduct("Your Product Name")]

 [assembly: AssemblyCompany("Your Company")]
 [assembly: AssemblyCopyright("Copyright © 2008 ...")]
 [assembly: AssemblyTrademark("Your Trademark - if applicable")]

 #if DEBUG
 [assembly: AssemblyConfiguration("Debug")]
 #else
 [assembly: AssemblyConfiguration("Release")]
 #endif

 [assembly: AssemblyVersion("This is set by build process")]
 [assembly: AssemblyFileVersion("This is set by build process")]

Il file AssemblyInfo.cs locale contiene i seguenti attributi:

 [assembly: AssemblyTitle("Your assembly title")]
 [assembly: AssemblyDescription("Your assembly description")]
 [assembly: AssemblyCulture("The culture - if not neutral")]

 [assembly: ComVisible(true/false)]

 // unique id per assembly
 [assembly: Guid("xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx")]

È possibile aggiungere GlobalAssemblyInfo.cs utilizzando la procedura seguente:

  • Selezionare Aggiungi/Articolo esistente... nel menu contestuale del progetto
  • Selezionare GlobalAssemblyInfo.cs
  • Espandi il pulsante Aggiungi facendo clic sulla piccola freccia rivolta verso il basso sulla mano destra
  • Seleziona "Aggiungi come collegamento" nell'elenco a discesa dei pulsanti

Altri suggerimenti

Nel mio caso, stiamo creando un prodotto per il quale disponiamo di una soluzione Visual Studio, con vari componenti nei rispettivi progetti.Gli attributi comuni vanno.Nella soluzione sono presenti circa 35 progetti e informazioni comuni sull'assembly (CommonAssemblyInfo.cs), che hanno i seguenti attributi:

[assembly: AssemblyCompany("Company")]
[assembly: AssemblyProduct("Product Name")]
[assembly: AssemblyCopyright("Copyright © 2007 Company")]
[assembly: AssemblyTrademark("Company")]

//This shows up as Product Version in Windows Explorer
//We make this the same for all files in a particular product version. And increment it globally for all projects.
//We then use this as the Product Version in installers as well (for example built using Wix).
[assembly: AssemblyInformationalVersion("0.9.2.0")]

Gli altri attributi come AssemblyTitle, AssemblyVersion ecc. vengono forniti in base all'assemblaggio.Quando si compila un assembly, in ogni assembly vengono incorporati sia AssemblyInfo.cs che CommonAssemblyInfo.cs.Questo ci offre il meglio di entrambi i mondi in cui potresti voler avere alcuni attributi comuni per tutti i progetti e valori specifici per alcuni altri.

Spero che aiuti.

La soluzione presentata da @JRoppert è quasi la stessa di quella che faccio io.L'unica differenza è che ho inserito le seguenti righe nel file AssemblyInfo.cs locale poiché possono variare con ciascun assembly:

#if DEBUG
[assembly: AssemblyConfiguration("Debug")]
#else
[assembly: AssemblyConfiguration("Release")]
#endif
[assembly: AssemblyVersion("This is set by build process")]
[assembly: AssemblyFileVersion("This is set by build process")]
[assembly: CLSCompliant(true)]

Inoltre (generalmente) utilizzo informazioni di assemblaggio comuni per soluzione, partendo dal presupposto che una soluzione sia una singola linea di prodotti/prodotto rilasciabile.Il file comune delle informazioni sull'assembly contiene anche:

[assembly: AssemblyInformationalVersion("0.9.2.0")]

Che imposterà il valore "ProductVersion" visualizzato da Windows Explorer.

Attività della community MSBuild contiene un'attività personalizzata denominata AssemblyInfo che è possibile utilizzare per generare assemblyinfo.cs.Richiede una piccola modifica manuale dei file csproj da utilizzare, ma ne vale la pena.

A mio avviso, l'utilizzo di GlobalAssemblyInfo.cs è più un problema che un valore, perché è necessario modificare ogni file di progetto e ricordarsi di modificare ogni nuovo progetto, mentre per impostazione predefinita si ottiene un AssemblyInfo.cs.

Per modifiche ai valori globali (ad es.Azienda, Prodotto ecc.) i cambiamenti sono solitamente così poco frequenti e semplici da gestire che non credo ASCIUTTO dovrebbe essere una considerazione.Basta eseguire il seguente script MSBuild (dipendente da Pacchetto di estensione MSBuild) quando desideri modificare manualmente i valori in tutti i progetti una tantum:

<?xml version="1.0" encoding="utf-8"?>
<Project ToolsVersion="4.0" DefaultTargets="UpdateAssemblyInfo" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">

    <ItemGroup>
        <AllAssemblyInfoFiles Include="..\**\AssemblyInfo.cs" />
    </ItemGroup>

    <Import Project="MSBuild.ExtensionPack.tasks" />

  <Target Name="UpdateAssemblyInfo">
    <Message Text="%(AllAssemblyInfoFiles.FullPath)" />
    <MSBuild.ExtensionPack.Framework.AssemblyInfo 
        AssemblyInfoFiles="@(AllAssemblyInfoFiles)"
        AssemblyCompany="Company"
        AssemblyProduct="Product"
        AssemblyCopyright="Copyright"
        ... etc ...
        />
  </Target>

</Project>

Per condividere un file tra più progetti è possibile aggiungere un file esistente come collegamento.

Per fare ciò, aggiungi un file esistente e fai clic su "Aggiungi come collegamento" nel selettore di file.Add As Link
(fonte: gratuito.fr)

Per quanto riguarda cosa inserire nel file condiviso, suggerirei di inserire cose che verrebbero condivise tra gli assembly.Cose come copyright, azienda, forse versione.

Non è consigliabile usare un singolo file AseemblyInfo.cs per più progetti.Il file AssemblyInfo include informazioni che potrebbero essere rilevanti solo per quell'assembly specifico.Le due informazioni più ovvie sono: AssemblyTitle E AssemblyVersion.

Una soluzione migliore potrebbe essere quella di utilizzare targets file, gestiti da MSBuild, per "iniettare" attributi di assembly in più di un progetto.

Una cosa che ho trovato utile è generare gli elementi AssemblyVersion (ecc.) applicando la sostituzione dei token nella fase di pre-compilazione.

Io uso TortoiseSvn ed è facile da usare SubWCRev.exe per trasformare un modello AssemblyInfo.wcrev in AssemblyInfo.cs.La riga pertinente nel modello potrebbe assomigliare a questa:

[assembly: AssemblyVersion("2.3.$WCREV$.$WCMODS?1:0$$WCUNVER?1:0$")]

Il terzo elemento è quindi il numero di revisione.Utilizzo il quarto elemento per verificare di non aver dimenticato di inserire file nuovi o modificati (il quarto elemento è 00 se è tutto OK).

A proposito, aggiungi AssemblyInfo.wcrev al controllo della versione e ignorare AssemblyInfo.cs se usi questo.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top