Aplicación del marco de compatibilidad de paquete en Visual Studio
El marco de soporte técnico de paquetes (PSF) es un proyecto de código abierto que permite aplicar correcciones a la aplicación de escritorio existente. PsF permite que una aplicación se ejecute en un formato empaquetado sin modificar el código. La plataforma de compatibilidad de paquete te ayuda a que la aplicación siga las prácticas recomendadas del entorno de tiempo de ejecución moderno.
En las secciones siguientes, exploraremos cómo crear un nuevo proyecto de Visual Studio, incluir el marco de compatibilidad de paquetes para la solución y crear correcciones en tiempo de ejecución.
Paso 1: Crear una solución de paquete en Visual Studio
En Visual Studio, cree una nueva solución de Visual Studio, Solución en blanco. Incluya los proyectos de aplicación en la solución en blanco recién creada.
Paso 2: Agregar un proyecto de empaquetado
Si aún no tiene un proyecto de empaquetado de aplicaciones de Windows, cree uno y agréguelo a la solución. Cree un nuevo proyecto de visual C# -> Windows Universal -> Windows Application Packaging Project y agréguelo a la solución recién creada.
Para obtener más información sobre el proyecto de empaquetado de aplicaciones de Windows, vea Empaquetar la aplicación mediante Visual Studio.
En Explorador de soluciones, haga clic con el botón derecho en el proyecto de empaquetado, seleccione Editar archivo de proyecto y, a continuación, agréguelo a la parte inferior del archivo del proyecto:
...
<Target Name="PSFRemoveSourceProject" AfterTargets="ExpandProjectReferences" BeforeTargets="_ConvertItems">
<ItemGroup>
<FilteredNonWapProjProjectOutput Include="@(_FilteredNonWapProjProjectOutput)">
<SourceProject Condition="'%(_FilteredNonWapProjProjectOutput.SourceProject)'=='_Runtime fix project name_'" />
</FilteredNonWapProjProjectOutput>
<_FilteredNonWapProjProjectOutput Remove="@(_FilteredNonWapProjProjectOutput)" />
<_FilteredNonWapProjProjectOutput Include="@(FilteredNonWapProjProjectOutput)" />
</ItemGroup>
</Target>
</Project>
Paso 3: Agregar proyecto para la corrección en tiempo de ejecución
Agregue un nuevo proyecto de Visual C++ -> Escritorio de Windows :> biblioteca de Dynamic-Link (DLL) a la solución.
A continuación, haga clic con el botón derecho en el proyecto y, a continuación, elija Propiedades.
En la página de propiedades, busque el campo Propiedades de configuración -> C/C++ -> Lenguaje -> Estándar del lenguaje C++ . A continuación, seleccione ISO C++17 Standard (/std:c++17) en el menú desplegable.
Haga clic con el botón derecho en el proyecto y, después, en el menú contextual, elija la opción Administrar paquetes Nuget . Asegúrese de que la opción Origen del paquete esté establecida en Todos o nuget.org.
Haga clic en el icono de configuración situado junto a ese campo.
Busque los paquetes Nuget para PSF y, a continuación, instale Microsoft.PackageSupportFramework para este proyecto.
Paso 4: Agregar un proyecto que inicia el ejecutable del iniciador de PSF
Agregue un nuevo proyecto vacío de Visual C++ -> General> a la solución.
Siga estos pasos:
- Haga clic con el botón derecho en ese proyecto y, después, en el menú contextual, elija la opción Administrar paquetes Nuget . Asegúrese de que la opción Origen del paquete esté establecida en Todos o nuget.org.
- Haga clic en el icono de configuración situado junto a ese campo.
- Busque los paquetes Nuget para PSF y, a continuación, instale Microsoft.PackageSupportFramework para este proyecto.
Abra las páginas de propiedades del proyecto y, en la página Configuración general, establezca la propiedad PSFLauncher32
Nombre de destino en o PSFLauncher64
en función de la arquitectura de la aplicación.
Agregue una referencia de proyecto al proyecto de corrección en tiempo de ejecución de la solución.
Haga clic con el botón derecho en la referencia y, a continuación, en la ventana Propiedades , aplique estos valores.
Propiedad | Valor |
---|---|
Copiar local | True |
Copiar ensamblados satélite locales | True |
Salida de ensamblado de referencia | True |
Dependencias de la biblioteca de vínculos | False |
Entradas de dependencia de la biblioteca de vínculos | False |
Paso 5: Configurar el proyecto de empaquetado
Para configurar el proyecto de empaquetado, siga estos pasos:
- En el proyecto de empaquetado, haga clic con el botón derecho en la carpeta Aplicaciones y, a continuación, elija Agregar referencia en el menú desplegable.
- Elija el proyecto PSF Launcher y el proyecto de aplicación de escritorio y, a continuación, elija el botón Aceptar .
- Seleccione el iniciador de PSF y el proyecto Aplicación de escritorio y, a continuación, haga clic en el botón Aceptar. Si el código fuente de la aplicación no está disponible, seleccione solo el proyecto PSF Launcher.
- En el nodo Aplicaciones , haga clic con el botón derecho en la aplicación Iniciador de PSF y, a continuación, elija Establecer como punto de entrada.
Agregue un archivo denominado config.json
al proyecto de empaquetado y, a continuación, copie y pegue el siguiente texto JSON en el archivo. Establezca la propiedad Acción del paquete en Contenido.
{
"applications": [
{
"id": "",
"executable": "",
"workingDirectory": ""
}
],
"processes": [
{
"executable": "",
"fixups": [
{
"dll": "",
"config": {
}
}
]
}
]
}
Proporcione un valor para cada clave. Use esta tabla como guía.
Array | key | Value |
---|---|---|
applications | id | Use el valor del Id atributo del Application elemento en el manifiesto del paquete. |
applications | ejecutable | Ruta de acceso relativa al paquete al ejecutable que desea iniciar. En la mayoría de los casos, puede obtener este valor del archivo de manifiesto del paquete antes de modificarlo. Es el valor del Executable atributo del Application elemento . |
applications | workingDirectory | (Opcional) Ruta de acceso relativa al paquete que se va a usar como directorio de trabajo de la aplicación que se inicia. Si no establece este valor, el sistema operativo usa el System32 directorio como directorio de trabajo de la aplicación. |
procesos | ejecutable | En la mayoría de los casos, este será el nombre del configurado anteriormente con la ruta de executable acceso y la extensión de archivo quitadas. |
Reparaciones | dll | Ruta de acceso relativa al paquete al archivo DLL de corrección que se va a cargar. |
Reparaciones | config | (Opcional) Controla cómo se comporta el archivo DLL de corrección. El formato exacto de este valor varía según la corrección, ya que cada corrección puede interpretar este "blob" como desee. |
Cuando haya terminado, el config.json
archivo tendrá un aspecto similar al siguiente.
{
"applications": [
{
"id": "DesktopApplication",
"executable": "DesktopApplication/WinFormsDesktopApplication.exe",
"workingDirectory": "WinFormsDesktopApplication"
}
],
"processes": [
{
"executable": ".*App.*",
"fixups": [ { "dll": "RuntimeFix.dll" } ]
}
]
}
Nota
Las applications
claves , processes
y fixups
son matrices. Esto significa que puede usar el archivo config.json para especificar más de una aplicación, proceso y archivo DLL de corrección.
Depuración de una corrección en tiempo de ejecución
En Visual Studio, presione F5 para iniciar el depurador. Lo primero que se inicia es la aplicación PSF Launcher, que a su vez inicia la aplicación de escritorio de destino. Para depurar la aplicación de escritorio de destino, tendrá que asociarse manualmente al proceso de aplicación de escritorio; para ello, elija Depurar-Asociar> al proceso y, a continuación, seleccione el proceso de aplicación. Para permitir la depuración de una aplicación .NET con un archivo DLL de corrección en tiempo de ejecución nativo, seleccione tipos de código administrados y nativos (depuración en modo mixto).
Puede establecer puntos de interrupción junto a líneas de código en el código de la aplicación de escritorio y el proyecto de corrección en tiempo de ejecución. Si no tiene el código fuente en la aplicación, podrá establecer puntos de interrupción solo junto a las líneas de código del proyecto de corrección en tiempo de ejecución.