Archivo de solución (.sln)

Una solución es una estructura para organizar proyectos en Visual Studio. La solución mantiene la información de estado de los proyectos en dos archivos:

  • .sln archivo (basado en texto, compartido)

  • .suo archivo (opciones de solución binarias, específicas del usuario)

Para obtener más información sobre los archivos .suo, vea Solution User Options (.suo) File.

Si el VSPackage se carga debido a que se hace referencia en el .sln archivo, el entorno llama ReadSolutionProps a para leerlo en el .sln archivo.

El .sln archivo contiene información basada en texto que el entorno usa para buscar y cargar los parámetros name-value para los datos persistentes y el proyecto VSPackages hace referencia a él. Cuando un usuario abre una solución, el entorno recorre la preSolutioninformación , Projecte postSolution del .sln archivo para cargar la solución, los proyectos dentro de la solución y cualquier información persistente adjunta a la solución.

El archivo de cada proyecto contiene información adicional que lee el entorno para rellenar la jerarquía con los elementos del proyecto. El proyecto controla la persistencia de datos de jerarquía. Los datos no se almacenan normalmente en el .sln archivo, aunque puede escribir intencionadamente información del proyecto en el .sln archivo si decide hacerlo. Para obtener más información sobre la persistencia, vea Persistencia del proyecto y Apertura y guardado de elementos de proyecto.

Encabezado de archivo

El encabezado de un .sln archivo tiene este aspecto:

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

Definiciones

Microsoft Visual Studio Solution File, Format Version 12.00
Encabezado estándar que define la versión del formato de archivo.

# Visual Studio Version 16
La versión principal de Visual Studio que (más recientemente) guardó este archivo de solución. Esta información controla el número de versión en el icono de la solución.

VisualStudioVersion = 16.0.28701.123
La versión completa de Visual Studio que (más recientemente) guardó el archivo de solución. Si el archivo de solución se guarda mediante una versión más reciente de Visual Studio que tiene la misma versión principal. Este valor no se actualiza para reducir la renovación en el archivo.

MinimumVisualStudioVersion = 10.0.40219.1
La versión mínima (más antigua) de Visual Studio que puede abrir este archivo de solución.

Microsoft Visual Studio Solution File, Format Version 12.00
Encabezado estándar que define la versión del formato de archivo.

# Visual Studio Version 17
La versión principal de Visual Studio que (más recientemente) guardó este archivo de solución. Esta información controla el número de versión en el icono de la solución.

VisualStudioVersion = 17.2.32505.173
La versión completa de Visual Studio que (más recientemente) guardó el archivo de solución. Si el archivo de solución se guarda mediante una versión más reciente de Visual Studio que tiene la misma versión principal. Este valor no se actualiza para reducir la renovación en el archivo.

MinimumVisualStudioVersion = 10.0.40219.1
La versión mínima (más antigua) de Visual Studio que puede abrir este archivo de solución.

Cuerpo del archivo

El cuerpo de un .sln archivo consta de varias secciones etiquetadas 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 cargar una solución, el entorno realiza la siguiente secuencia de tareas:

  1. El entorno lee la sección Global del .sln archivo y procesa todas las secciones marcadas como preSolution. En este archivo de ejemplo, hay una instrucción de este tipo:

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

    Cuando el entorno lee la GlobalSection('name') etiqueta, asigna el nombre a un VSPackage mediante el registro. El nombre de clave debe existir en el Registro en [HKLM\\<Application ID Registry Root\>\SolutionPersistence\AggregateGUIDs]. El valor predeterminado de las claves es el GUID del paquete (REG_SZ) del VSPackage que escribió las entradas.

  2. El entorno carga VSPackage, llama a QueryInterface en VSPackage para la IVsPersistSolutionProps interfaz y llama al ReadSolutionProps método con los datos de la sección para que VSPackage pueda almacenar los datos. El entorno repite este proceso para cada preSolution sección.

  3. El entorno recorre en iteración los bloques de persistencia del proyecto. En este caso, hay un proyecto.

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

    Esta instrucción contiene el GUID de proyecto único y el GUID de tipo de proyecto. El entorno usa esta información para buscar el archivo del proyecto o los archivos que pertenecen a la solución y el VSPackage necesario para cada proyecto. El GUID del proyecto se pasa a IVsProjectFactory para cargar el VSPackage específico relacionado con el proyecto y, a continuación, el vsPackage carga el proyecto. En este caso, el VSPackage que se carga para este proyecto es Visual Basic.

    Cada proyecto puede conservar un identificador de instancia de proyecto único para que otros proyectos de la solución puedan acceder a ellos según sea necesario. Idealmente, si la solución y los proyectos están bajo control de código fuente, la ruta de acceso al proyecto debe ser relativa a la ruta de acceso de la solución. Cuando la solución se carga por primera vez, los archivos del proyecto no pueden estar en el equipo del usuario. Al tener el archivo de proyecto almacenado en el servidor en relación con el archivo de solución, es más sencillo que el archivo del proyecto se encuentre y copie en el equipo del usuario. A continuación, copia y carga el resto de los archivos necesarios para el proyecto.

  4. En función de la información contenida en la sección del proyecto del .sln archivo, el entorno carga cada archivo de proyecto. A continuación, el propio proyecto es responsable de rellenar la jerarquía del proyecto y cargar los proyectos anidados.

  5. Una vez procesadas todas las secciones del .sln archivo, la solución se muestra en Explorador de soluciones y está lista para su modificación por parte del usuario.

Si algún proyecto de la solución que implementa VSPackage no se puede cargar, se llama al OnProjectLoadFailure método y todos los proyectos de la solución omiten los cambios realizados durante la carga. Para cualquier error de análisis, la mayor cantidad de información posible se conserva con los archivos de solución. El entorno muestra un cuadro de diálogo que advierte al usuario de que la solución está dañada.

Cuando se guarda o cierra la solución, se llama al QuerySaveSolutionProps método . Se pasa a la jerarquía para ver si se han realizado cambios en la solución que se deben escribir en el .sln archivo. Un valor NULL, pasado a QuerySaveSolutionProps en VSQUERYSAVESLNPROPS, indica que la información se está conservando para la solución. Si el valor no es NULL, la información persistente es para un proyecto específico, determinado por el puntero a la IVsHierarchy interfaz.

Si hay información que se va a guardar, se llama a la IVsSolutionPersistence interfaz con un puntero al SaveSolutionProps método . A WriteSolutionProps continuación, el entorno llama al método para recuperar los pares nombre-valor de la IPropertyBag interfaz y escribir la información en el .sln archivo.

SaveSolutionProps El entorno llama a los objetos y WriteSolutionProps de forma recursiva para recuperar información que se va a guardar desde la IPropertyBag interfaz hasta que se hayan introducido todos los cambios en el .sln archivo. De este modo, puede asegurarse de que la información se conservará con la solución y estará disponible la próxima vez que se abra la solución.

Cada VSPackage cargado se enumera para ver si tiene algo que guardar en .sln el archivo. Solo es en tiempo de carga que se consultan las claves del Registro. El entorno conoce todos los paquetes cargados porque están en memoria en el momento en que se guarda la solución.

Solo el .sln archivo contiene entradas en las preSolution secciones y postSolution . No hay secciones similares en el archivo .suo, ya que la solución necesita esta información para cargarse correctamente. El .suo archivo contiene opciones específicas del usuario, como notas privadas que no están diseñadas para compartirse o colocarse bajo el control de código fuente.