Partilhar via


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 (baseado em texto, compartilhado)

  • .suo (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 de usuário de solução (.suo).

Se o VSPackage é carregado devido a ser referenciado no .sln arquivo, o ambiente chama 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 name-value para os dados persistentes e os VSPackages do projeto que ele referencia. Quando um usuário abre uma solução, o ambiente percorre o preSolution, Projecte postSolution informações no .sln arquivo para carregar a solução, projetos dentro da solução e qualquer informação persistente anexada à solução.

O arquivo de cada projeto contém informações adicionais lidas pelo ambiente para preencher a hierarquia com os itens desse projeto. A persistência de dados de hierarquia é controlada pelo projeto. Os dados normalmente não são armazenados no .sln arquivo, embora você possa gravar intencionalmente informações do projeto no .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 ficheiro

O cabeçalho de um .sln ficheiro tem o seguinte aspeto:

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 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 este arquivo de solução.

Corpo do ficheiro

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 como 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') tag, ele mapeia o nome para um VSPackage usando o registro. O nome da chave deve existir no registo 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 QueryInterface o VSPackage para a IVsPersistSolutionProps interface e chama o ReadSolutionProps método com os dados na seção para que o 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 exclusivo do projeto e o GUID do 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 é Visual Basic.

    Cada projeto pode persistir um ID de instância de projeto exclusivo para que 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 resto dos arquivos necessários para o projeto.

  4. Com base nas informações contidas na seção de projeto do .sln arquivo, o ambiente carrega cada arquivo de projeto. O próprio projeto é então responsável por preencher a hierarquia do projeto e carregar todos os 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 OnProjectLoadFailure método é chamado e todos os projetos na solução ignoram as alterações que ele pode ter feito durante o carregamento. Para quaisquer erros de análise, o máximo de informações possível é preservado com os arquivos da 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 .sln no arquivo. Um valor nulo, passado para QuerySaveSolutionProps in VSQUERYSAVESLNPROPS, indica que as informações estão sendo persistidas para 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 IPropertyBag interface até que todas as alterações tenham sido inseridas no .sln arquivo. Desta 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. É apenas 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, uma vez que a solução precisa dessas informações para carregar corretamente. O .suo arquivo contém opções específicas do usuário, como notas privadas que não se destinam a ser compartilhadas ou colocadas sob controle do código-fonte.