Paquetes de marcos MSIX y dependencias dinámicas

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

Paquetes de marcos y el gráfico de paquetes

MSIX es un formato de paquete que brinda una experiencia moderna de empaquetado e implementación. También ofrece una manera limpia y confiable de empaquetar bibliotecas, contenido y componentes redistribuibles a través de paquetes de marcos MSIX. Un paquete de marcos 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 agruparlos en el paquete de la aplicación. Los paquetes de marcos comunes incluyen SDK de aplicaciones de Windows (incluido WinUI3), WinUI2, VCLibs y el entorno en tiempo de ejecución de DirectX.

A partir de Windows 8 y siguiendo con Windows 10 y Windows 11, cada proceso tiene un gráfico de paquetes que ofrece la lista de todos los paquetes disponibles para la aplicación, incluidos los paquetes de marcos, recursos, opcionales y principales. Este gráfico permite a la aplicación cargar archivos DLL, contenido y declaraciones de clase en tiempo de ejecución proporcionadas por un paquete al que se hace referencia. Históricamente, este gráfico se corregía 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 del manifiesto de paquete de la aplicación. Al compilar una aplicación empaquetada, esto normalmente sucedí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 al orden de búsqueda de DLL estándar y no podían acceder a los paquetes de marcos.

Esta restricción del gráfico de paquetes estático se elimina con la introducción de la compatibilidad con dependencias dinámicas en el SDK de aplicaciones de Windows y en Windows 11. Los desarrolladores pueden usar dependencias dinámicas para hacer referencia a paquetes de marcos MSIX y usarlos desde sus aplicaciones en tiempo de ejecución. Las dependencias dinámicas quitan la restricción del gráfico de paquetes estático de las aplicaciones, y los desarrolladores pueden decidir cómo quieren aprovechar los paquetes de marcos.

Escenarios principales para dependencias dinámicas

Aunque las dependencias dinámicas permiten que cualquier aplicación agregue una dependencia del marco del paquete en tiempo de ejecución, esta función está pensada principalmente para que la utilicen las aplicaciones empaquetadas con ubicación externa o las aplicaciones sin empaquetar. Las aplicaciones empaquetadas pueden seguir agregando dependencias estáticas a través del elemento PackageDependency en el manifiesto de paquete.

Modelo de mantenimiento para paquetes de marcos

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

Los paquetes de marcos MSIX admiten el mantenimiento en un modelo en paralelo, es decir, cada versión se instala en su propia carpeta con versión independiente. Esto permite que las aplicaciones en uso puedan permanecer en funcionamiento incluso cuando una aplicación más reciente instale una versión más reciente del paquete de marcos. El sistema operativo tiene lógica de desinstalación para saber cuándo eliminar versiones anteriores de un paquete de marcos determinado, en función de 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, esta puede crear una referencia en tiempo de instalación a un paquete de marcos. Esta referencia informa al sistema operativo de que la aplicación tiene una dependencia en el paquete de marcos especificado, de modo que el sistema operativo no desinstale el paquete de marcos mientras se instala la aplicación.
  • Cuando una aplicación necesita usar API o contenido de un paquete de marcos, puede agregar una referencia en tiempo de ejecución al paquete de marcos. Esta referencia informa al sistema operativo de que el paquete de marcos está en uso activo y que controle las actualizaciones de versiones en paralelo. Si se instala una nueva versión del paquete de marcos, pero una aplicación en ejecución tiene en uso una versión anterior, 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:

  • La aplicación A se ejecuta y usa la versión 1.0.0.0 de un paquete de marcos determinado.
  • Se instala la aplicación B, que tiene una dependencia en la versión 1.0.0.1 del mismo paquete de marcos.

En este escenario, la aplicación A y la aplicación B instalarán y usarán ambas versiones del paquete de marcos. Sin embargo, cuando el usuario cierre la aplicación A y luego la reinicie, esta recogerá la versión más reciente, 1.0.0.1, del paquete del marcos. 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 marcos, y el sistema operativo puede quitar de forma segura la versión 1.0.0.0. Más adelante, cuando el usuario desinstala la aplicación A y la aplicación B, el requisito de referencia en tiempo de instalación ya no es válido y es seguro que el sistema operativo quite el paquete de marcos por completo.

En el caso de las aplicaciones empaquetadas que usen el elemento PackageDependency para especificar referencias estáticas a paquetes de marcos, el sistema operativo hace el seguimiento de las referencias en tiempo de instalación de los paquetes de marcos cuando la aplicación se instala o desinstala. 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.