c# wix custom-action

c# - Cómo ejecutar un archivo DLL de acción personalizada WiX con dependencias



custom-action (4)

DTF en el conjunto de herramientas de WiX tiene un mecanismo para incluir su conjunto de acciones personalizadas y todas sus referencias en un solo binario (dll de extracción automática, básicamente). No escribo acciones personalizadas gestionadas (C / C ++ crea acciones personalizadas con menos dependencias y aumenta la tasa de éxito) pero se supone que solo funciona cuando se construye en VS.

Quiero crear un archivo CustomAction C # DLL que dependa de una DLL .NET terceros (en este caso específico, es MySql.Data.dll ). Tengo el archivo DLL de acción personalizada de C # que funciona con el fragmento de WiX a continuación. Solo estoy tratando de averiguar cómo agregar de manera segura una dependencia a la acción personalizada. Nota: en realidad no necesito este archivo DLL de terceros para que se ejecute la aplicación instalada.

<Binary Id="MyCustomAction.dll" SourceFile="MyCustomAction.CA.dll" /> <CustomAction Id="FixupConfigForMysql" Return="check" /> <InstallExecuteSequence> <Custom Action=''FixupConfigForMysql'' After=''InstallFiles''>NOT Installed</Custom> </InstallExecuteSequence>

¿Debo instalar el archivo DLL de terceros ( MySql.Data.dll ) para poder ejecutar la acción personalizada?

¿Puedo agregar otra etiqueta binaria con el archivo DLL de terceros?


Establezca la propiedad ''Copiar local'' en la referencia física a Verdadero en Visual Studio.


Puede usar <Binary /> para agregar los archivos necesarios para ejecutar acciones personalizadas. Eso debería ir para cualquier dlls de terceros que requiera también. Los archivos incluidos con el elemento binario solo se utilizan durante la instalación y no se considerarán parte de la aplicación que se está instalando.

Actualización: la conexión entre una CustomAction y un Binary se realiza haciendo referencia al binario de la acción personalizada utilizando el atributo BinaryKey.

A menos que pueda tener múltiples atributos BinaryKey (no lo he intentado y no veo directamente ningún soporte para esto en la tabla de acciones personalizadas de MSI ), solo puede tener una acción personalizada en función de un binario. Ese binario tendrá que llevar todas las dependencias necesarias dentro de sí mismo.

Dicho esto, si sus archivos DLL son todos los ensamblados .Net, una idea sería utilizar ILMerge para empaquetarlos en un solo ensamblaje.


Siguiendo el comentario del Sr. Mensching, completaré un poco más de detalles.

Suponiendo que está en al menos Wix 3.0, puede usar MakeSfxCA.exe para empaquetar dependencias en una sola DLL. (Este fue un complemento de DFT - Deployment Tools Foundation.) Básicamente, comience por asegurarse de que el proyecto esté copiando sus DLL dependientes. Hacer un archivo CustomAction.config. Prueba con un simple archivo .bat como:

REM MyMakeSfxCA.bat - Run under $(TargetDir); abs. paths reqd. "%WIX%/SDK/MakeSfxCA" ^ %cd%/Managed_custom_action_pkg.dll ^ "%WIX%/SDK/x86/sfxca.dll" ^ %cd%/Managed_custom_action.dll ^ %cd%/Dependent1.dll ^ %cd%/Dependent2.dll ^ %cd%/Microsoft.Web.Administration.dll ^ %cd%/Microsoft.Deployment.WindowsInstaller.dll ^ %cd%/CustomAction.config

Una vez que eso funcione, conviértalo en un evento posterior a la construcción:

"$(WIX)/SDK/MakeSfxCA" ^ $(TargetDir)/Managed_custom_action_pkg.dll ^ "$(WIX)/SDK/x86/sfxca.dll" ^ $(TargetDir)/Managed_custom_action.dll ^ $(TargetDir)/Dependent1.dll ^ $(TargetDir)/Dependent2.dll ^ $(TargetDir)/Microsoft.Web.Administration.dll ^ $(TargetDir)/Microsoft.Deployment.WindowsInstaller.dll ^ $(TargetDir)/CustomAction.config

En su archivo .wxs, su clave binaria se verá así:

<Binary Id="Managed_custom_action_CA_dll" SourceFile="$(var.Managed_custom_action.TargetDir)$(var.Managed_custom_action.TargetName)_pkg.dll" />

Para ellos, CustomAction.config, puedes encontrar ejemplos en línea.

Esta es la mejor manera que he encontrado.