c# winforms wix windows-installer visual-studio-2017

c# - El instalador de WiX msi no instala la aplicación Winform creada con Visual Studio 2017



winforms windows-installer (2)

Para una prueba simple, creé una aplicación de instalación de Wix para una aplicación Winform simple de la siguiente manera. Pero cuando ejecuto el msi creado con el instalador, se ejecuta solo por un segundo y sale sin instalar la aplicación Winform. Pregunta : ¿Cuál podría ser el problema aquí? Parece que falta algo en mi archivo Product.wxs . Nota : estoy usando VS2017

Pasos para producir el problema

  1. Wix Toolset Visual Studio 2017 Extension desde here y seguí sus instrucciones para instalar WiX 3.11 RC2 desde here
  2. Creó un Winform project predeterminado [solo una forma única, nada agregado a él]
  3. Creé un Wix Setup project usando la plantilla Toolset/v3/Setup Project en la misma solución
  4. En el proyecto de configuración de WiX Se agregó una referencia al proyecto Winform
  5. Construyó toda la solución.
  6. Haga clic con el botón derecho en el proyecto de instalación y lo reconstruyó para crear un archivo .msi en su carpeta /..bin/Debug
  7. Haga doble clic en el archivo .msi del paso 6. El archivo se ejecutó durante un segundo, apareció el cuadro de diálogo de instalación de Windows 10 (como aparece para cualquier instalación que le pregunte si desea instalar este programa). Hice clic en Yes . El instalador volvió a funcionar durante un segundo y luego salió. Pero la aplicación Winform no estaba instalada.

Archivo predeterminado Product.wxs [No agregué nada aquí excepto agregar un valor al atributo Manufacturer ]

<?xml version="1.0" encoding="UTF-8"?> <Wix xmlns="http://schemas.microsoft.com/wix/2006/wi"> <Product Id="*" Name="SetupProject1" Language="1033" Version="1.0.0.0" Manufacturer="WiX_test_4_Winfrm" UpgradeCode="e69fe67b-5c28-4764-8196-a6613b840eff"> <Package InstallerVersion="200" Compressed="yes" InstallScope="perMachine" /> <MajorUpgrade DowngradeErrorMessage="A newer version of [ProductName] is already installed." /> <MediaTemplate /> <Feature Id="ProductFeature" Title="SetupProject1" Level="1"> <ComponentGroupRef Id="ProductComponents" /> </Feature> </Product> <Fragment> <Directory Id="TARGETDIR" Name="SourceDir"> <Directory Id="ProgramFilesFolder"> <Directory Id="INSTALLFOLDER" Name="SetupProject1" /> </Directory> </Directory> </Fragment> <Fragment> <ComponentGroup Id="ProductComponents" Directory="INSTALLFOLDER"> <!-- TODO: Remove the comments around this Component element and the ComponentRef below in order to add resources to this installer. --> <!-- <Component Id="ProductComponent"> --> <!-- TODO: Insert files, registry keys, and other resources here. --> <!-- </Component> --> </ComponentGroup> </Fragment> </Wix>


"Hola WiX" (aluminio transparente por favor)

Creo que lo que necesita es el "Hello World" de WiX de CodeProject . Esto es bastante antiguo ahora, pero sigue siendo bueno para mostrarte los conceptos básicos de cómo compilar un MSI que funcione.

ACTUALIZACIÓN : a continuación he agregado una descripción paso a paso de cómo compilar un MSI a partir de un nuevo proyecto de WiX 3 Visual Studio.

Aquí hay otra respuesta desde hace un tiempo con información contextual sobre lo que realmente es WiX: MSI vs paquetes nuget: ¿cuáles son mejores para la entrega continua? . Encontrarás el enlace a "hola mundo" aquí también, pero también varios otros enlaces.

En resumen : verifique el primer enlace para obtener el "hola mundo" de WiX. Luego actualice su fuente con un par de componentes de prueba y recompile. Debe obtener Orca (herramienta SDK) para poder ver los archivos MSI compilados. Como tiene instalado Visual Studio, intente buscar Orca-x86_en-us.msi e instálelo (este es el propio visor y editor oficial de Microsoft MSI). Luego encuentra Orca en el menú de inicio. Técnicamente, Orca se instala como parte del SDK de Windows (no Visual Studio), pero el SDK de Windows se incluye con la instalación de Visual Studio. Una vez que tenga un archivo MSI compilado, simplemente haga clic derecho y seleccione Edit with Orca .

Se necesitará algo de experiencia antes de que tal archivo realmente tenga sentido. En esencia, es una base de datos MS SQL primitiva almacenada en un archivo de almacenamiento estructurado COM (OLE). Esencialmente, un sistema de archivos en un archivo con secuencias para diferentes contenidos (como archivos y tablas de datos, etc.). Solo piense en ello como una base de datos con integridad referencial normal y concéntrese en las tablas centrales como File y Component al principio.

Compilación mínima de MSI de WiX: paso a paso

Permítanme probar una descripción paso a paso de lo que puede hacer en un proyecto de WiX 3 recién hecho para que se compile con una GUI predeterminada de WiX. Puede ver estos cambios "combinados" en una muestra completa en la última sección de la respuesta, pero lea esto paso a paso para que tenga sentido.

  1. Crea un nuevo proyecto WiX3 . Sabes cómo hacerlo, no perderé tiempo con los detalles.

  2. Establezca el atributo Manufacturer en el nombre de su empresa. Ahora establezca un nuevo nombre de su elección para el atributo Name . En este ejemplo, se establece en MinimalTester ; utilice otra cosa, por favor.

  3. Cambie <MediaTemplate /> a <MediaTemplate EmbedCab="yes" /> para usar archivos cab integrados en el MSI. De esta manera solo se crea el MSI y no hay un archivo CAB externo adicional.

  4. Directamente después del elemento MediaTemplate, agregue esto: <UIRef Id="WixUI_Mondo" /> . Esto agregará un cuadro de diálogo predeterminado de WiX a su MSI para que tenga los conceptos básicos de lo que se necesita para ser más genéricamente útil. Ahora puede ejecutar la reparación y la modificación, y obtiene un asistente para la instalación original en línea con lo que la mayoría de los archivos MSI proporcionan desde Installshield o Advanced Installer u otras herramientas profesionales. Y lo más importante: su instalación administrativa tendrá un cuadro de diálogo donde puede especificar dónde se deben extraer los archivos.

  5. Agregaremos nuestro propio Acuerdo de licencia a la configuración de WiX (o de lo contrario, obtendrá un murmullo predeterminado). Directamente después de <UIRef Id="WixUI_Mondo" /> agregue este elemento: <WixVariable Id="WixUILicenseRtf" Value="TestLicenseAgreement.rtf" /> . Ahora cree el archivo TestLicenseAgreement.rtf y colóquelo en la misma carpeta que su archivo fuente principal de WiX (forma rápida: en Visual Studio, haga clic con el botón derecho en proyecto y "Abrir carpeta en el Explorador de archivos", ahora cree el archivo RTF con clic derecho => Nuevo => archivo RTF. Y quizás abra el RTF e ingrese un texto de prueba). Personalización adicional de los cuadros de diálogo (mapas de bits y más).

  6. El conjunto de diálogo de WiX se define en un dll, debemos hacer referencia a él. En su proyecto de Visual Studio WiX: Right click References => Add Reference... => Navigate to C:/Program Files (x86)/WiX Toolset v3.11/bin/ . Haga doble clic en WixUIExtension.dll y finalmente haga OK en OK .

  7. Ahora agregue el componente mínimo absoluto posible en WiX con una ruta absoluta especificada como fuente. Esto es para asegurarse de que puede compilar el MSI. Luego, puede hacer que la ruta sea relativa o variable (solo agregue esto directamente bajo el elemento de directorio INSTALLFOLDER por ahora):

<Component Feature="ProductFeature"> <File Source="C:/Users/someone/SourceControl/MyProject/CoreApp.exe" /> </Component>

  1. Finalmente haga clic derecho en el proyecto WiX en su solución y seleccione Build . Y puede probar rápidamente ejecutar el MSI haciendo clic derecho en el proyecto WiX y haciendo clic en Open Folder in File Explorer . Ahora haga doble clic en bin y luego en Debug (o Release si cambió a una versión de lanzamiento; no estoy seguro de cuáles son las "diferencias predeterminadas" entre las dos configuraciones). Debería ver su propio acuerdo de licencia en el segundo cuadro de diálogo en la secuencia de diálogo.

Las versiones posteriores de WiX tienen valores predeterminados excelentes para los atributos que casi siempre se establecen en "valores de plantilla" o donde dos atributos son esencialmente redundantes. Simplemente déjelos fuera de su fuente y deje que el compilador WiX los agregue con los valores predeterminados. Mucho menos alboroto.

Como ejemplo: el elemento anterior carece de un Component Id . Durante la compilación, el valor predeterminado es el Id del elemento File que contiene. El File element Id a su vez, también falta y se establecerá de manera predeterminada en el nombre de archivo especificado por el Source attribute (que es un atributo obligatorio).

Quizás mire esta respuesta para una descripción más larga y un ejemplo concreto hacia abajo: ¿ Sintaxis para guías en WIX? ¿Ves lo simple que pueden ser tus archivos fuente WiX una vez que eliminas toda la redundancia y duplicación de ciertos atributos? Menos texto, menos errores.

Ejemplo de fuente mínima de WiX: comentarios en línea

En la siguiente muestra, el componente se ha movido al Grupo de componentes predeterminado; por lo tanto, no es necesario especificar a qué característica pertenece (a diferencia de lo anterior).

<?xml version="1.0" encoding="UTF-8"?> <Wix xmlns="http://schemas.microsoft.com/wix/2006/wi"> <!--CHANGE 0: Set Manufacturer attribute to something, you must also specify a full GUID for UpgradeCode --> <Product Id="*" Name="MinimalTester" Language="1033" Version="1.0.0.0" Manufacturer="My Company" UpgradeCode="PUT-GUID-HERE"> <Package InstallerVersion="200" Compressed="yes" InstallScope="perMachine" /> <MajorUpgrade DowngradeErrorMessage="A newer version of [ProductName] is already installed." /> <!--Standard: <MediaTemplate />--> <!--CHANGE #1: Enable embedded cab files, so there is only one file generated, the MSI file --> <MediaTemplate EmbedCab="yes" /> <!--CHANGE #2: Add the following elements to link one of the default WiX GUI sequences and show the specified license agreement. The RTF file must be created and placed next to your WiX source file --> <UIRef Id="WixUI_Mondo" /> <WixVariable Id="WixUILicenseRtf" Value="TestLicenseAgreement.rtf" /> <!--CHANGE #3: Add WiX dll reference. In Visual Studio WiX project: Right click References => Add Reference... => Navigate to C:/Program Files (x86)/WiX Toolset v3.11/bin/. Double click WixUIExtension.dll. Click OK --> <Feature Id="ProductFeature" Title="MinimalTester" Level="1"> <ComponentGroupRef Id="ProductComponents" /> </Feature> </Product> <Fragment> <Directory Id="TARGETDIR" Name="SourceDir"> <Directory Id="ProgramFilesFolder"> <Directory Id="INSTALLFOLDER" Name="MinimalTester" /> </Directory> </Directory> </Fragment> <Fragment> <ComponentGroup Id="ProductComponents" Directory="INSTALLFOLDER"> <!--CHANGE #4: Remove TODO elements, add the most basic component possible as illustrated below --> <Component> <File Source="C:/Users/someone/SourceControl/MyProject/CoreApp.exe" /> </Component> </ComponentGroup> </Fragment> </Wix>

Intenta compilar y probar la instalación. Debe instalarse en C:/Program Files (x86)/MinimalTester en un sistema normal.

Tal vez vea más enlaces para tutoriales de WiX aquí: el instalador de WIX no muestra la imagen personalizada de WixUI Dialog correctamente .