Scénario: J'ai créé un projet de bibliothèque fournissant une interface au programme d'installation (le fichier exe créé à l'aide du bouclier d'installation) .Je veux vérifier si un fichier particulier existe dans le dossier du programme d'installation.
J'ai essayé de suivre:
1). Assembly.GetEntryAssembly().Location
// Lance "La référence d'objet n'est pas définie sur une instance d'objet"
2). new Uri(Assembly.GetExecutingAssembly().CodeBase).LocalPath
// revenir : C:\Windows\Microsoft.Net\Assembly\GAC_32\mscorlib\v4.0_4.0.0.0__b77a5c561934e089\mscorlib.dll
3). Assembly.GetExecutingAssembly().Location
// retourne une chaîne vide
4). AppDomain.CurrentDomain.BaseDirectory
// retourne "C:\Windows\syswow64 \" quel que soit le chemin d'accès
Quelqu'un pourrait-il me dire comment puis-je obtenir le chemin du répertoire à partir duquel le programme d'installation est exécuté?
Je vais répondre à ma propre question, il n'est pas possible d'obtenir le chemin actuel du projet de bibliothèque. Vous devrez l'obtenir de l'installateur. Il n'y a pas d'autre moyen.
Je vous remercie.
Vous pouvez utiliser
Directory.GetCurrentDirectory();
obtenir le chemin du répertoire courant
importer System.IO
En supposant que vous exécutez une installation MSI construite par InstallShield:
Le problème que vous rencontrez est dû à la façon dont ces appels fonctionnent. Vous l'implémentez dans une DLL externe, et les DLL n'ont pas leur propre répertoire actuel - elles ont le répertoire actuel du processus qui appelle la Dll. Dans ce cas, vous êtes appelé à partir d'un processus msiexec.exe (en supposant que vous le fassiez dans une action personnalisée) afin d'obtenir le répertoire actuel de msiexec.exe.
En dehors de cela, quelques autres observations:
Vous ne dites pas exactement quand vous appelez votre code, mais cela se produit peut-être avant que l'utilisateur ait choisi le dossier d'installation. La recherche n'aide donc pas vraiment.
InstallShield fournit probablement un support pour une recherche de fichier. S'il s'agit d'une configuration MSI, c'est le cas.
Les installations recherchent rarement des fichiers dans un dossier d’installation car il existe rarement une bonne raison. Si vous avez besoin du fichier, ajoutez-le à votre installation, ou s'il s'agit d'un fichier redistribuable, ajoutez le package redist standard, peut-être un module de fusion. Si ce fichier appartient à une autre configuration, que ferez-vous si ce produit est désinstallé? Vérifiez-vous la version pour voir si elle est compatible avec votre application? En général, toutes les configurations installent les fichiers dont elles ont besoin et les fichiers partagés sont rétrocompatibles si elles sont utilisées par plusieurs produits différents.
Si vous voulez obtenir le dossier où repose votre exe
AppDomain.CurrentDomain.BaseDirectory
cela renvoie le chemin complet au dossier qui contient l'exe. De là, vous pouvez ajouter vos dossiers manuellement
AppDomain.CurrentDomain.BaseDirectory + @"MyFolder1\MyFolder2";
Si vous voulez que ce chemin dans InstallShield utilisez ceci
Setup.exe - Utilise la propriété SETUPEXEDIR
http://www.installshield.com/news/newsletter/0206-articles/SetupExeDir.asp .
Selon la version de installshield que vous utilisez, essayez différentes propriétés.
1. SRCDIR
2. SETUPEXEDIR
3. SUPPORTDIR
Si vous avez un code C # pour lire les pré-propriétés, utilisez MsiGetProperty comme ci-dessous
MsiGetProperty (hMSI, "SETUPEXEDIR", Valeur, Taille)
Essayez celui-ci, ça marche toujours pour moi:
Environment.CurrentDirectory
utiliser la propriété ci-dessus comme suit.
string currentDirectory = Path.GetDirectoryName(Environment.CurrentDirectory);