Arquivo de solução (.sln)

Uma solução é uma estrutura para organizar projetos no Visual Studio. A solução mantém as informações de estado para projetos em dois arquivos:

  • .sln arquivo (baseado em texto, compartilhado)

  • .suo arquivo (binário, opções de solução específicas do usuário)

Para obter mais informações sobre arquivos .suo, consulte Arquivo de opções do usuário da solução (.suo).

Se o VSPackage for carregado por estar sendo referenciado .sln no arquivo, o ambiente chamará ReadSolutionProps para ler no .sln arquivo.

O .sln arquivo contém informações baseadas em texto que o ambiente usa para localizar e carregar os parâmetros nome-valor para os dados persistentes e os VSPackages do projeto que ele referencia. Quando um usuário abre uma solução, o ambiente percorre as preSolutioninformações do , Projecte no .sln arquivo para carregar a solução, os projetos dentro da solução e postSolution quaisquer informações persistentes anexadas à solução.

Cada arquivo do projeto contém informações adicionais lidas pelo ambiente para preencher a hierarquia com os itens desse projeto. A persistência de dados da hierarquia é controlada pelo projeto. Os dados normalmente não são armazenados no arquivo, embora você possa gravar intencionalmente informações do projeto no .sln.sln arquivo se optar por fazê-lo. Para obter mais informações sobre persistência, consulte Persistência do projeto e Abrindo e salvando itens do projeto.

Cabeçalho do arquivo

O cabeçalho de um .sln arquivo tem esta aparência:

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

Definições

Microsoft Visual Studio Solution File, Format Version 12.00
Cabeçalho padrão que define a versão do formato de arquivo.

# Visual Studio Version 16
A versão principal do Visual Studio que (mais recentemente) salvou esse arquivo de solução. Essas informações controlam o número da versão no ícone da solução.

VisualStudioVersion = 16.0.28701.123
A versão completa do Visual Studio que (mais recentemente) salvou o arquivo de solução. Se o arquivo de solução for salvo por uma versão mais recente do Visual Studio que tenha a mesma versão principal. Esse valor não é atualizado para diminuir a rotatividade no arquivo.

MinimumVisualStudioVersion = 10.0.40219.1
A versão mínima (mais antiga) do Visual Studio que pode abrir esse arquivo de solução.

Microsoft Visual Studio Solution File, Format Version 12.00
Cabeçalho padrão que define a versão do formato de arquivo.

# Visual Studio Version 17
A versão principal do Visual Studio que (mais recentemente) salvou esse arquivo de solução. Essas informações controlam o número da versão no ícone da solução.

VisualStudioVersion = 17.2.32505.173
A versão completa do Visual Studio que (mais recentemente) salvou o arquivo de solução. Se o arquivo de solução for salvo por uma versão mais recente do Visual Studio que tenha a mesma versão principal. Esse valor não é atualizado para diminuir a rotatividade no arquivo.

MinimumVisualStudioVersion = 10.0.40219.1
A versão mínima (mais antiga) do Visual Studio que pode abrir esse arquivo de solução.

Corpo do arquivo

O corpo de um .sln arquivo consiste em várias seções rotuladas GlobalSection, como esta:

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

Para carregar uma solução, o ambiente executa a seguinte sequência de tarefas:

  1. O ambiente lê a seção Global do arquivo e processa .sln todas as seções marcadas preSolution. Neste arquivo de exemplo, há uma dessas instruções:

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

    Quando o ambiente lê a GlobalSection('name') marca, ele mapeia o nome para um VSPackage usando o registro. O nome da chave deve existir no Registro em [HKLM\\<Application ID Registry Root\>\SolutionPersistence\AggregateGUIDs]. O valor padrão das chaves é o GUID do pacote (REG_SZ) do VSPackage que escreveu as entradas.

  2. O ambiente carrega o VSPackage, chama o VSPackage para a IVsPersistSolutionProps interface e chama QueryInterface o método com os dados na seção para que o ReadSolutionProps VSPackage possa armazenar os dados. O ambiente repete esse processo para cada preSolution seção.

  3. O ambiente itera através dos blocos de persistência do projeto. Neste caso, há um projeto.

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

    Esta instrução contém o GUID de projeto exclusivo e o GUID de tipo de projeto. Essas informações são usadas pelo ambiente para localizar o arquivo de projeto ou arquivos pertencentes à solução e o VSPackage necessário para cada projeto. O GUID do projeto é passado para IVsProjectFactory carregar o VSPackage específico relacionado ao projeto, em seguida, o projeto é carregado pelo VSPackage. Nesse caso, o VSPackage que é carregado para este projeto é o Visual Basic.

    Cada projeto pode persistir um ID de instância de projeto exclusivo para que ele possa ser acessado conforme necessário por outros projetos na solução. Idealmente, se a solução e os projetos estiverem sob controle do código-fonte, o caminho para o projeto deve ser relativo ao caminho da solução. Quando a solução é carregada pela primeira vez, os arquivos de projeto não podem estar na máquina do usuário. Ao ter o arquivo de projeto armazenado no servidor em relação ao arquivo de solução, é mais simples para o arquivo de projeto ser encontrado e copiado para a máquina do usuário. Em seguida, copia e carrega o restante dos arquivos necessários para o projeto.

  4. Com base nas informações contidas na seção de projeto do arquivo, o ambiente carrega cada arquivo de .sln projeto. O próprio projeto é então responsável por preencher a hierarquia do projeto e carregar quaisquer projetos aninhados.

  5. Depois que todas as seções do arquivo são processadas, a solução é exibida no Gerenciador de .sln Soluções e está pronta para modificação pelo usuário.

Se qualquer projeto na solução que implementa VSPackage falhar ao carregar, o método será chamado e todos os projetos na solução ignorarão as alterações que ele pode ter feito durante o OnProjectLoadFailure carregamento. Para quaisquer erros de análise, o máximo de informações possível é preservado com os arquivos de solução. O ambiente exibe uma caixa de diálogo avisando o usuário que a solução está corrompida.

Quando a solução é salva ou fechada, o QuerySaveSolutionProps método é chamado. Ele é passado para a hierarquia para ver se foram feitas alterações na solução que precisam ser inseridas no .sln arquivo. Um valor nulo, passado para dentro VSQUERYSAVESLNPROPS, indica que as informações estão sendo persistentes para QuerySaveSolutionProps a solução. Se o valor não for nulo, as informações persistentes serão para um projeto específico, determinado pelo ponteiro para a IVsHierarchy interface.

Se houver informações a serem salvas, a IVsSolutionPersistence interface será chamada com um ponteiro para o SaveSolutionProps método. O WriteSolutionProps método é então chamado pelo ambiente para recuperar os pares nome-valor da IPropertyBag interface e gravar as informações no .sln arquivo.

SaveSolutionProps e WriteSolutionProps os objetos são chamados recursivamente pelo ambiente para recuperar informações a serem salvas da interface até que todas as alterações tenham sido inseridas IPropertyBag no .sln arquivo. Dessa forma, você pode garantir que as informações serão mantidas com a solução e estarão disponíveis na próxima vez que a solução for aberta.

Cada VSPackage carregado é enumerado para ver se ele tem algo para salvar no .sln arquivo. É somente no momento do carregamento que as chaves do Registro são consultadas. O ambiente sabe sobre todos os pacotes carregados porque eles estão na memória no momento em que a solução é salva.

Somente o .sln arquivo contém entradas nas preSolution seções e postSolution . Não há seções semelhantes no arquivo .suo, pois a solução precisa dessas informações para carregar corretamente. O .suo arquivo contém opções específicas do usuário, como anotações particulares que não se destinam a ser compartilhadas ou colocadas sob controle do código-fonte.