Nota:
El acceso a esta página requiere autorización. Puede intentar iniciar sesión o cambiar directorios.
El acceso a esta página requiere autorización. Puede intentar cambiar los directorios.
En este artículo se explica cómo integrar aplicaciones sin empaquetar con la característica de recursos compartidos de Windows. La característica de recursos compartidos permite a los usuarios compartir contenido de una aplicación de Windows a otra. Se debe proporcionar una aplicación sin empaquetar con la identidad del paquete para que pueda registrarse como destino de recurso compartido. Una vez registrada, la aplicación puede recibir y procesar archivos compartidos.
Incorporación de una aplicación sin empaquetar como destino de recurso compartido:
- Proporcionar a la aplicación la identidad del paquete
- Implementar el contrato de recurso compartido
Proporcionar aplicaciones sin empaquetar con la identidad del paquete
Una aplicación puede obtener la identidad del paquete de dos maneras:
- Crear un nuevo paquete de instalación MSIX (método preferido) o bien
- Hacer que las aplicaciones empaquetadas con ubicación externa sean compatibles con el instalador actual. Esto solo se recomienda para las aplicaciones que tienen un instalador existente y que no pueden cambiar a la instalación de MSIX.
Crear un nuevo paquete de instalación de MSIX
Se recomienda empaquetar la aplicación con MSIX mediante la plantilla Proyecto de empaquetado de aplicaciones de Windows en Visual Studio. Esto incluirá todos los archivos binarios en el paquete MSIX y proporcionará una experiencia de instalación limpia y fiable.
Aspectos que hay que tener en cuenta antes de empaquetar aplicaciones de escritorio: Preparación para empaquetar una aplicación de escritorio (MSIX).
Siga los pasos que se describen en Configuración de la aplicación de escritorio para el empaquetado MSIX en Visual Studio para generar un paquete para el proyecto de la aplicación existente.
Nota:
Al crear el proyecto de empaquetado, seleccione Windows 10, versión 2004 (10.0; Compilación 19041) o posterior como Versión mínima.
Cuando se complete, creará el paquete siguiendo los pasos que se describen en Empaquetado de una aplicación de escritorio o para UWP en Visual Studio.
Hacer que el empaquetado con ubicación externa sea compatible con el instalador actual
La segunda forma de proporcionar la identidad del paquete de la aplicación es agregar un paquete con ubicación externa a la aplicación y registrarlo con el instalador existente. El paquete con ubicación externa es un paquete MSIX vacío que contiene el .appxmanifest que tiene identidad, compartir el registro de destino y los recursos visuales. El instalador existente de la aplicación sigue administrando los archivos binarios de la aplicación. Al registrar el paquete, debe proporcionar la ubicación de instalación de la aplicación en la API. Es importante mantener la identidad en el manifiesto del paquete MSIX y el manifiesto de la aplicación Win32 sincronizada con el certificado usado para firmar la aplicación.
Pasos para conceder la identidad del paquete a una aplicación sin empaquetar
La documentación sobre cómo crear un paquete con ubicación externa está disponible aquí, incluida la información sobre las plantillas que se van a usar: Concesión de la identidad del paquete mediante el empaquetado con ubicación externa.
La aplicación de ejemplo completa está disponible en GitHub: Empaquetado con ubicación externa.
Registro como destino de recurso compartido
Una vez que la aplicación tiene la identidad del paquete, el siguiente paso es implementar el contrato de recurso compartido. El contrato de recurso compartido permite que la aplicación reciba datos de otra aplicación.
Puede seguir los mismos pasos que se describen en la sección Registro como destino de recurso compartido de la documentación para integrar aplicaciones empaquetadas con la hoja de recursos compartidos.
Tutorial de la aplicación PhotoStore de ejemplo
En este tutorial sobre la identidad del paquete, el registro y la activación de recursos compartidos para aplicaciones Win32 sin empaquetar, obtendrá información sobre cómo conceder la identidad del paquete a una aplicación Win32 sin empaquetar creando un paquete con ubicación externa. Una vez que la aplicación tiene la identidad del paquete, puede registrar y controlar la activación como destino de recurso compartido. Realizará los pasos siguientes mediante el ejemplo PhotoStoreDemo:
- Generación del archivo
AppxManifest.xml - Creación de un paquete
- Firma del paquete
- Registro del paquete
- Controlar la activación de aplicaciones
Empiece por crear el archivo AppxManifest.xml, que incluye propiedades necesarias como <AllowExternalContent>, identidad y la extensión de destino de funcionalidades y recursos compartidos. Asegúrese de que los valores Publisher, PackageName & ApplicationId del archivo AppxManifest.xml coincidan con los valores del archivo PhotoStoreDemo.exe.manifest. El valor de Publisher también debe coincidir con el valor del certificado usado para firmar el paquete. Agregue los recursos visuales según sea necesario y con referencia en AppxManifest.xml. En Visual Studio, puede usar el nodo Recursos visuales al editar package.manifest en el proyecto Empaquetado de aplicación para generar los recursos visuales necesarios.
Se trata de un fragmento de código de ejemplo de AppxManifest.xml con contenido externo permitido:
<Identity Name="PhotoStoreDemo" ProcessorArchitecture="neutral" Publisher="CN=YourPubNameHere" Version="1.0.0.0" />
<Properties>
<DisplayName>PhotoStoreDemo</DisplayName>
<PublisherDisplayName>Sparse Package</PublisherDisplayName>
<Logo>Assets\storelogo.png</Logo>
<uap10:AllowExternalContent>true</uap10:AllowExternalContent>
</Properties>
<Resources>
<Resource Language="en-us" />
</Resources>
<Dependencies>
<TargetDeviceFamily Name="Windows.Desktop" MinVersion="10.0.19041.0" MaxVersionTested="10.0.19041.0" />
</Dependencies>
<Capabilities>
<rescap:Capability Name="runFullTrust" />
<rescap:Capability Name="unvirtualizedResources"/>
</Capabilities>
<Applications>
<Application Id="PhotoStoreDemo" Executable="PhotoStoreDemo.exe" uap10:TrustLevel="mediumIL" uap10:RuntimeBehavior="win32App">
<uap:VisualElements AppListEntry="none" DisplayName="PhotoStoreDemo" Description="PhotoStoreDemo" BackgroundColor="transparent" Square150x150Logo="Assets\Square150x150Logo.png" Square44x44Logo="Assets\Square44x44Logo.png">
<uap:DefaultTile Wide310x150Logo="Assets\Wide310x150Logo.png" Square310x310Logo="Assets\LargeTile.png" Square71x71Logo="Assets\SmallTile.png"></uap:DefaultTile>
<uap:SplashScreen Image="Assets\SplashScreen.png" />
</uap:VisualElements>
<Extensions>
<uap:Extension Category="windows.shareTarget">
<uap:ShareTarget Description="Send to PhotoStoreDemo">
<uap:SupportedFileTypes>
<uap:FileType>.jpg</uap:FileType>
<uap:FileType>.png</uap:FileType>
<uap:FileType>.gif</uap:FileType>
</uap:SupportedFileTypes>
<uap:DataFormat>StorageItems</uap:DataFormat>
<uap:DataFormat>Bitmap</uap:DataFormat>
</uap:ShareTarget>
</uap:Extension>
...
Este es un archivo Application.exe.manifest de ejemplo:
<?xml version="1.0" encoding="utf-8"?>
<assembly manifestVersion="1.0" xmlns="urn:schemas-microsoft-com:asm.v1">
<assemblyIdentity version="1.0.0.0" name="PhotoStoreDemo.app"/>
<msix xmlns="urn:schemas-microsoft-com:msix.v1"
publisher="CN=YourPubNameHere"
packageName="PhotoStoreDemo"
applicationId="PhotoStoreDemo"
/>
</assembly>
A continuación, para crear el paquete con ubicación externa, use la herramienta MakeAppx.exe con el comando /nv para crear un paquete que contenga el archivo AppxManifest.xml.
Ejemplo:
MakeAppx.exe pack /d <Path to directory with AppxManifest.xml> /p <Output Path>\mypackage.msix /nv
Nota:
Un paquete con ubicación externa contiene un manifiesto del paquete, pero no otros binarios de la aplicación ni su contenido. El manifiesto de un paquete con ubicación externa puede hacer referencia a archivos fuera del paquete en una ubicación externa predeterminada.
Firme el paquete con un certificado de confianza mediante SignTool.exe.
Ejemplo:
SignTool.exe sign /fd SHA256 /a /f <path to cert> /p <cert key> <Path to Package>
El certificado usado para firmar el paquete debe instalarse en una ubicación de confianza en la máquina.
En la primera ejecución de la aplicación, registre el paquete con Windows. Cuando una aplicación tiene su propio instalador, también debe contener el archivo MSIX firmado como carga útil y debe colocarse en una ubicación especificada (por ejemplo, la ubicación de instalación de la aplicación). La aplicación debe conocer esta ubicación en tiempo de ejecución, ya que la aplicación necesitará la ruta de acceso absoluta de MSIX para registrarla. Coloque también los recursos y resources.pri en la ubicación de instalación de la aplicación.
El código siguiente es un ejemplo de ejecución desempaquetada del método Main de la aplicación:
[STAThread]
public static void Main(string[] cmdArgs)
{
//if app isn't running with identity, register its package with external identity
if (!ExecutionMode.IsRunningWithIdentity())
{
//TODO - update the value of externalLocation to match the output location of your VS Build binaries and the value of
//externalPkgPath to match the path to your signed package with external identity (.msix).
//Note that these values cannot be relative paths and must be complete paths
string externalLocation = Environment.CurrentDirectory;
string externalPkgPath = externalLocation + @"\PhotoStoreDemo.package.msix";
//Attempt registration
bool bPackageRegistered = false;
//bPackageRegistered = registerPackageWithExternalLocation(externalLocation, externalPkgPath);
if (bPackageRegistered)
{
//Registration succeeded, restart the app to run with identity
System.Diagnostics.Process.Start(Application.ResourceAssembly.Location, arguments: cmdArgs?.ToString());
}
else //Registration failed, run without identity
{
Debug.WriteLine("Package Registration failed, running WITHOUT Identity");
SingleInstanceManager wrapper = new SingleInstanceManager();
wrapper.Run(cmdArgs);
}
}
...
En este ejemplo se muestra cómo registrar MSIX en la primera ejecución de la aplicación:
[STAThread]
public static void Main(string[] cmdArgs)
{
//If app isn't running with identity, register its package with external identity
if (!ExecutionMode.IsRunningWithIdentity())
{
//TODO - update the value of externalLocation to match the output location of your VS Build binaries and the value of
//externalPkgPath to match the path to your signed package with external identity (.msix).
//Note that these values cannot be relative paths and must be complete paths
string externalLocation = Environment.CurrentDirectory;
string externalPkgPath = externalLocation + @"\PhotoStoreDemo.package.msix";
//Attempt registration
if (registerPackageWithExternalLocation(externalLocation, externalPkgPath))
{
//Registration succeeded, restart the app to run with identity
System.Diagnostics.Process.Start(Application.ResourceAssembly.Location, arguments: cmdArgs?.ToString());
}
else //Registration failed, run without identity
{
Debug.WriteLine("Package Registration failed, running WITHOUT Identity");
SingleInstanceManager wrapper = new SingleInstanceManager();
wrapper.Run(cmdArgs);
}
}
...
Por último, controle la activación de la aplicación:
[STAThread]
public static void Main(string[] cmdArgs)
{
//if app isn't running with identity, register its sparse package
if (!ExecutionMode.IsRunningWithIdentity())
{
...
}
else //App is registered and running with identity, handle launch and activation
{
//Handle Sparse Package based activation e.g Share target activation or clicking on a Tile
// Launching the .exe directly will have activationArgs == null
var activationArgs = AppInstance.GetActivatedEventArgs();
if (activationArgs != null)
{
switch (activationArgs.Kind)
{
case ActivationKind.Launch:
HandleLaunch(activationArgs as LaunchActivatedEventArgs);
break;
case ActivationKind.ToastNotification:
HandleToastNotification(activationArgs as ToastNotificationActivatedEventArgs);
break;
case ActivationKind.ShareTarget: // Handle the activation as a share target
HandleShareAsync(activationArgs as ShareTargetActivatedEventArgs);
break;
default:
HandleLaunch(null);
break;
}
}
//This is a direct exe based launch e.g. double click app .exe or desktop shortcut pointing to .exe
else
{
SingleInstanceManager singleInstanceManager = new SingleInstanceManager();
singleInstanceManager.Run(cmdArgs);
}
}
Demostración de recurso compartido de Windows con identidad del paquete
En el vídeo siguiente se muestra cómo una aplicación sin empaquetar puede ser un destino de recurso compartido después de conceder la identidad del paquete y registrarla como destino de recurso compartido:
Consulte también
- Información general de la implementación del SDK para aplicaciones de Windows
- Creación del primer proyecto de WinUI 3
- Migración de UWP al SDK de Aplicaciones para Windows
- Ventajas y desventajas del empaquetado de una aplicación - Introducción a la implementación
- Identidad, registro y activación de aplicaciones Win32 no empaquetadas
- Implementación del contrato de recurso compartido para el SDK de aplicaciones de Windows
- Implementación de contratos de recursos compartidos para aplicaciones empaquetadas con ubicación externa