Uso de la API de dependencias dinámicas para hacer referencia a paquetes MSIX en tiempo de ejecución
Las dos implementaciones
Hay dos implementaciones de la API de dependencias dinámicas entre las que puede elegir, en función de la plataforma y el escenario de destino:
- API de dependencia dinámica del SDK de aplicaciones de Windows. El SDK de Aplicaciones para Windows proporciona funciones de C y C++ (en msixdynamicdependency.h) y tipos de Windows Runtime (WinRT) (en el espacio de nombres Microsoft.Windows.ApplicationModel.DynamicDependency) que implementan la API de dependencias dinámicas. Puede usar esta implementación de la API en cualquier versión de Windows que admita SDK de aplicación de Windows.
- API de dependencia dinámica de Windows 11. Windows 11 también proporciona funciones de C y C++ que implementan la API de dependencias dinámicas (en appmodel.h). Esta implementación de la API solo se puede usar mediante aplicaciones destinadas a Windows 11, versión 22H2 (10.0; compilación 22621) y versiones posteriores.
Consulte también Diferencias entre las dos implementaciones.
Nota
Como verá en este tema, las API del SDK de Aplicaciones para Windows (C/C++) tienen los mismos nombres que las API de Windows 11 (C/C++) con un prefijo Mdd adicional. Mdd significa Dependencias dinámicas de Microsoft.
Y hay diferentes tipos de paquetes MSIX, que incluyen paquetes de marco, recurso, opcionales y principales. La API de dependencias dinámicas permite que las aplicaciones sin empaquetar usen y hagan referencia a paquetes de marcos como WinUI2 y el entorno de ejecución de DirectX. Para más información sobre las dependencias del paquete de marcos, consulte Paquetes de marcos MSIX y dependencias dinámicas.
Específicamente, la API de dependencias dinámicas proporciona maneras de administrar las referencias en tiempo de instalación y las referencias en tiempo de ejecución para los paquetes MSIX. Para más información, consulte Modelo de mantenimiento para paquetes de marcos.
Uso de la API de dependencias dinámicas
Para usar la API de dependencias dinámicas en la aplicación sin empaquetar para que tome una dependencia en un paquete MSIX, siga este patrón general en el código:
1. Creación de una referencia en tiempo de instalación
En el instalador de la aplicación o durante su primera ejecución, llame a una de las siguientes funciones o métodos para especificar un conjunto de criterios para el paquete MSIX que quiere usar. Esto informa al sistema operativo de que la aplicación tiene una dependencia en un paquete MSIX que cumple los criterios especificados. Si se instalan uno o varios paquetes MSIX que cumplen los criterios, Windows se asegura de que al menos uno de esos paquetes permanezca instalado hasta que se elimine la referencia en el momento de la instalación.
- Windows 11 (C/C++): TryCreatePackageDependency
- SDK de aplicaciones de Windows (C/C++): MddTryCreatePackageDependency
- Windows App SDK (WinRT): PackageDependency.Create
Los criterios que especifique incluyen el nombre de la familia de paquetes, la versión mínima y las arquitecturas; pero no puede indicar un paquete MSIX específico. Al agregar una referencia en tiempo de ejecución al paquete MSIX, la API elige la versión más alta que cumple los criterios especificados.
También debe especificar un artefacto de duración, que puede ser el proceso actual, un archivo o una clave del Registro de Windows que indique al sistema que la aplicación todavía está disponible. Si el artefacto especificado ya no existe, el sistema operativo puede suponer que la dependencia ya no es necesaria y puede desinstalar el paquete MSIX si ninguna otra aplicación ha declarado una dependencia en él. Esta característica es útil en escenarios en los que una aplicación se niega a quitar el PIN de tiempo de instalación cuando se desinstala.
Esta API devuelve un identificador de dependencia que debe usarse en otras llamadas para crear referencias en tiempo de ejecución y eliminar la referencia en tiempo de instalación.
2. Adición de una referencia en tiempo de ejecución
Cuando la aplicación tenga que usar el paquete MSIX, llame a una de las siguientes funciones o métodos para solicitar acceso al paquete MSIX especificado y agregarle una referencia en tiempo de ejecución. Al llamar a esta API, se informa al sistema operativo de que el paquete MSIX está en uso activo y que controle las actualizaciones de versiones en paralelo (lo que retrasa de manera eficaz la desinstalación o el mantenimiento de la versión anterior hasta que la aplicación haya terminado de usarla). Si se completa correctamente, la aplicación podría activar clases y usar contenido del paquete MSIX.
- Windows 11 (C/C++): AddPackageDependency
- SDK de aplicaciones de Windows (C/C++): MddAddPackageDependency
- Windows App SDK (WinRT): PackageDependency.Add
Al llamar a esta API, tiene que pasar el identificador de dependencia que se devolvió al crear la referencia en tiempo de instalación y la clasificación deseada que se usará para el paquete MSIX en el gráfico de paquetes del proceso. Esta API devuelve el nombre completo del paquete MSIX al que se ha hecho referencia, y un identificador que se usa para hacer un seguimiento de la dependencia de uso activo. Si hay varios paquetes MSIX instalados que cumplen los criterios que especificó al crear la referencia en tiempo de instalación, la API elige la versión más alta que cumpla los criterios.
3. Eliminación de la referencia en tiempo de ejecución
Cuando la aplicación haya terminado con el paquete MSIX, llame a una de las siguientes funciones o métodos para quitar la referencia en tiempo de ejecución. Normalmente, la aplicación llamará a esta API durante el apagado. Esta API informa al sistema operativo de que es seguro quitar las versiones innecesarias del paquete MSIX.
- Windows 11 (C/C++): RemovePackageDependency
- SDK de aplicaciones de Windows (C/C++): MddRemovePackageDependency
- Windows App SDK (WinRT): PackageDependencyContext.Remove
Al llamar a esta API, tiene que pasar el identificador que se devolvió cuando agregó la referencia en tiempo de ejecución.
4. Eliminación de la referencia en tiempo de instalación
Cuando se desinstale la aplicación, llame a una de las siguientes funciones o métodos para eliminar la referencia en tiempo de instalación. Esta API informa al sistema operativo de que es seguro quitar el paquete MSIX si ninguna otra aplicación tiene una dependencia en él.
- Windows 11 (C/C++): DeletePackageDependency
- SDK de aplicaciones de Windows (C/C++): MddDeletePackageDependency
- Windows App SDK (WinRT): PackageDependency.Delete
Al llamar a esta API, debe pasar el identificador de dependencia que se devolvió cuando creó la referencia en tiempo de instalación.
Diferencias entre las dos implementaciones
La necesidad de un administrador de vigencia (limitación del SDK de aplicación de Windows)
Cuando la API de dependencia dinámica del SDK de aplicación de Windows para tomar una dependencia en un paquete MSIX, la API requiere ayuda a través de otro paquete instalado y un proceso en ejecución para informar a Windows de que el paquete MSIX está en uso y para bloquear el mantenimiento del marco mientras está en uso. Este componente se denomina administrador de vigencia.
El SDK de Aplicaciones para Windows brinda un componente de administrador de vigencia para su paquete de marcos, denominado Administrador de vigencia de dependencias dinámicas (DDLM). Sin embargo, ningún otro paquete de marcos proporciona actualmente un componente de administrador de vigencia de Microsoft similar.
La API de dependencia dinámica de Windows 11 no tiene esta limitación.
Referencia y uso de un paquete principal (limitación del SDK de aplicación de Windows)
Una dependencia dinámica siempre puede tener como destino un paquete de marco. Pero solo la API de dependencia dinámica de Windows 11 también puede hacer referencia y usar paquetes principales.
El paquete principal debe haber configurado correctamente el archivo de origen del manifiesto del paquete de la aplicación (el archivo Package.appxmanifest
en Visual Studio). En concreto, el paquete principal (el destino, no el autor de la llamada) debe establecer <uap15:DependencyTarget>true</>
(vea uap15:DependencyTarget). Por lo tanto, el propósito de <uap15::DependencyTarget>
es permitir que una dependencia dinámica tenga como destino un paquete principal. En otras palabras, el paquete principal tiene que optar por permitir que se use como dependencia dinámica (mientras que los paquetes de marcos siempre lo permiten implícitamente).
Referencia al paquete de marcos del SDK de aplicación de Windows (limitación del SDK de aplicación de Windows)
En una aplicación sin empaquetar, no puede usar la API de dependencia dinámica del SDK de aplicación de Windows para hacer referencia al paquete del marco del SDK de aplicación de Windows (como puede hacer referencia a otros paquetes MSIX con él). En su lugar, debe usar la API de programa previo proporcionada por Windows App SDK. La API de arranque es una forma especializada de la API de dependencia dinámica que está diseñada para tomar dependencias en el paquete de marcos del SDK de aplicaciones de Windows. Para más información, consulte Uso del tiempo de ejecución del SDK de Windows para aplicaciones empaquetadas con ubicación externa o sin empaquetar.
La API de dependencia dinámica de Windows 11 no tiene esta limitación.