c# - Acción personalizada-Error 1001: no se pudo encontrar el archivo myApp.InstallState
windows-installer custom-action (7)
He intentado crear una acción personalizada para un proyecto de Visual Studio Installer para modificar los permisos de un archivo de configuración.
El Installer.cs es el siguiente:
public override void Commit(IDictionary savedState)
{
base.Commit(savedState);
// Get path of our installation (e.g. TARGETDIR)
//string configPath = System.IO.Path.GetDirectoryName(Context.Parameters["AssemblyPath"]) + @"/config.xml";
string configPath = @"C:/Program Files/Blueberry/Serial Number Reservation/config.xml";
// Get a FileSecurity object that represents the current security settings.
FileSecurity fSecurity = File.GetAccessControl(configPath);
//Get SID for ''Everyone'' - WellKnownSidType works in non-english systems
SecurityIdentifier everyone = new SecurityIdentifier(WellKnownSidType.WorldSid, null);
// Add the FileSystemAccessRule to the security settings.
fSecurity.AddAccessRule(new FileSystemAccessRule(everyone, FileSystemRights.Modify | FileSystemRights.Synchronize, InheritanceFlags.ContainerInherit | InheritanceFlags.ObjectInherit, PropagationFlags.None, AccessControlType.Allow));
// Set the new access settings.
File.SetAccessControl(configPath, fSecurity);
}
public override void Install(IDictionary stateSaver)
{
base.Install(stateSaver);
}
public override void Rollback(IDictionary savedState)
{
base.Rollback(savedState);
}
public override void Uninstall(IDictionary savedState)
{
base.Uninstall(savedState);
}
Luego agrego la Salida primaria (Clase del instalador = verdadero) en la sección Confirmar de las Acciones personalizadas del proyecto de instalación.
Cuando ejecuto el instalador, obtengo el siguiente error:
Error 1001: Could not find file ''c:/mypath/myapp.InstallState''
Buscando en la web, he encontrado algunos ejemplos de experiencias similares, pero ninguna de las soluciones ofrecidas ha funcionado para mí.
¿Algunas ideas?
A veces esto sucede cuando la clase del instalador no se crea correctamente. Aquí hay un tutorial que puede ayudarte: http://devcity.net/Articles/339/1/article.aspx
Asegúrese de que su acción personalizada sigue las recomendaciones del tutorial.
A veces, "Debugger.Launch ();" Se pone en esas funciones sobrescritas para la depuración. Si crea el instalador con la declaración allí, y durante su instalación, aparecerá un cuadro de diálogo que le preguntará si es necesario realizar una depuración, si presiona "cancelar la depuración de errores", aparecerá este cuadro de diálogo de error. Debido a que agregó el ''Debugger.Launch ()'' a su función, entonces esa función será considerada como "perdida" por el instalador. Por lo tanto, no se olvide de eliminarlo.
Intente configurar Installer class = false en lugar de true en las propiedades de su acción personalizada. Eso solucionó este problema para mí.
Intente instalar esto como en un indicador de comando del administrador. Esto funcionó para mí.
Para mí, el problema era tan simple como simplemente agregar una cita de cierre alrededor de uno de los nombres de los cuadros de texto en mi cadena CustomActionData.
Estaba usando las ventanas "Cuadros de texto (A)" y "Cuadros de texto (B)" en la sección Interfaz de usuario. A tiene 1 caja, EDITA1
, donde obtengo la ruta a un archivo, y B tiene 2 cajas, EDITB1
y EDITB2
, para algunos parámetros de la base de datos. Mi cadena CustomActionData se veía así:
/filepath="[EDITA1]" /host="[EDITB1] /port="[EDITB2]"
Debería haber sido:
/filepath="[EDITA1]" /host="[EDITB1]" /port="[EDITB2]"
(cita de cierre en [EDITB1]
)
Utilicé el reemplazo de Instalar en mi clase de Instalador para obtener los valores (es decir, string filepath = Context.Parameters["filepath"];
) y lo usé para escribirlos en un archivo INI para que mi aplicación los use una vez que esté instalada. Puse la "Salida principal" en todas las fases de la GUI de acciones personalizadas, pero no hice nada con la propiedad InstallerClass (por defecto: Verdadero) y solo configuré la cadena CustomActionData en la versión de instalación . Ni siquiera incluí funciones de anulación en mi clase de Instalador, ya que no estaba haciendo nada que fuera personalizado en las otras fases.
Tuve este problema cuando no especifiqué una acción personalizada en mi proyecto de instalador para las cuatro invalidaciones (Instalar, Desinstalar, Confirmar y Revertir). Tan pronto como especifiqué la salida de mi proyecto como la acción personalizada para los cuatro, el problema desapareció.
Los únicos cambios en mi clase de instalador que hicieron algo fueron Confirmar y Desinstalar; Creo que Install se encargó de crear el archivo InstallState en primer lugar, y como nunca se llamó, nunca se creó el archivo InstallState.
Puedes encontrar una solución aquí
Citar:
El problema es que la infraestructura de MSI está buscando el archivo de estado de instalación que generalmente se crea durante la fase de instalación. Si la acción personalizada no participa en la fase de instalación, no se crea ningún archivo.
La solución es agregar la acción personalizada a las fases Instalar y Confirmar, aunque no hace nada durante la fase de instalación.