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.
Chiama LoadLibrary.
http://msdn.microsoft.com/en-us/library/ms684175(VS.85).aspx
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 } }