2009-10-19 16 views
18

Deseo crear un archivo DLL CustomAction C# que dependa de una DLL de .NET de 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 intento descubrir cómo agregar de manera segura una dependencia a la acción personalizada. Nota: Realmente no necesito este archivo de archivo DLL de terceros para que se ejecute la aplicación instalada.Cómo ejecutar un archivo DLL de acción personalizada WiX con dependencias

<Binary Id="MyCustomAction.dll" SourceFile="MyCustomAction.CA.dll" /> 

    <CustomAction Id="FixupConfigForMysql" Return="check" /> 

    <InstallExecuteSequence> 
    <Custom Action='FixupConfigForMysql' After='InstallFiles'>NOT Installed</Custom> 
    </InstallExecuteSequence> 

¿Es necesario instalar el archivo DLL de terceros (MySql.Data.dll) con el fin de conseguir la acción personalizada para ejecutar?

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

Respuesta

19

DTF en el conjunto de herramientas de WiX tiene un mecanismo para incluir su conjunto de acción personalizado y todas sus referencias en un único archivo binario (dll autoextraíble, básicamente). No escribo acciones personalizadas administradas (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.

+8

Parece que solo funciona, posiblemente debido a que el proceso de compilación de acción personalizada se encarga de agregar estas dependencias. Si lo entiendo correctamente, se convierten en parte del archivo .CA.dll generado por la compilación de acción personalizada. http://blogs.msdn.com/jasongin/archive/2008/05/23/custom-action-project-templates.aspx –

+4

@AdamTegen Gracias por publicar ese artículo, me salvó otra semana de golpear mi cabeza contra ¡la pared! La línea importante era "El proceso de compilación de acción personalizada empaqueta automáticamente los ensamblajes no GAC de los que depende su CA" Tenía todos mis ensamblajes dependientes en el GAC en mi caja de desarrollo y no pude entender por qué no lo hicieron. Parece estar presente en la caja de prueba. ¡Gracias! –

+2

Como nota para los demás, asegúrese de que su elemento 'Binario' apunta al archivo' .CA.dll' que genera WiX, y no el archivo DLL .NET original – Cocowalla

4

Puede usar <Binary /> para agregar los archivos que sean 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 como parte de la aplicación que se está instalando.

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

A menos que usted puede tener múltiples atributos BinaryKey (no he probado esto y no se ve directamente ningún apoyo para esto en el MSI custom action table) que sólo puede tener una acción personalizada en función de uno binario. Ese binario, por lo tanto, tendrá que llevar todas las dependencias necesarias dentro de sí mismo.

Dicho esto, si sus dlls son todos ensamblajes .Net, una idea sería usar ILMerge para empaquetarlos en un solo ensamblaje.

+1

Eso no funcionará. Ninguno de los flujos binarios adicionales se extraen. –

3

Establezca la propiedad 'Copiar local' en la referencia de True en Visual Studio.

1

Siguiendo el comentario del Sr. Mensching, voy a completar un poco más de detalle.

Suponiendo que tiene al menos Wix 3.0, puede usar MakeSfxCA.exe para empaquetar dependencias en una única DLL. (Este fue un complemento de DFT - Deployment Tools Foundation). Básicamente, comience asegurándose de que el proyecto copie sus archivos DLL dependientes. Cree un archivo CustomAction.config. Prueba con un archivo .bat simple 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 

Si funciona, se convierten en un evento posterior a la generació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 el archivo .wxs, la clave binaria se verá como:

<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.

Cuestiones relacionadas