2010-08-24 16 views
16

Estoy usando WiX 3.5.1930 en Visual Studio 2010, apuntando a .NET Framework 3.5. (Las compilaciones semanales posteriores de WiX parecen estar muy rotas con respecto a su plantilla de acción personalizada, al menos por ahora. 1930 es la versión más reciente que parece hacer una CA C# compilable con referencias de trabajo.)La acción personalizada en C# utilizada a través de WiX falla con el error 1154

Tengo dos ensambles de acción personalizados escritos en C#. Uno de ellos funciona bien. La otra falla con el siguiente error:

CustomActionnNameHere returned actual error code 1154 (note this may not be 100% accurate if translation happened inside sandbox) 

He comparado los archivos Csproj y .wixproj archivos, y lo mejor que puedo decir las diferencias son apropiado (g lista de archivos incluidos Cs..). He cambiado los .wxs que no funcionan para llamar a la acción personalizada que funciona en lugar de la acción personalizada que no funciona y funciona como epxected.

¿Qué más puedo ver para que funcione?

Editar: Para completar, 1154 se refiere a una DLL no válida - net helpmsg lo traduce (en inglés) a "Uno de los archivos de la biblioteca necesarios para ejecutar esta aplicación está dañado".

Segunda edición: PEverify corrieron en contra de la DLL (agarró una copia de \ windows \ instalador mientras el instalador se ejecuta) y dice que todo está bien en la DLL. La DLL solo tiene el método de acción personalizado con un "éxito de devolución", por lo que no hay mucho que verifique, pero sí confirma que la DLL no está corrupta.

Tercera edición: El código de la acción personalizada rota sigue:

using Microsoft.Deployment.WindowsInstaller; 

namespace Framework.Installer.Database { 
    public class CustomActions { 

     [CustomAction] 
     public static ActionResult RunMigration(Session session) { 

      return ActionResult.Success; 
     } 

    } 
} 

No hay mucho a ella. Las partes pertinentes de los .wxs son los siguientes:

<InstallExecuteSequence> 
    <Custom Action="DotNetMigratorCustomActionPreviousUp" After="SetMigrationPropertiesPreviousUp"><![CDATA[(&Database = 3)]]></Custom> 
</InstallExecuteSequence> 

<Binary Id="DotNetMigratorCustomActionDll" 
     SourceFile="$(var.Framework.Installer.Database.CustomActions.TargetDir)\SoftwareAnswers.Framework.Installer.Database.CustomActions.dll" /> 

<CustomAction Id="DotNetMigratorCustomActionPreviousUp" 
       Return="check" 
       BinaryKey="DotNetMigratorCustomActionDll" 
       DllEntry="RunMigration" 
       Execute="deferred" /> 
+0

¿Cómo hiciste esta acción personalizada? ¿Estás usando DTF? –

+0

Si uso la Deployment Tools Foundation (DTF - explicada para futuros buscadores - no supe de qué se trataba hasta que la busqué) No lo sé. Como sugerí, estoy usando el soporte de Custom Action en votive para llevarme a la acción desarrollada. Creo que está usando DTF por debajo, pero eso no está realmente expuesto directamente, lo mejor que puedo decir. –

Respuesta

41

Parece que está utilizando DTF. Si usted ve:

using Microsoft.Deployment.WindowsInstaller; 

entonces usted ciertamente lo es. Asegúrese de leer las siguientes personas por cómo funciona todo:

Deployment Tools Foundation (DTF) Managed Custom Actions

También encontrará una alianza de ayuda CHM DTF en el menú de inicio bajo WiX.

Básicamente suena como me va a cablear el ensamblado de .NET en el instalador en lugar del contenedor DLL unmanged. Lea el artículo anterior para obtener una descripción general de cómo verlo en Depends y saber qué esperar. El WiX | El proyecto de acción personalizada de C# debería generar Foo.dll y Foo.CA.dll. Desea que el último en su instalador.

Para las personas que llegan a esta página en el futuro (la respuesta era originalmente para el cartel) hay toda una lista de cosas para comprobar:

  1. ¿Está haciendo referencia a la DLL correcta en la tabla binaria?
  2. ¿Está haciendo referencia al nombre correcto de la función exportada?
  3. ¿Su clase es pública?
  4. ¿Su método está utilizando la firma correcta? Es decir. es que:
  5. marcado con el atributo CustomAction correcta
  6. Marcado como público?
  7. Marcado como estático?
  8. Return ActionResult?
  9. ¿Tomar la sesión como argumento?
  10. Asegúrese de estar utilizando el tipo de proyecto de acción personalizado de WiX C# para asegurarse de que se convoque el evento postbuild para crear el contenedor DLL nativo. (Ver # 1)

Cualquiera de estos puede causar un error 1154. Esta es la razón por la que escribí un artículo de blog exhaustivo sobre el tema y lo relacioné en esta respuesta. Es importante comprender completamente cómo se presenta el código administrado al servicio Windows Installer no administrado y saber cómo usar Depends para validar que el método estático público se exporte como una función stdcall en el .CA.dll resultante que produce WiX/DTF.

+4

OK, esto me dijo la respuesta: cuando comparé el trabajo con el que no funciona, vi que estaba usando .CA.DLL para el trabajo y .DLL para el que no funciona. Cambié la etiqueta binaria y estaba listo para empezar. –

+0

Gran lista. Agregaré una cosa que me enloqueció por un tiempo. Asegúrese de que el proyecto de acción personalizado sea del tipo 'C# Custom Action project' (visible bajo los tipos de proyectos XML de Windows Installer) en lugar de una 'Class Library' normal. ¡Puede parecer obvio, pero lo extrañé! –

+0

De acuerdo. El otro día hice una sesión para compartir pantalla con un desarrollador que simplemente estaba atrapado tratando de descubrirlo y ese era su problema. Creó una biblioteca de clases y escribió el código, pero no se dio cuenta de que le faltaba la referencia de los objetivos que atrae la llamada posterior al build a makesfxca. –

0

trate de poner su llamada acción personalizada en

<InstallExecuteSequence/> 

la esperanza de conseguir un mensaje de error mejor. He recibido diferentes mensajes de error dependiendo de cómo se llamó la acción. Además, intente utilizar fuslogvw.exe. También podría darle un bonito mensaje de error.

+0

Gracias por la respuesta. Vi algunos otros mensajes aquí en StackOverflow sobre problemas de WiX y seguí ese camino ayer. (Debería haber dicho en la pregunta.) La llamada es en realidad en ya, y fuslogvw- no muestra ninguna une en absoluto (que admito ser confundido acerca un poco). –

+0

¿Está haciendo referencia a cualquier dll adicional en su acción personalizada rota? ¿Qué está haciendo tu método? – KnightsArmy

+0

En el roto en este momento, para solucionar problemas, solo hay una referencia (Microsoft.Deployment.WindowsInstaller) que está en funcionamiento, y solo un método. Editaré la pregunta para mostrar el código. –

4

Si crea su acción personalizada en Visual Studio (Votive), asegúrese de haber creado un proyecto Wix Custon Action y no una biblioteca de clases; de lo contrario, debe usar la herramienta MakeSfxCA para empaquetar su acción personalizada.

5

Acabo de encontrar el mismo problema (usando el archivo .CA.dll correcto) y en mi caso fue porque no estaba usando un método estático. Tenía esta:

public ActionResult MyMethod(Session session) 

lugar de esto:

public static ActionResult MyMethod(Session session) 

Después de cambiar el método ha funcionado bien.

espero que ayude a alguien.

+0

¡Gracias, estaba perplejo con este! –

+0

¡Me alegra que lo haya encontrado útil! –

+0

Eso fue # 7 en mi respuesta de 2010. :) –

1

di con otra causa muy simple (y estúpida) para el error 1154: escribir incorrectamente el nombre de entrada DLL en el elemento CustomAction ...

Comparando diversas causas que otras personas han encontrado me parece que los medios de error 1154 en la mayoría de los casos, "Entrada de DLL no encontrada".

+0

# 2 en mi respuesta de 2010. :) –

1

Otro motivo por el que vi este error fue porque olvidé agregar el atributo [CustomAction] al nombre de mi función C#.

+0

# 5 en mi respuesta de 2010. :) –

0

En mi caso, era la longitud del nombre de la función. Fueron 27 caracteres y obtuvimos el error. Cambiamos el nombre de la función a 24 caracteres, y funcionó.

Cuestiones relacionadas