Voglio temporaneamente aggiungere una directory ai percorsi di ricerca DLL: esiste un metodo corretto per eseguire questa operazione in Windows 7?Aggiunta temporanea di una directory ai percorsi di ricerca DLL di Windows 7
Scenario
Ho un'applicazione C#, chiamiamolo WonderApp.
WonderApp deve chiamare una DLL C++, che si trova in C:\MyPath
. Quindi, come parte di WonderApp di Program.Main()
, ho aggiunto il seguente comando:
Environment.SetEnvironmentVariable("PATH",
"C:\\MyPath;" + Environment.GetEnvironmentVariable("PATH"));
Secondo this article, l'aggiunta di una directory al PATH
dovrebbe anche aggiungere alla ricerca di directory per le DLL.
La soluzione funziona correttamente in Windows XP: se aggiungo la directory allo PATH
, la DLL viene caricata e il programma funziona correttamente. Se non aggiungo la directory, la DLL non viene caricata, in mancanza di un errore "non trovato".
Tuttavia, questo non funziona per Windows 7.
Così ho pensato, proviamo con SetDllDirectory()
. Come questo:
[System.Runtime.InteropServices.DllImport("kernel32.dll", SetLastError = true)]
private static extern bool SetDllDirectory(string lpPathName);
E, più avanti:
bool success = SetDllDirectory(Util.Paths.GetApplicationDataDir());
Il valore di success
è true
, ma la DLL non riesce ancora a caricare.
Infine, se si imposta PATH
per includere manualmente C:\MyPath
, prima di eseguire l'applicazione, tutto funziona! La DLL viene caricata e viene eseguita correttamente.
Quindi, per ribadire:
Esiste un modo corretto di temporaneamente aggiungere una directory per i percorsi di ricerca DLL in Windows 7?
UPDATE: Utilizzando Process Explorer, ho controllato ambiente run-time dell'applicazione, e "C: \ MyPath" era davvero nel PATH
! Inoltre, ho visto che Helper.dll
era nella lista degli handle aperti (come una DLL, non solo un file) - e continuava a non trovarlo.
È questo la versione a 64 bit di Windows? Qual è il vero nome del percorso? –
Questo è Windows 7 Home a 32 bit. E il percorso completo della DLL è C: \ MyPath \ Helper.dll – scraimer
forse mancano altre DLL prova a caricare helper.dll nel programma "depends.exe" e controlla le dipendenze di altre DLL. – OlimilOops