File della soluzione (.sln)

Una soluzione è una struttura per organizzare i progetti in Visual Studio. La soluzione gestisce le informazioni sullo stato per i progetti in due file:

  • .sln file (basato su testo, condiviso)

  • .suo file (opzioni di soluzione binarie, specifiche dell'utente)

Per altre informazioni sui file con estensione suo, vedere File delle opzioni utente della soluzione (con estensione suo).

Se il pacchetto VSPackage viene caricato a causa di un riferimento nel .sln file, l'ambiente chiama ReadSolutionProps per la lettura nel .sln file.

Il .sln file contiene informazioni basate su testo usate dall'ambiente per trovare e caricare i parametri name-value per i dati persistenti e il progetto VSPackages fa riferimento. Quando un utente apre una soluzione, l'ambiente scorre preSolutionle informazioni , Projecte postSolution nel .sln file per caricare la soluzione, i progetti all'interno della soluzione ed eventuali informazioni persistenti associate alla soluzione.

Il file di ogni progetto contiene informazioni aggiuntive lette dall'ambiente per popolare la gerarchia con gli elementi del progetto. La persistenza dei dati della gerarchia è controllata dal progetto. I dati non vengono normalmente archiviati nel .sln file, anche se è possibile scrivere intenzionalmente informazioni sul progetto nel .sln file se si sceglie di farlo. Per altre informazioni sulla persistenza, vedere Persistenza e apertura e salvataggio di elementi di progetto.

Intestazione file

L'intestazione di un .sln file è simile alla seguente:

Microsoft Visual Studio Solution File, Format Version 12.00
# Visual Studio Version 16
VisualStudioVersion = 16.0.28701.123
MinimumVisualStudioVersion = 10.0.40219.1
Microsoft Visual Studio Solution File, Format Version 12.00
# Visual Studio Version 17
VisualStudioVersion = 17.2.32505.173
MinimumVisualStudioVersion = 10.0.40219.1

Definizioni

Microsoft Visual Studio Solution File, Format Version 12.00
Intestazione standard che definisce la versione del formato di file.

# Visual Studio Version 16
La versione principale di Visual Studio che (più di recente) ha salvato questo file di soluzione. Queste informazioni controllano il numero di versione nell'icona della soluzione.

VisualStudioVersion = 16.0.28701.123
Versione completa di Visual Studio che (più di recente) ha salvato il file della soluzione. Se il file della soluzione viene salvato da una versione più recente di Visual Studio con la stessa versione principale. Questo valore non viene aggiornato in modo da ridurre la varianza nel file.

MinimumVisualStudioVersion = 10.0.40219.1
Versione minima (meno recente) di Visual Studio in grado di aprire questo file di soluzione.

Microsoft Visual Studio Solution File, Format Version 12.00
Intestazione standard che definisce la versione del formato di file.

# Visual Studio Version 17
La versione principale di Visual Studio che (più di recente) ha salvato questo file di soluzione. Queste informazioni controllano il numero di versione nell'icona della soluzione.

VisualStudioVersion = 17.2.32505.173
Versione completa di Visual Studio che (più di recente) ha salvato il file della soluzione. Se il file della soluzione viene salvato da una versione più recente di Visual Studio con la stessa versione principale. Questo valore non viene aggiornato in modo da ridurre la varianza nel file.

MinimumVisualStudioVersion = 10.0.40219.1
Versione minima (meno recente) di Visual Studio in grado di aprire questo file di soluzione.

Corpo del file

Il corpo di un .sln file è costituito da diverse sezioni con etichetta GlobalSection, come illustrato di seguito:

Project("{F184B08F-C81C-45F6-A57F-5ABD9991F28F}") = "Project1", "Project1.vbproj", "{8CDD8387-B905-44A8-B5D5-07BB50E05BEA}"
EndProject
Global
  GlobalSection(SolutionNotes) = postSolution
  EndGlobalSection
  GlobalSection(SolutionConfiguration) = preSolution
       ConfigName.0 = Debug
       ConfigName.1 = Release
  EndGlobalSection
  GlobalSection(ProjectDependencies) = postSolution
  EndGlobalSection
  GlobalSection(ProjectConfiguration) = postSolution
   {8CDD8387-B905-44A8-B5D5-07BB50E05BEA}.Debug.ActiveCfg = Debug|x86
   {8CDD8387-B905-44A8-B5D5-07BB50E05BEA}.Debug.Build.0 = Debug|x86
   {8CDD8387-B905-44A8-B5D5-07BB50E05BEA}.Release.ActiveCfg = Release|x86
   {8CDD8387-B905-44A8-B5D5-07BB50E05BEA}.Release.Build.0 = Release|x86
  EndGlobalSection
  GlobalSection(ExtensibilityGlobals) = postSolution
  EndGlobalSection
  GlobalSection(ExtensibilityAddIns) = postSolution
  EndGlobalSection
EndGlobal

Per caricare una soluzione, l'ambiente esegue la sequenza di attività seguente:

  1. L'ambiente legge la sezione Globale del .sln file ed elabora tutte le sezioni contrassegnate come preSolution. In questo file di esempio è presente un'istruzione di questo tipo:

    GlobalSection(SolutionConfiguration) = preSolution
         ConfigName.0 = Debug
         ConfigName.1 = Release
    

    Quando l'ambiente legge il tag, esegue il GlobalSection('name') mapping del nome a un VSPackage usando il Registro di sistema. Il nome della chiave deve esistere nel Registro di sistema in [HKLM\\<Application ID Registry Root\>\SolutionPersistence\AggregateGUIDs]. Il valore predefinito delle chiavi è il GUID del pacchetto (REG_SZ) del VSPackage che ha scritto le voci.

  2. L'ambiente carica il VSPackage, chiama QueryInterface il VSPackage per l'interfaccia IVsPersistSolutionProps e chiama il ReadSolutionProps metodo con i dati nella sezione in modo che il VSPackage possa archiviare i dati. L'ambiente ripete questo processo per ogni preSolution sezione.

  3. L'ambiente scorre i blocchi di persistenza del progetto. In questo caso, c'è un progetto.

    Project("{F184B08F-C81C-45F6-A57F-5ABD9991F28F}") = "Project1",
    "Project1.vbproj", "{8CDD8387-B905-44A8-B5D5-07BB50E05BEA}"
    EndProject
    

    Questa istruzione contiene il GUID univoco del progetto e il GUID del tipo di progetto. Queste informazioni vengono usate dall'ambiente per trovare il file di progetto o i file appartenenti alla soluzione e il PACCHETTO VSPackage necessario per ogni progetto. Il GUID del progetto viene passato a IVsProjectFactory per caricare il VSPackage specifico correlato al progetto, quindi il progetto viene caricato dal VSPackage. In questo caso, il VSPackage caricato per questo progetto è Visual Basic.

    Ogni progetto può rendere persistente un ID istanza di progetto univoco in modo che sia accessibile in base alle esigenze di altri progetti nella soluzione. Idealmente, se la soluzione e i progetti sono sotto il controllo del codice sorgente, il percorso del progetto deve essere relativo al percorso della soluzione. Quando la soluzione viene caricata per la prima volta, i file di progetto non possono trovarsi nel computer dell'utente. Avendo il file di progetto archiviato nel server relativo al file della soluzione, è più semplice trovare e copiare il file di progetto nel computer dell'utente. Quindi copia e carica il resto dei file necessari per il progetto.

  4. In base alle informazioni contenute nella sezione del progetto del .sln file, l'ambiente carica ogni file di progetto. Il progetto stesso è quindi responsabile del popolamento della gerarchia del progetto e del caricamento di tutti i progetti annidati.

  5. Dopo l'elaborazione di tutte le sezioni del .sln file, la soluzione viene visualizzata in Esplora soluzioni ed è pronta per la modifica da parte dell'utente.

Se un progetto nella soluzione che implementa VSPackage non viene caricato, il OnProjectLoadFailure metodo viene chiamato e tutti i progetti nella soluzione ignorano le modifiche apportate durante il caricamento. Per eventuali errori di analisi, la maggior parte delle informazioni possibili viene mantenuta con i file della soluzione. L'ambiente visualizza una finestra di dialogo che avvisa l'utente che la soluzione è danneggiata.

Quando la soluzione viene salvata o chiusa, viene chiamato il QuerySaveSolutionProps metodo . Viene passato alla gerarchia per verificare se sono state apportate modifiche alla soluzione che devono essere immesse nel .sln file. Un valore Null, passato a QuerySaveSolutionProps in VSQUERYSAVESLNPROPS, indica che le informazioni vengono rese persistenti per la soluzione. Se il valore non è Null, le informazioni persistenti sono relative a un progetto specifico, determinate dal puntatore all'interfaccia IVsHierarchy .

Se sono presenti informazioni da salvare, l'interfaccia IVsSolutionPersistence viene chiamata con un puntatore al SaveSolutionProps metodo . Il WriteSolutionProps metodo viene quindi chiamato dall'ambiente per recuperare le coppie nome-valore dall'interfaccia IPropertyBag e scrivere le informazioni nel .sln file.

SaveSolutionProps gli oggetti e WriteSolutionProps vengono chiamati in modo ricorsivo dall'ambiente per recuperare le informazioni da salvare dall'interfaccia IPropertyBag fino a quando non vengono immesse tutte le modifiche nel .sln file. In questo modo, è possibile assicurarsi che le informazioni verranno mantenute con la soluzione e disponibili al successivo apertura della soluzione.

Ogni VSPackage caricato viene enumerato per verificare se contiene elementi da salvare nel .sln file. È solo in fase di caricamento in cui vengono eseguite query sulle chiavi del Registro di sistema. L'ambiente conosce tutti i pacchetti caricati perché sono in memoria al momento del salvataggio della soluzione.

Solo il .sln file contiene voci nelle preSolution sezioni e postSolution . Non sono presenti sezioni simili nel file con estensione suo perché la soluzione richiede che queste informazioni vengano caricate correttamente. Il .suo file contiene opzioni specifiche dell'utente, ad esempio note private che non devono essere condivise o inserite nel controllo del codice sorgente.