visual tutorial toolset studio msi c# wix wix3.5 custom-action votive

c# - tutorial - wix visual studio 2012



La acción personalizada en C#utilizada a través de WiX falla con el error 1154 (7)

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 compilación más reciente que parece hacer una CA C # compilable con referencias de trabajo).

Tengo dos conjuntos de acciones personalizados escritos en C #. Uno de ellos funciona bien. El otro 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 los archivos .wixproj, y lo mejor que puedo decir es que las diferencias son apropiadas (por ejemplo, la lista de archivos .cs incluidos). 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 esto funcione?

Editar: para completar, 1154 hace referencia 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: ejecutó peverify contra el dll (tomó una copia de / windows / installer mientras el instalador estaba en ejecución) y dice que todo está bien en el 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 en 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 para eso. Las partes relevantes de .wxs son las 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" />


Intenta poner tu llamada de acción personalizada en

<InstallExecuteSequence/>

con la esperanza de obtener un mejor mensaje de error. 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.


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, deberá usar la herramienta MakeSfxCA para empacar su acción personalizada.


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 esto:

public ActionResult MyMethod(Session session)

En lugar de esto:

public static ActionResult MyMethod(Session session)

Después de cambiar el método funcionó bien.

Espero que ayude a alguien.


Me encontré con otra causa muy simple (y estúpida) del error 1154: escribir mal el nombre de la entrada de DLL en el elemento CustomAction ...

Comparando varias causas que otras personas han encontrado, me parece que el error 1154 significa en la mayoría de los casos, "entrada de DLL no encontrada".


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


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


Parece que estás usando DTF. Si tú ves:

using Microsoft.Deployment.WindowsInstaller;

entonces ciertamente lo eres Asegúrese de leer lo siguiente sobre cómo funciona todo:

Herramientas personalizadas de implementación de Deployment Tools Foundation (DTF)

También encontrará una DTF help chm en el menú de inicio bajo WiX.

Básicamente, me parece que está conectando el ensamblado de .NET al instalador en lugar del dll de contenedor no administrado. 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 aterricen en esta página en el futuro (la respuesta fue originalmente para el afiche), hay una lista completa de cosas para verificar:

  1. ¿Estás haciendo referencia a la DLL correcta en la tabla binaria?
  2. ¿Estás haciendo referencia al nombre correcto de la función exportada?
  3. ¿Tu clase es pública?
  4. ¿Su método está usando la firma correcta? Es decir:
  5. Marcado con el atributo CustomAction correcto
  6. Marcado como público?
  7. Marcado como estático?
  8. Return ActionResult?
  9. Tomar la sesión como un 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 de postconstrucción para crear el contenedor de DLL nativo. (Ver # 1)

Cualquiera de estos puede causar un error 1154. Esta es la razón por la que escribí un artículo exhaustivo de blog 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.