Controlla se una DLL è presente nel sistema

domanda veloce. Voglio scoprire se una DLL è presente nel sistema in cui è in esecuzione la mia applicazione.

È ansible in C #? (in un modo che avrebbe funzionato su TUTTO il sistema operativo Windows?)

Per DLL intendo una dll classica non- .NET (una dll Win32)

(Fondamentalmente voglio fare un controllo perché sto usando una DLL che può o non può essere presente sul sistema dell’utente, ma non voglio che l’app si arresti in modo anomalo senza preavviso quando questo non è presente: P)

Chiama la funzione API LoadLibrary :

 [DllImport("kernel32", SetLastError=true)] static extern IntPtr LoadLibrary(string lpFileName); static bool CheckLibrary(string fileName) { return LoadLibrary(fileName) == IntPtr.Zero; } 

Penso che sia meglio chiamare GetModuleHandle piuttosto che LoadLibrary per verificare se è stata caricata una DLL.

 [DllImport("kernel32.dll")] private static extern IntPtr GetModuleHandle(string lpModuleName); public static bool IsDllLoaded(string path) { return GetModuleHandle(path) != IntPtr.Zero; } 

Eviterei di chiamare LoadLibrary per verificare la presenza di una DLL. LoadLibrary caricherà la DLL nello spazio degli indirizzi e caricherà altri moduli se necessario. Supponendo che non sia necessario utilizzare effettivamente la DLL, rimango con GetModuleHandle.

Suppongo che si tratti di una chiamata PInvoke?

In tal caso, il modo più semplice per determinare se è presente è quello di effettuare la chiamata e rilevare l’eccezione che risulta se il file non esiste.

 [DllImport("some.dll")] private static void SomeMethod(); public static void SomeMethodWrapper() { try { SomeMethod(); } catch (FileNotFoundException) { // Do Nothing } } 

In realtà non genera FileNotFoundException .

Anche per questo è necessario controllare in più punti per il percorso, per LoadLibrary

Esiste un’eccezione standard in .net che deriva da TypeLoadException, ovvero DllNotFoundException .

Il modo migliore è racchiudere un metodo / chiamata PInvoke in try..catch e gestire DllNotFoundException poiché .net controllerà il percorso dell’applicazione e qualsiasi altro percorso impostato come parte della variabile d’ambiente PATH OS.

 [DllImport("some.dll")] private static void SomeMethod(); public static void SomeMethodWrapper() { try { SomeMethod(); } catch (DllNotFoundException) { // Handle your logic here } }