J'ai essayé de créer une action personnalisée pour un projet Visual Studio Installer afin de modifier les autorisations d'un fichier de configuration.
Le fichier Installer.cs est le suivant:
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);
}
Ensuite, j'ajoute la sortie principale (classe du programme d'installation = true) dans la section Valider des actions personnalisées du projet d'installation.
Lorsque j'exécute le programme d'installation, le message d'erreur suivant s'affiche:
Error 1001: Could not find file 'c:\mypath\myapp.InstallState'
En parcourant le Web, j'ai trouvé quelques exemples d'expériences similaires, mais aucune des solutions proposées n'a fonctionné pour moi.
Des idées?
Vous pouvez trouver une solution ici
Citer:
Le problème est que l'infrastructure MSI recherche le fichier d'état d'installation généralement créé lors de l'installation phase. Si l'action personnalisée ne participe pas à la phase d'installation, aucun fichier n'est créé.
La solution consiste à ajouter l'action personnalisée à l'installation et au Commit des phases, bien que cela ne fasse rien pendant la phase d'installation.
J'ai rencontré ce problème lorsque je n'ai pas spécifié d'action personnalisée dans mon projet d'installation pour les quatre remplacements (Installation, Désinstallation, Validation et Restauration). Dès que j'ai spécifié la sortie de mon projet en tant qu'action personnalisée pour les quatre, le problème a disparu.
Les seuls remplacements dans ma classe d'installation qui ont fait quoi que ce soit étaient les suivants: Valider et Désinstaller; Je pense que l’installation a été chargée de créer le fichier InstallState, et comme il n’a jamais été appelé, le fichier InstallState n’a jamais été créé.
Parfois, "Debugger.Launch ();" est mis à ces fonctions écrasées pour le débogage. Si vous construisez le programme d'installation avec l'instruction ici, et lors de l'installation, une boîte de dialogue apparaîtra pour vous demander si le débogage est nécessaire. Si vous appuyez sur 'Annuler le débogage', vous obtiendrez cette boîte de dialogue d'erreur. Parce que vous avez ajouté le 'Debugger.Launch ()' à votre fonction, cette fonction sera considérée comme 'manquée' par l'installateur. Alors, n'oubliez pas de l'enlever.
Parfois, cela se produit lorsque la classe du programme d'installation n'est pas créée correctement. Voici un tutoriel qui peut vous aider: http://devcity.net/Articles/339/1/article.aspx
Assurez-vous que votre action personnalisée suit les recommandations du didacticiel.
Essayez de définir Installer classe = false au lieu de true dans les propriétés de votre action personnalisée. Cela a résolu ce problème pour moi.
Pour moi, le problème était aussi simple que d’ajouter une citation de clôture autour d’un des noms de zones de texte de ma chaîne CustomActionData.
J'utilisais les fenêtres "Zone de texte (A)" et "Zone de texte (B)" dans la section Interface utilisateur. A a 1 boîte, EDITA1
, où je trouve le chemin d'accès à un fichier, et B a 2 boîtes, EDITB1
et EDITB2
, pour certains paramètres de base de données. Mon CustomActionData string ressemblait à ceci:
/filepath="[EDITA1]" /Host="[EDITB1] /port="[EDITB2]"
Cela aurait dû être:
/filepath="[EDITA1]" /Host="[EDITB1]" /port="[EDITB2]"
(devis de clôture sur [EDITB1]
)
J'ai utilisé le remplacement d'installation dans ma classe d'installation pour obtenir les valeurs (c'est-à-dire string filepath = Context.Parameters["filepath"];
) et je les ai utilisées pour les écrire dans un fichier INI que mon application utilisera une fois installé. J'ai mis la "sortie principale" dans toutes les phases de l'interface utilisateur des actions personnalisées, mais je n'ai rien fait avec la propriété InstallerClass (valeur par défaut: True) et je n'ai défini que la chaîne CustomActionData sur celle d'installation. Je n'ai même pas inclus de fonctions de substitution dans ma classe d'installation, car je ne faisais rien de ce qui était personnalisé dans les autres phases.