Tuesday, December 6, 2016

Wix Custom Action Binary Options

Wix Tips Trucos Wix es potente, y yo wouldnt recomendar cualquier otro sistema de construcción de instalación para proyectos serios. Infinitamente personalizable, con scripts, utiliza archivos estándar MSI, no cuesta nada y tal vez lo mejor de todo, se integra directamente con Visual Studio. Tanto Wix en sí y el sistema MSI está construido en introducir una serie de peculiaridades, sin embargo, y la curva de aprendizaje es bastante, bastante empinada. Y luego hay aprendizaje de la mentalidad correcta: un archivo por componente, de preferencia agregado a mano. He aquí algunos consejos misceláneos nada demasiado avanzado, pero vale la pena saber todo lo mismo. Referencias de proyectos Las referencias a otros proyectos en la solución son quizás la cosa más importante sobre el uso de Wix, y lo que lo hace tan grande de usar. La adición de una referencia es simple: los proyectos que se refieren se construirán con el instalador y en la misma configuración (debug / release / whatever). Se ocupa de los problemas de orden de construcción al instante. Y las referencias tienen propiedades también Puede configurar Wix para recolectar automáticamente los archivos que pertenecen a un proyecto utilizando HEAT. Podría ser útil si su proyecto incluye información COM HEAT es capaz de procesar, aunque Ive más utilizado HEAT de pre-construir los pasos para cosechar cosas como un directorio lleno de archivos de documentación. Havent tuvo mucha suerte al usar HEAT en servidores autoexigibles de. exe nativos, tampoco. Realmente reduce la información codificada y se deshace con los caminos relativos a su instalador. Versión del archivo de versión del instalador, versión en el nombre del producto Mediante la variable especial (bind. FileVersion.), Puede configurar el instalador para que tenga la misma versión que un determinado archivo al que hace referencia. También me gusta añadir la versión al nombre del producto, por lo que es claro lo que está siendo instalado, y tener el nombre del producto como una macro que se puede volver a utilizar a lo largo del instalador. Para aclarar Ive definido el producto en el código aquí, pero es mejor hacerlo en las opciones de proyecto: de esa manera, la macro es global a todos los archivos en el proyecto. Adición de archivos como vínculos A diferencia de Visual C, si agrega un archivo existente a un proyecto Wix, lo copia. Agregar el archivo como un enlace es extremadamente simple si usted no tiene el hábito de pasar por alto las opciones de botón Ok adicionales en Diálogos de elementos comunes. es decir. ComponentGroups y directorios Una cosa molesta sobre el esquema Wix es que no se puede tener un ComponentGroup dentro de un elemento DirectoryRef, o viceversa. Los elementos ComponentGroup y DirectoryRef son críticos para proyectos más grandes, donde una característica puede compartir grupos de componentes, que a su vez se definen en archivos diferentes. Esto significa que tienden a ver código como Nota cómo el ComponentGroup debe contener un ComponentRef para cada componente en otras palabras, para cada componente agregado, debe editar el archivo en dos lugares, lo que es molesto. Afortunadamente, desde la versión 3, Wix soporta un atributo Directory para los componentes: Much neater. La única desventaja es que el directorio debe repetirse para cada Componente. Pero en la práctica no encuentro esto de un problema. Theres siempre la función find / replace, después de todo. El elemento MajorUpgrade Las actualizaciones, actualizaciones y parches son una de las partes más complejas de la creación de MSI. Tengo la tendencia a usar sólo las actualizaciones principales (que desinstalan y vuelven a instalar el producto), por las siguientes razones: Requieren que se cambie el GUID de ID de producto para cada versión, lo que es fácil en Wix al establecerlo. Además, la publicación de actualizaciones más pequeñas significa que el Id de producto debe actualizarse en algunos casos, pero no en otros, lo que significa un flujo de trabajo más complejo. Permiten que los GUID generados automáticamente se utilicen con componentes, lo que no sólo hace que sea menos complicado construir archivos wxs, sino que también significa que la recolección HEAT se puede hacer como un paso de pre-compilación que se vuelve a ejecutar para cada compilación del Instalador Las actualizaciones principales permiten que todas las características / componentes para el instalador se reorganicen, facilitando la mejora del instalador a medida que avanza el desarrollo. Por supuesto, la desventaja es que usted necesita distribuir un archivo grande de MSI incluso para las actualizaciones simples. Wix 3.5 introdujo el elemento MajorUpgrade. Que es más fácil de usar que jugar con elementos independientes de Upgrade y Upgrade Version. He aquí cómo lo uso (tenga en cuenta que PRODUCT es una macro definida en las opciones del proyecto): Tenga cuidado: el atributo Id del elemento Product debe seguir configurado en También tenga en cuenta el atributo AllowSameVersionUprades. Los instaladores de MSI ignoran el cuarto dígito de la versión del producto. De forma predeterminada, los instaladores de MSI de los que sólo se diferencian los dígitos de la cuarta versión, se instalarán uno al lado del otro. Esto lleva a situaciones confusas con entradas duplicadas en programas de adición / eliminación, etc. Al establecer AllowSameVersionUprades como true, estas versiones se instalarán una sobre otra como de costumbre, con el efecto secundario que es posible degradar a versiones con un cuarto dígito inferior. Para los sistemas de control de versiones donde el cuarto dígito es, por ejemplo, un número de sucursal, esto podría ser realmente positivo. Tenga en cuenta que AllowSameVersionUpgradesyes genera una advertencia ICE61. Para deshabilitarlo, añádalo a las validaciones ICE ignoradas en las propiedades del proyecto Wix (en Configuración de herramientas). Es difícil hacer cualquier instalador no trivial sin ignorar por lo menos algunas advertencias de ICE sin embargo, especialmente cuando los módulos de fusión de terceros están involucrados. Deshabilitar proyectos Wix en compilaciones de depuración Los proyectos Wix pueden tomar bastante tiempo para construir, y arent siempre realmente necesario. Sugiero descargarlos, o su carpeta de solución (clic derecho-descargar proyectos en carpeta de solución) cuando no son necesarios. Pueden desactivarse completamente en el modo de depuración accediendo al diálogo de configuración de la solución y desactivándolos para Depurar / Todas las plataformas. Wix y Team Foundation Server Team Build Trabajando con TFS Team Build puede ser un dolor, y conseguir que jugar bien con Wix tomó algunos experimentos, pero no es tan difícil: Asegúrese de que los proyectos Wix se construirá para la configuración que desea utilizar. Por defecto y de manera molesta, los proyectos Wix solo se crean para la plataforma de plataformas mixtas, no para Win32. Asegúrese de que los servidores de compilación establezcan el uso de plataformas mixtas o habilite los proyectos Wix para Win32. Asegúrese de que Wix está instalado en su (s) sistema (s) de construcción. Originalmente quería evitar tener que hacer eso, y seguí los pasos descritos aquí. Revisando Wix en el árbol de origen. Esto vino con algunas desventajas importantes sin embargo: tener que corregir cada archivo de. wixproj, y los binarios de Wix / Team Build no jugar agradable cuando llegó el momento de limpiar:. Registrar Microsoft. Deployment. WindowsInstaller. dll con el GAC, de lo contrario Team Build no será capaz de encontrarlo, de alguna manera. Inicie un símbolo del sistema VS2010 como administrador: C: Archivos de programa (x86) Windows Installer XML v3.5bingacutil - i Microsoft. Deployment. WindowsInstaller. dll Utilidad de caché de ensamblado global de Microsoft (R).NET. Versión 4.0.30319.1 Copyright (c) Microsoft Corporation. Todos los derechos reservados. El ensamblado se agregó correctamente a la caché Una desventaja es que el directorio de archivos de salida del proyecto Wix se ignora y que los instaladores se verán eliminados entre todos los demás archivos binarios. Puede ser resuelto con un paso de post-construcción si youre tan inclinado. Escudo UAC en el botón Instalar De forma predeterminada, los instaladores Wix solicitan privilegios de administrador después de pulsar el botón Instalar en sistemas con UAC habilitado, pero no muestran el escudo UAC en el botón. Al establecer el atributo InstallScope del elemento Package en perMachine. El escudo puede hacerse aparecer: Desafortunadamente, parece que a través de ninguna combinación de InstallScope y / o InstallPrivilege los instaladores pueden hacer que los instaladores pidan solamente privilegios de administrador cuando éstos son realmente requeridos, dependiendo del directorio de instalación. Tal y como está ahora, los instaladores de perUser simplemente fallarán cuando estén instalados, por ejemplo, en el directorio Archivos de programa, mientras que los instaladores de perMachine siempre piden derechos de administrador. TARGETDIR y la partición del sistema Al intentar instalar en un subdirectorio de la raíz de la unidad del sistema (por ejemplo, C: aplicación), podría suponer que en algo como TARGETDIR se refiere a la partición del sistema, como ProgramFilesFolder siempre se da como un hijo de TARGETDIR . Este no es el caso TARGETDIR es la partición con el espacio en disco más libre. Incluso puede ser una partición en un disco duro externo. Para establecerlo en la partición del sistema real, utilice la siguiente aproximación: El elemento SetDirectory es necesario como intentar utilizar WindowsVolume directamente resultados en MSI de firma Si firma sus archivos MSI, obtendrá un mensaje de UAC profesional agradable que verifica que el paquete es el suyo . Una vez que tenga una clave de firma de código en formato. pfx, la firma de un MSI fácil de hacer como un proyecto Wix post-build paso. Asegúrese de pasar una descripción para el paquete, ya que de lo contrario el indicador UAC mostrará algún nombre de archivo temporal mutilado debido a cómo funciona msiexec. Por ejemplo: Depuración de acciones personalizadas Una manera fácil de depurar acciones personalizadas de dll es hacer que generen un cuadro de mensaje utilizando la llamada de Windows de MessageBox y, a continuación, adjuntar un depurador. Asegúrese de que la acción personalizada en cuestión se ha creado en modo de depuración si está utilizando referencias de proyecto para incluir la acción personalizada dll, una compilación de depuración del proyecto Wix incluirá una versión de depuración de la dll, también. Haga que genere un cuadro de mensaje cerca de donde desee depurar y adjunte el depurador de Visual Studio. Tenga en cuenta que al ejecutar una acción personalizada de 32 bits en una versión de 64 bits de Windows, una nueva instancia msiexec se habrá generado para ejecutar la CA, marque la casilla Mostrar procesos de todos los usuarios para encontrarla. Una vez que el depurador ha adjuntado, coloque un punto de interrupción en algún lugar, pulse F5 para reanudar, haga clic en Aceptar en el cuadro de mensaje y está en el negocio. Creado: ene 18 2012 Modificado: feb 12 2012CustomAction Elemento Descripción Especifica una acción personalizada que se agregará a la tabla MSI CustomAction. Varias combinaciones de los atributos para este elemento corresponden a diferentes tipos de acciones personalizadas. Para obtener más información acerca de las acciones personalizadas, consulte el tema Tipos de acciones personalizadas en MSDN. Referencias de Windows Installer CustomAction Table Parents Fragment. Módulo. Product Inner Text (xs: string) El nodo de texto sólo es válido si se especifica el atributo Script. En ese caso, el nodo de texto contiene el script para incrustar. Hijos Ninguno Atributos El identificador de la acción personalizada. Este atributo es una referencia a un elemento binario con el atributo de identificación correspondiente. Ese flujo binario contiene la acción personalizada para su uso durante la instalación. La acción personalizada no se instalará en un directorio de destino. Este atributo se utiliza normalmente con el atributo DllEntry para especificar la acción personalizada DLL que se va a utilizar para una acción personalizada de tipo 1 con el atributo ExeCommand para especificar una acción personalizada de tipo 17 que ejecuta un ejecutable incrustado o los atributos VBScriptCall o JScriptCall para especificar Una acción personalizada de tipo 5 o 6. Este atributo especifica una referencia a un elemento de Directorio con el atributo Id que coincide con una ruta de directorio. Este atributo se utiliza normalmente con el atributo ExeCommand para especificar el ejecutable de origen para una acción personalizada de tipo 34 o con el atributo Value para especificar una cadena formateada para colocarla en la entrada de tabla de directorio especificada en una acción personalizada de tipo 35. Este atributo especifica el nombre de una función en una acción personalizada que se va a ejecutar. Este atributo se utiliza con el atributo BinaryKey para crear una acción personalizada de tipo 1 o con el atributo FileKey para crear una acción personalizada de tipo 17. Este atributo especifica un índice en la tabla Error de MSI para usar como un mensaje de error para una acción personalizada de tipo 19 que muestra el mensaje de error y anula una instalación de productos. Este atributo especifica los parámetros de la línea de comandos que se deben suministrar a un ejecutable ejecutado externamente. Este atributo suele utilizarse con el atributo BinaryKey para una acción personalizada de tipo 2, el atributo FileKey para una acción personalizada de tipo 18, el atributo Property para una acción personalizada de tipo 50 o el atributo Directory para una acción personalizada de tipo 34 que especifica el ejecutable correr. Este atributo indica la programación de la acción personalizada. Este valor de atributos debe ser uno de los siguientes: commit Indica que la acción personalizada se ejecutará después de completar satisfactoriamente el script de instalación (al final de la instalación). Deferred Indica que la acción personalizada se ejecuta en secuencia de comandos (posiblemente con privilegios elevados). FirstSequence Indica que la acción personalizada sólo se ejecutará en la primera secuencia que lo ejecute. Inmediato Indica que la acción personalizada se ejecutará durante el tiempo de procesamiento normal con privilegios de usuario. Este es el valor predeterminado. OncePerProcess Indica que la acción personalizada sólo se ejecutará en la primera secuencia que lo ejecute en el mismo proceso. Rollback Indica que una acción personalizada se ejecutará en la secuencia de reversión cuando se produce un fallo durante la instalación, normalmente para deshacer los cambios realizados por una acción personalizada diferida. SecondSequence Indica que una acción personalizada debe ejecutarse una segunda vez si se ejecutó previamente en una secuencia anterior. Este atributo especifica una referencia a un elemento de archivo con el atributo id que ejecutará el código de acción personalizado en el archivo después de instalar el archivo. Este atributo se utiliza normalmente con el atributo ExeCommand para especificar una acción personalizada de tipo 18 que ejecuta un ejecutable instalado con el atributo DllEntry para especificar una DLL de acción personalizada instalada para utilizar para una acción personalizada de tipo 17 o con los atributos VBScriptCall o JScriptCall para Especifique una acción personalizada de tipo 21 o 22. Agregar una interfaz de usuario A continuación, agregamos la interfaz de usuario (UI) al proceso de instalación, es decir, un conjunto de cuadros de diálogo. WiX (y Windows Installer) le permite especificar casi cualquier combinación y secuencia de cuadros de diálogo que pueda imaginar, pero es más fácil si comienza con uno de los cuatro conjuntos predefinidos de cuadros de diálogo de interfaz de usuario de WiX: WixUIMondo, WixUIFeatureTree, WixUIInstallDir , O WixUIMinimal. Vea aquí para más información: tramontana. co. hu/wix/lesson2.php2.3 Para el ejemplo de Admin de Asistencia use WixUIInstallDir como nuestro punto de partida. Agregue estas líneas al archivo WXS, cerca del final del archivo, entre el elemento ltIcongt y la etiqueta lt / Productgt: lt - Incluya una interfaz de usuario - que se modifique posteriormente --gt ltProperty IdquotWIXUIINSTALLDIRquotgtINSTALLDIRlt / Propertygt ltUIRef IdquotWixUIInstallDirquot / gt ltUIRef IdquotWixUIErrorProgressTextquot / gt Para que esto funcione debemos agregar la biblioteca de diálogo WiX al proyecto. En el Navegador de proyectos de SharpDevelop, seleccione quotWiX Librariesquot, haga clic con el botón derecho del ratón y seleccione Add Wix Library. A continuación, agregue WixUI. wixlib al proyecto. Esto es típicamente en quotC: Program FilesSharpDevelop2.1binToolsWixquot. Idiomas y localización Una de las grandes cosas sobre WiX es que hace que sea fácil de quotlocalizequot todo. Todos los cuadros de diálogo predeterminados proporcionados con WiX están localizados, es decir, todos los textos se especifican mediante variables de localización (loc. xxxxxxx). Los textos localizados se definen en bibliotecas de quotlocalización, que son simplemente archivos de texto XML que contienen un gran número de elementos ltString Id gt. Algunos de estos archivos (alemán, inglés de EE. UU., español, húngaro y holandés) se distribuyen como parte de WiX 2.0, y muchos otros están disponibles para descargar desde esta página web: tramontana. co. hu/wix/loc/index. php To Continúe con este tutorial, deberá especificar el idioma que usará para fines de prueba. (A continuación, agrega la biblioteca de quotlocalización de WiX seleccionada a su proyecto SharpDevelop de la siguiente manera: Seleccione Proyecto - Opciones de proyecto - Aplicación y en el archivo quotLocalized String filequot, haga clic en el botón de búsqueda y busque y seleccione el archivo WixUIen-us. wxl, normalmente en la misma carpeta que el archivo de biblioteca. (WixUIen-us. wxl es el archivo de localización para los textos en inglés y los EEUU). En este punto, debería ser posible probar el paquete de intallation de nuevo. Ahora incluye cuadros de diálogo que le dan la bienvenida, requieren que acepte un acuerdo de licencia y le permita cambiar la ruta de la carpeta de intallation. Heres una instantánea de lo que la interfaz de usuario se ve en este momento: Admin UI snapshot 2.1.htm Entender la interfaz de usuario Queremos hacer algunos cambios en la interfaz de usuario, pero primero tenemos que entender cómo se implementa la interfaz de usuario WiX. Para poder realizar cambios necesitamos primero descargar el código fuente de WiX 2.0.4820. Esto se puede encontrar aquí: sourceforge. net/project/showfiles. phpgroupid105970 (Nuevas versiones de WiX 2.0 están disponibles, pero no sé si se supone que son tan estables como la versión 2.0.4820.) Colocamos estos archivos en D : WiXwix-2.0.4820.0-fuentes. Los archivos que definen la interfaz de usuario están en D: WiXwix-2.0.4820.0-sourcessrcuiwixui. La interfaz de usuario consta de los cinco componentes siguientes: 1. Los cuadros de diálogo ellos mismos. Estos se definen en archivos como WelcomeDlg. wxs, LicenseAgreementDlg. wxs, etc. Hay 26 de estos archivos. (Algunos de estos archivos, como Common. wxs y ErrorProgressText. wxs, no son realmente cuadros de diálogo, pero para el propósito de este tutorial, simplemente se refieren a los archivos de cuadros de diálogo.) 2. Los cuatro archivos que determinan el número Y secuencia de cuadros de diálogo que el usuario verá. Éstos se definen en carpetas individuales un nivel abajo de los otros archivos por alguna razón, y se llaman WixUIFeatureTree. wxs, WixUIInstallDir. wxs, WixUIMinimal. wxs, y WixUIMondo. wxs. 3. Los textos localizados que se colocan en los cuadros de diálogo. Estos se definen en archivos como WixUIen-us. wxl, WixUIde-de. wxl, etc. 4. Los seis mapas de bits para los gráficos que se utilizan en los cuadros de diálogo. Estos se definen como archivos BMP en la carpeta Bitmaps. 5. El texto de la licencia, que se define en el archivo License. rtf. Todos los archivos WXS (26 4 30 de ellos) de los puntos 1 y 2. están enlazados entre sí en el archivo WixUI. wixlib que se usó en el paso anterior. El elemento quotltUIRef IdquotWixUIInstallDirquot / gtquot que hemos agregado a nuestro archivo WXS en el paso anterior de alguna manera resulta en la selección de la correcta de los cuatro archivos de secuenciación. Esto a su vez selecciona el conjunto de cuadros de diálogo que queremos que se muestren cuando se ejecuta la instalación, aunque las definiciones para todos los 20 o más de los cuadros de diálogo predefinidos están realmente presentes en el archivo MSI. Preparación para insertar cuadros de diálogo adicionales Queremos agregar dos cuadros de diálogo adicionales a la interfaz de usuario. Esto requiere que modifiquemos el código fuente para un par de los archivos existentes del cuadro de diálogo, así que retrasaremos ese salto de la fe hasta el paso siguiente. (Y aún así agregar los nuevos cuadros de diálogo uno a la vez. Lentamente, pero seguramente.) Nuestro objetivo en este paso es bastante limitado. Vamos a crear un nuevo proyecto SharpDevelop que construye la interfaz de usuario WiX existente desde el origen. Cambiamos de usar el WixUI. wixlib que está en la distribución binaria de WiX y en su lugar usamos la biblioteca correspondiente que creamos nosotros mismos a partir de los archivos de origen. (QuotUse la fuente, Luke. quot) En este momento no estamos tratando de hacer cambios en los cuadros de diálogo, por lo que el resultado de este paso será un MSI que muestra exactamente el mismo comportamiento y funcionalidad que teníamos cuando añadimos por primera vez La interfaz de usuario hace dos pasos. Primero inicie una nueva copia de SharpDevelop y cree una nueva solución y proyecto SharpDevelop, y una carpeta para contenerlos. Seleccione Archivo - Nuevo - Solución - Configuración y seleccione quotEmpty Setupquot como la plantilla. Ubicación quotD: DeveloperAssistanceTrunkWiX projectsquot, Nombre quotCustom Dialogsquot y compruebe que la opción quotAir crear proyecto subdirquot esté activada. Abra el proyecto en el navegador del proyecto y elimine el archivo Setup. wxs. Compruebe que la carpeta TestDialogs recién creada contiene sólo un archivo SLN y WIXPROJ. Ahora conseguimos algunos de los archivos de código fuente WiX para la interfaz de usuario. Copia los 26 archivos WXS en D: WiXwix-2.0.4820.0-sourcessrcuiwixui a la nueva carpeta quotD: DeveloperAssistanceTrunkWiX projectsCustom Dialogsquot. (No copie los cinco archivos de idioma o el archivo License. rtf todavía.) Agregue un archivo más, el único archivo que controla la secuenciación de los cuadros de diálogo. Para nuestro ejemplo, este es WixUIInstallDir. wxs de la carpeta installdir. Copie este archivo en la carpeta QuotD: DeveloperAssistanceTrunkWiX projectsCustom dialogsquot. (Prefiero no colocar este archivo en una carpeta por sí mismo.) Si está utilizando uno de los otros tres archivos correspondientes en su caso, a continuación, copiar en su lugar. Ahora debería haber un total de 29 archivos en quotD: DeveloperAssistanceTrunkWiX projectsCustom dialogsquot. En el Navegador de proyectos de SharpDevelop, haga clic con el botón derecho en el nombre del proyecto y seleccione Agregar - Elemento existente y, a continuación, agregue los 27 archivos WXS (26 archivos de cuadro de diálogo WixUIInstallDir. wxs) que se encuentran en la carpeta quotD: DeveloperAssistanceTrunkWiX projectsCustom dialogsquot. Seleccione Proyecto - Opciones de proyecto - Aplicación y establezca el tipo de salida en WiX Library. Al igual que con el otro proyecto, asumimos que no hay diferencia entre hacer quotdebug buildsquot y quotrelease buildsquot para proyectos WiX, y queremos reducir el desorden de carpetas, por lo que eliminamos el nivel de carpeta extra Debug, tanto para obj como bin. Para ello, seleccione Proyecto - Opciones de proyecto - Compilación. Cambie la ruta de salida de quotbinDebugquot a quotbinquot. Establezca el quotIntermediate Output Pathquot en quotobjquot en lugar de estar en blanco. Ahora cree nuestro archivo de Custom Dialogs. wixlibquot seleccionando Build - Build Solution. El CustomDialogs. wixlib resultante (que se puede encontrar en bin) es 208 KB, ligeramente más pequeño que el archivo wixui. wixlib original (216 KB) porque omitimos los tres archivos WXS alternativos que definen conjuntos y secuencias alternativos de cuadros de diálogo. Ahora estaban casi listos para probar para ver si la versión de la interfaz de usuario WiX que hemos construido funciona, así como la versión que viene con la descarga binaria WiX. Pero primero tenemos que copiar algunos archivos adicionales a nuestra ubicación privada donde se encuentra el archivo quotCustom Dialogs. wixlibquot. Copie el archivo License. rtf y los archivos de localización de seis idiomas de D: WiXwix-2.0.4820.0-sourcessrcuiwixui a quotD: DeveloperAssistanceTrunkWiX projectsCustom dialogsbinquot. También necesitamos los seis archivos BMP localmente, así que copia la carpeta D: WiXwix-2.0.4820.0-sourcessrcuiwixuiBitmaps y su contenido a quotD: DeveloperAssistanceTrunkWiX projectsCustom dialogsbinquot. Por último, theres un archivo llamado wixca. dll (algo sobre quotcustom actionsquot) que necesita ser copiado a la quotD: DeveloperAssistanceTrunkWiX projectsCustom dialogsbinquot carpeta. Este archivo se puede encontrar en la descarga binaria WiX o en la copia SharpDevelop de los archivos binarios WiX, por ejemplo aquí: quotC: Program FilesSharpDevelop2.1binToolsWixquot. Ahora estaban listos para probar. Cambie a la copia de SharpDevelop con la solución / proyecto de administración de asistencia que estábamos trabajando hasta hace un par de pasos. En la ventana Navegador de proyectos, elimine la biblioteca wixui. A continuación, haga clic con el botón derecho en quotWiX Librariesquot y agregue la biblioteca quotCustom Dialogs. wixlibquot que acabamos de crear. También, porque bien estaremos cambiando los textos de localización un poco más tarde, cambiamos a nuestra propia copia privada del archivo WixUIen-us. wxl seleccionando Project - Project Options - Application y en el campo quotLocalized string filequot haz clic en el botón browse y cambia A nuestra propia copia de WixUIen-us. wxl. Ahora haga una compilación y pruebe el resultado, por ejemplo golpeando F5. Este paquete de instalación debería funcionar de forma idéntica a la que teníamos hace dos pasos. Inserción de un cuadro de diálogo adicional (que no funciona) Aquí es donde las cosas comienzan a ponerse MUY desordenado. - (Queremos insertar un cuadro de diálogo adicional que permita al usuario especificar dos cosas: - si se trata de una quotper-userquot o una quotall-usersquot instalar - que de los tres atajos que definimos en la parte 1 se van a crear (extrañamente Basta con que ninguno de los 20 cuadros de diálogo quotstandardquot proporcionados con WiX ofrezca esta funcionalidad. Tal vez porque esta funcionalidad no se implementa exclusivamente en la interfaz de usuario, sino también parcialmente en el proyecto principal.) Para empezar bien, simplemente inserte un cuadro de diálogo adicional en el UI, y no importa que no haga nada. Además, agregue la funcionalidad en los próximos dos pasos. Cambie a la copia de SharpDevelop que contiene nuestro proyecto de Diálogos Personalizados. Primero tenemos que crear un nuevo archivo WXS para el nuevo cuadro de diálogo. Alrededor de un cuadro de diálogo existente que por lo menos ligeramente se asemeja a lo que queremos, por lo que no tendrá que empezar desde cero. En este caso, la mejor opción por lo que puedo ver es utilizar el cuadro de diálogo InstallDirDlg. wxs, y eliminar casi todos Del contenido. (La ventaja de usar este cuadro de diálogo es que al menos tiene los botones Atrás, Siguiente y Cancelar en la parte inferior.) Así que hacemos una copia del archivo de diálogo InstallDirDlg. wxs y lo llamamos AssistanceOptionsDlg. wxs, y lo añadimos al Proyecto SharpDevelop. Abra AssistanceOptionsDlg. wxs para editarlo y realice los cambios necesarios para convertirlo en un cuadro de diálogo casi vacío que puede coexistir con los demás cuadros de diálogo. 1. Quite los tres controles FolderLabel, PathEdit y Examinar, incluidos los elementos Publicar dentro del control Examinar. 2. Retire las dos líneas siguientes que no son relevantes para este nuevo cuadro de diálogo: ltPropertyRef IdquotWIXUIINSTALLDIRquot / gt ltPublish EventquotSetTargetPathquot ValuequotWIXUIINSTALLDIRquotgt1lt / Publishgt (pero deje el otro elemento de publicar en el botón Siguiente sola.) 3. Vuelva a colocar todas las apariciones de quotInstallDirDlgquot con quotAssistanceOptionsDlgquot. Observamos las políticas de localización estrictas para todo lo que hacemos, por eso hay que añadir algunas líneas al archivo WixUIen-us. wxl: ltString IdquotAssistanceOptionsDlgTitlequotgtProductName Setuplt / Stringgt ltString IdquotAssistanceOptionsDlgTitlequotgt Settingslt Instalación / Stringgt ltString IdquotAssistanceOptionsDlgDescriptionquotgtSelect usuario actual o todos los usuarios instalar, y la selección de Shortcuts. lt/Stringgt ltString IdquotAssistanceOptionsDlgBannerBitmapquotgtWixUIBmpBannerlt / Stringgt Estas líneas también se deben añadir (traducir) a los otros archivos de idioma si es necesario, por lo que el cuadro de diálogo se localizará correctamente. Para modificar la secuencia de los cuadros de diálogo debemos reemplazar el archivo WixUIInstallDir. wxs con un archivo diferente que controla la nueva secuencia de cuadros de diálogo. Haga una copia de este archivo y cambie el nombre de la copia a WixUIAssistanceAdmin. wxs. Este archivo debe agregarse al proyecto SharpDevelop y el archivo WixUIInstallDir. wxs se puede quitar del proyecto. Realizar los siguientes cambios a WixUIAssistanceAdmin. wxs: 1. Añadir AssistanceOptionsDlg a los comentarios en el inicio por lo que dicen esto: secuencia de diálogo Mantenimiento:: lt-- por primera vez de diálogo secuencia de instalar - WixUIWelcomeDlg - WixUIMaintenanceWelcomeDlg - WixUILicenseAgreementDlg - WixUIMaintenanceTypeDlg - WixUIInstallDirDlg - WixUIInstallDirDlg - WixUIAssistanceOptionsDlg - WixUIVerifyReadyDlg - WixUIVerifyReadyDlg - WixUIDiskCostDlg --gt 2. Modificar un par de líneas para mostrar que se trata de una secuencia diferente: ltProperty IdquotWixUIModequot ValuequotAssistanceAdminquot / gt 3. Añadir AssistanceOptionsDlg a los elementos ltDialogRefgt, es decir: ltDialogRef IdquotAssistanceOptionsDlgquot / GT 4. Agregar dos nuevas líneas para el cuadro de diálogo AssistanceOptionsDlg para especificar la espalda y el botón siguiente navegación, y modificar el valor siguiente para el cuadro de diálogo anterior y el valor de nuevo para el siguiente cuadro de diálogo: ltProperty IdquotWixUIInstallDirDlgBackquot ValuequotLicenseAgreementDlgquot / gt ltProperty IdquotWixUIInstallDirDlgNextquot ValuequotAssistanceOptionsDlgquot / gt ltProperty IdquotWixUIInstallDirDlgBrowsequot ValuequotBrowseDlgquot / gt ltProperty IdquotWixUIAssistanceOptionsDlgBackquot ValuequotInstallDirDlgquot / gt ltProperty IdquotWixUIAssistanceOptionsDlgNextquot ValuequotVerifyReadyDlgquot / gt ltProperty IdquotWixUIVerifyReadyDlgBackRepairquot ValuequotMaintenanceTypeDlgquot / gt ltProperty IdquotWixUIVerifyReadyDlgBackRemovequot ValuequotMaintenanceTypeDlgquot / gt ltProperty IdquotWixUIVerifyReadyDlgBackAssistanceAdminquot ValuequotAssistanceOptionsDlgquot / gt Como quizá se ha dado cuenta, el botón Atrás en el cuadro de diálogo VerifyReadyDlg quotpublishesquot diferentes acciones dependiendo de la secuencia de diálogo Cajas está siendo utilizado. Así que tenemos que editar el archivo VerifyReadyDlg. wxs, y en el control para el botón Atrás añadimos la siguiente línea: ltPublish EventquotNewDialogquot ValuequotWixUIVerifyReadyDlgBackAssistanceAdminquotgtNOT se instala y WixUIMode quotAssistanceAdminquotlt / Publishgt Ahora podemos volver a construir nuestra biblioteca de interfaz de usuario cuadros de diálogo personalizados. Por último, cambie al proyecto SharpDevelop para la configuración quotAssistance Adminquot y cambiar el archivo quotAssistance Admin. wxsquot para especificar la nueva secuencia de cuadros de diálogo: ltUIRef IdquotWixUIAssistanceAdminquot / gt Ahora cuando vuelva a compilar y probar los MSI debería ver un nuevo cuadro de diálogo entre El que solicita un directorio de instalación alternativo y el cuadro de diálogo final. No se preocupe por el hecho de que el nuevo cuadro de diálogo está más o menos vacío. Lo importante es que hemos logrado crear un nuevo cuadro de diálogo y hacerlo parte de la secuencia del proceso de instalación de los cuadros de diálogo. FELICITACIONES Este fue un paso difícil. A partir de aquí se hace más fácil. Heres una instantánea de lo que la interfaz de usuario parece en este momento: Admin UI snapshot 2.2.htm Selección de usuario actual o todos los usuarios de instalación Windows Installer tiene la funcionalidad básica de hacer un quotper userquot o máquina quotper (todos los usuarios) quot instalar. El valor predeterminado, si no se especifica nada, es instalarlo para un solo usuario. Tenga en cuenta, sin embargo, que una instalación quotall-usersquot requiere que la persona que realiza la instalación tenga privilegios de administrador y que pueda ser especialmente problemática con Windows Vista y no debe utilizarse para un cliente Citrix. Hay muchas posibilidades para que una instalación de usuarios de software quede mal. (Pero por otro lado, una instalación de todos los usuarios es definitivamente recomendable para los programas basados ​​en servidor. Volveremos a esto más adelante.) Queremos que la instalación quotall-usersquot esté disponible para aquellos que la quieran. En este paso, agregue un par de botones de radio a nuestro nuevo cuadro de diálogo para que los usuarios puedan elegir entre un solo usuario o todos los usuarios. Windows Installer utiliza una propiedad denominada ALLUSERS para controlar esta funcionalidad. Si ALLUSERS no está definido o es nulo, se realiza una instalación de usuario único. ALLUSERS1 significa, bien, quotall usersquot, o una instalación por máquina. Si el usuario no tiene derechos de administrador, la instalación fallará. ALLUSERS2 le dice a Windows Installer para ver si es posible instalarlo para todos los usuarios, hacerlo si es así, y si no instalar para un usuario. ESTO NO ES RECOMENDADO. Es especialmente problemático con Windows Vista, y también puede causar problemas para desinstalaciones y actualizaciones posteriores. Tenga en cuenta que ALLUSERS0 no existe, por alguna extraña razón. Otra cosa extraña a tener en cuenta es que no hay manera en WiX para definir una propiedad con un valor nulo con el elemento ltPropertygt. Pero esto no importa, porque es posible definir ALLUSERS y establecerlo en un valor nulo con un elemento ltPublishgt. La sintaxis es un poco especial (Valuequotquot) pero no importa, funciona. Heres how to add the necessary functionality to our new dialog box: First, just add this line to the quotAssistance Admin. wxsquot file in the SharpDevelop project that creates the MSI for Assistance Admin: ltProperty IdquotASSISTANCEUSERSquotgtcurlt/Propertygt lt-- cur or all --gt This quotpropertyquot (whose name must be all-uppercase because it is being manipulated in the UI) is NOT the ALLUSERS property. It is our behind-the-scenes token that we use in conjunction with the radio buttons. In the SharpDevelop project for the user interface, open the the MsiRMFilesInUse. wxs file. Here you can see how radio button controls are defined in WiX. Copy the six lines that define the two radio buttons and the quotradio button groupquot to the AssistanceOptionsDlg. wxs file. Alternatively, you can experiment with the quotdesign viewquot of SharpDevelop - just click on Design on the tab below the editing window. We also need a couple of text controls above the radio buttons to indicate what they are for. Heres what the definition of the controls should look like when they are properly in place: ltControl IdquotUserText1quot TypequotTextquot Xquot20quot Yquot60quot Widthquot330quot Heightquot35quot Textquot(loc. AssistanceOptionsDlgUserText1)quot /gt ltControl IdquotUserText2quot TypequotTextquot Xquot20quot Yquot95quot Widthquot330quot Heightquot20quot Textquot(loc. AssistanceOptionsDlgUserText2)quot /gt ltControl IdquotUserSelectionquot TypequotRadioButtonGroupquot Xquot26quot Yquot115quot Widthquot305quot Heightquot45quot PropertyquotASSISTANCEUSERSquot TextquotASSISTANCEUSERSquotgt ltRadioButtonGroup PropertyquotASSISTANCEUSERSquotgt ltRadioButton Valuequotcurquot Xquot0quot Yquot0quot Widthquot295quot Heightquot16quot Textquot(loc. AssistanceOptionsDlgRBOneUser)quot /gt ltRadioButton Valuequotallquot Xquot0quot Yquot20quot Widthquot295quot Heightquot16quot Textquot(loc. AssistanceOptionsDlgRBAllUsers)quot /gt lt/RadioButtonGroupgt lt/Controlgt Add the following two lines as child elements to the Control element for the Next button: ltPublish PropertyquotALLUSERSquot ValuequotquotgtASSISTANCEUSERS quotcurquotlt/Publishgt lt-- set null value --gt ltPublish PropertyquotALLUSERSquot Valuequot1quotgtASSISTANCEUSERS quotallquotlt/Publishgt These two lines make the necessary translation from our behind-the-scenes property to the ALLUSRS property used by Windows Installer. In WixUIen-us. wxl add these lines: ltString IdquotAssistanceOptionsDlgUserText1quotgtIt may be possible to install this program with shortcuts and registry settings such that the installation will work for all users. This requires that you must have administrator rights. (For Citrix systems use single-user install only.)lt/Stringgt ltString IdquotAssistanceOptionsDlgUserText2quotgtInstall this program for:lt/Stringgt ltString IdquotAssistanceOptionsDlgRBOneUserquotgtCurrent user only. (LogonUser)lt/Stringgt ltString IdquotAssistanceOptionsDlgRBAllUsersquotgtAnyone who uses this computer. lt/Stringgt These lines should also be added (translated) to the other localization files if/when necessary, so the dialog box will be translated. Now we can re-build the user interface, and then re-build the Assistance Admin WiX project and test out the new functionality. It should now be possible to select current-user or all-users installing. Selecting which shortcuts are wanted Now we complete the new dialog box by adding three checkbox controls allowing the user to select which of the three possible shortcuts he/she wants. Here are the controls that we add to the AssistanceOptionsDlg. wxs dialog box: ltControl IdquotSplitLinequot TypequotLinequot Xquot0quot Yquot160quot Widthquot370quot Heightquot0quot /gt ltControl IdquotShortcutDesktopquot TypequotCheckBoxquot Heightquot18quot Widthquot295quot Xquot40quot Yquot170quot Textquot(loc. AssistanceOptionsDlgShortcutDesktop)quot PropertyquotASSISTANCESHORTCUTDESKTOPquot CheckBoxValuequot1quot /gt ltControl IdquotShortcutProgramMenuquot TypequotCheckBoxquot Heightquot18quot Widthquot295quot Xquot40quot Yquot190quot Textquot(loc. AssistanceOptionsDlgShortcutProgramMenu)quot PropertyquotASSISTANCESHORTCUTPROGRAMMENUquot CheckBoxValuequot1quot /gt ltControl IdquotShortcutStartupquot TypequotCheckBoxquot Heightquot18quot Widthquot295quot Xquot40quot Yquot210quot Textquot(loc. AssistanceOptionsDlgShortcutStartup)quot PropertyquotASSISTANCESHORTCUTSTARTUPquot CheckBoxValuequot1quot /gt As usual, all text is localized, so here are the lines to be added to WixUIen-us. wxl (and, translated, to any other relevant localization files): ltString IdquotAssistanceOptionsDlgShortcutDesktopquotgtCreate a shortcut on the desktop. lt/Stringgt ltString IdquotAssistanceOptionsDlgShortcutProgramMenuquotgtCreate a shortcut at Start - Programs - Merlinia. lt/Stringgt ltString IdquotAssistanceOptionsDlgShortcutStartupquotgtCreate a shortcut at Start - Programs - Startup. (Provides automatic start).lt/Stringgt Now, in the other SharpDevelop project, make the following additions to the quotAssistance Admin. wxsquot file: ltProperty IdquotASSISTANCESHORTCUTDESKTOPquotgt1lt/Propertygt ltProperty IdquotASSISTANCESHORTCUTPROGRAMMENUquotgt1lt/Propertygt Note that ASSISTANCESHORTCUTSTARTUP is simply not declared. This is the only way to indicate that this option is not wanted by default - attempting to declare it to be zero or null doesnt work. And finally, change the three ltConditiongt elements that control the Components that contain the ltShortcutgt elements. Once again we re-build the user interface, and then re-build the Assistance Admin WiX project and test out the new functionality. Heres a snaphot of what the UI looks like at this point: Admin UI snapshot 2.3.htm This ends part 2 of this tutorial. We now have a working UI. Whats more important, its OUR working UI - we can do whatever we want with it. In the next part well change the graphics and the license agreement, and add yet another dialog box, one that can set various program-specific parameters via registry entries. Rennie Petersen, March-May 2007


No comments:

Post a Comment