Compartir a través de


Paquetes de marcos MSIX y dependencias dinámicas

En este artículo se presentan conceptos importantes relacionados con paquetes de marco MSIX. La información de este artículo proporciona un contexto útil para ayudarle a comprender mejor el diseño y el propósito de la característica de las dependencias dinámicas en el Windows App SDK y en Windows 11. Esta característica permite a las aplicaciones hacer referencia y usar paquetes de marco MSIX en tiempo de ejecución.

Paquetes de marco y el gráfico de paquetes

MSIX es un formato de paquete que proporciona una experiencia moderna de empaquetado e implementación. También proporciona una manera limpia y de confianza de empaquetar bibliotecas redistribuibles, contenido y componentes a través de paquetes de marco MSIX. Un paquete de marco MSIX permite que las aplicaciones empaquetadas accedan a los componentes a través de un único origen compartido en el dispositivo del usuario, en lugar de agruparlas en el paquete de la aplicación. Entre los paquetes de marco comunes se incluyen el SDK de aplicaciones de Windows (incluido WinUI3), WinUI2 , VCLibs y el DirectX Runtime.

A partir de Windows 8 y continuando con Windows 10 y Windows 11, cada proceso tiene un gráfico de paquetes de que proporciona la lista de todos los paquetes disponibles para la aplicación, incluidos los paquetes de marco de trabajo, recurso, opcionales y principales. Este gráfico permite a la aplicación cargar dll, contenido y declaraciones de clase en tiempo de ejecución proporcionadas por un paquete al que se hace referencia. Históricamente, este grafo se corrigió en el momento de la creación del proceso y no había ninguna manera de modificarlo en tiempo de ejecución:

  • En el caso de las aplicaciones empaquetadas, el gráfico se inicializó en función de las dependencias del paquete declaradas en el elemento PackageDependency en el manifiesto del paquete de la aplicación. Al compilar una aplicación empaquetada, normalmente esto se hacía automáticamente durante el proceso de compilación en función de las referencias y dependencias del proyecto.
  • En el caso de las aplicaciones sin empaquetar, el gráfico de paquetes estaba vacío y no se pudo cambiar. Por lo tanto, las aplicaciones sin empaquetar se limitaban a orden de búsqueda de DLL estándar y no podía acceder a paquetes de marco.

Esta restricción de grafo de paquetes estáticos se levanta con la introducción de la compatibilidad con las dependencias dinámicas tanto en la windows App SDK como en Windows 11. Los desarrolladores pueden usar dependencias dinámicas para hacer referencia y usar paquetes de marco MSIX desde sus aplicaciones en tiempo de ejecución. Las dependencias dinámicas quitan la restricción de grafos de paquetes estáticos de las aplicaciones y los desarrolladores pueden decidir cómo quieren aprovechar los paquetes de marco.

Escenarios principales para dependencias dinámicas

Aunque las dependencias dinámicas permiten que cualquier aplicación agregue una dependencia de marco de paquete en tiempo de ejecución, esta característica está pensada principalmente para aplicaciones empaquetadas con ubicación externa o para aplicaciones que no están empaquetadas. Las aplicaciones empaquetadas todavía pueden seguir agregando dependencias estáticas a través del elemento PackageDependency en su manifiesto de paquete.

Modelo de mantenimiento para paquetes de marco

La característica de dependencias dinámicas conserva la integridad de la canalización de mantenimiento para el paquete de marco al que se hace referencia y se usa dinámicamente en tiempo de ejecución.

Los paquetes de marco MSIX admiten el mantenimiento en un modelo en paralelo, lo que significa que cada versión se instala en su propia carpeta con versiones independiente. Esto permite que las aplicaciones que se usen puedan mantenerse al día e incluso cuando una aplicación más reciente instala una versión más reciente del paquete de marco. El sistema operativo tiene lógica de desinstalación para eliminar versiones anteriores de un paquete de framework determinado, basándose en la presencia de referencias en tiempo de instalación y referencias en tiempo de ejecución para el paquete.

  • Cuando se instala una aplicación, puede crear una referencia durante la instalación a un paquete de framework. Esta referencia informa al sistema operativo de que la aplicación tiene una dependencia del paquete de marco especificado para que el sistema operativo no desinstale el paquete de marco mientras se instala la aplicación.
  • Cuando una aplicación necesita usar API o contenido en un paquete de marco, puede agregar una referencia en tiempo de ejecución al paquete de marco. Esta referencia informa al sistema operativo de que el paquete del framework está en uso activo y que las actualizaciones de versiones se deben manejar de forma paralela. Si se instala una nueva versión del paquete de marco, pero una aplicación en ejecución tiene una versión anterior en uso, el sistema operativo no puede quitar la versión anterior hasta que se quiten todas las referencias en tiempo de ejecución a la versión anterior.

Por ejemplo, dado este escenario:

  • App A se está ejecutando y usando la versión 1.0.0.0 de un paquete de framework determinado.
  • app B está instalado y tiene una dependencia de la versión 1.0.0.1 del mismo paquete de marco.

En este escenario, ambas versiones del paquete de marco se instalarán y usarán app A y App B. Sin embargo, cuando el usuario cierre la aplicación A y, a continuación, se reinicie, recogerá la versión 1.0.0.1 más reciente del paquete de marco. En este momento, el requisito de referencia en tiempo de ejecución ya no es válido para la versión 1.0.0.0 del paquete de marco y el sistema operativo puede quitar de forma segura la versión 1.0.0.0. Más adelante, cuando el usuario desinstala App A y App B, el requisito de referencia en tiempo de instalación ya no es válido, y es seguro que el sistema operativo quite completamente el paquete de infraestructura.

En el caso de las aplicaciones empaquetadas que usan el elemento PackageDependency para especificar referencias estáticas a paquetes de marco, el sistema operativo realiza un seguimiento de las referencias en tiempo de instalación de los paquetes de marco cuando se instala o desinstala la aplicación. En el caso de las referencias en tiempo de ejecución que se administran mediante la característica de dependencias dinámicas, el sistema operativo sabe cuándo se ejecuta una aplicación empaquetada y evitará quitar sus paquetes de marcos en uso cuando haya uno más reciente disponible.