Vérifier si une DLL est présent dans le système
question rapide. Je veux savoir si une DLL est présente dans le système d'où ma demande est en cours d'exécution.
Est-ce possible en C#? (d'une manière qui fonctionne sur TOUS les OS Windows?)
Pour les DLL je veux dire un non-.NET classique dll (une dll Win32)
(En gros je veux faire un chèque parce que je suis en utilisant une DLL qui peuvent ou peuvent ne pas être présents sur le système de l'utilisateur, mais je ne veux pas l'application à bloquer sans avertissement lorsque cela n'est pas présent :P)
L'objectif est de ne pas obtenir un message d'erreur si le fichier n'est pas présent ou à trouver ce qui est présent.
Le but est de savoir si la dll n'est pas présent et de l'afficher à l'utilisateur un "il Vous manque la dll xxx.dll. Aller mettre à jour votre système".
Le but est de savoir si la dll n'est pas présent et de l'afficher à l'utilisateur un "il Vous manque la dll xxx.dll. Aller mettre à jour votre système".
OriginalL'auteur feal87 | 2010-02-18
Vous devez vous connecter pour publier un commentaire.
Appeler le
LoadLibrary
la fonction de l'API:Ainsi, la bibliothèque devrait être chargé de toute façon TOUJOURS par mon application (comme utilisé à 100% par l'application :D), de sorte que le freelibrary est inutile je pense.
A mon avis le FreeLibrary est nécessaire - sinon, vous fuite d'une référence à la bibliothèque. Ce n'est pas pour déplaire à maintenant, mais à l'avenir, quelqu'un va penser que CheckLibrary a pas d'effets secondaires et il va vous brûler.
Larry est le droit, pour ne pas mentionner il va mettre du bruit dans votre Application Verifier vérifie. Vous à l'aide de AppVerifier à vérifier pour les bugs, non?? Le droit??
"Le système maintient une par processus de comptage de référence sur tous les modules chargés. L'appel de la fonction LoadLibrary incrémente le compteur de référence. L'appel de la FreeLibrary ou FreeLibraryAndExitThread fonction décrémente le compteur de référence. Le système de décharge d'un module lors de sa référence compte à rebours atteint zéro ou lorsque le processus se termine (quel que soit le nombre de références)." Citation de MSDN, mais de toute façon un freelibrary ne coûtent rien. Je vais ajouter ça 😛
OriginalL'auteur SLaks
Je pense que c'est mieux d'appeler GetModuleHandle plutôt que de LoadLibrary pour vérifier si une dll est chargée.
Je voudrais éviter d'appeler la fonction LoadLibrary pour vérifier la présence d'une dll. LoadLibrary charge la dll dans l'espace d'adressage et de charger d'autres modules nécessaires. En supposant que vous n'avez pas besoin d'utiliser la dll, je collerais avec GetModuleHandle.
Mis à jour mon post original.
OriginalL'auteur Justin Kotalik
Appel De La Fonction LoadLibrary.
http://msdn.microsoft.com/en-us/library/ms684175(SV.85).aspx
OriginalL'auteur Steven Sudit
Je suppose que c'est un PInvoke appel?
Si donc la façon la plus simple de faire cela de déterminer s'il est présent, est de faire l'appel et intercepter l'exception des résultats si le fichier n'existe pas.
OriginalL'auteur JaredPar
En fait, il ne jetez pas FileNotFoundException.
Aussi pour cela on a besoin de vérifier à plusieurs endroits pour le chemin, pour le LoadLibrary
Il y a une exception .net le est dérivé de TypeLoadException, c'est-à DllNotFoundException.
Meilleure façon est d'enrouler une méthode/PInvoke appel de try..catch et de gérer la DllNotFoundException depuis .net va vérifier pour le chemin de l'application ainsi que tous les autres chemins d'accès définis dans le cadre de la VOIE OS variable d'Environnement.
OriginalL'auteur seshuk
Lors de l'utilisation de la plateforme invoquer des appels en .NET, vous pouvez utiliser
Marshal.PrelinkAll(Type)
méthodeComme vous pouvez le voir, il effectue des contrôles supplémentaires autres que si la dll n'existe, à l'instar de localiser les points d'entrée (e.g si
SomeMethod()
etSomeMethod2()
existent réellement dans le processus, comme dans le code suivant).Ensuite utiliser
try...catch
stratégie pour effectuer votre check:OriginalL'auteur Dr Yunke