Quiero temporalmente agregar un directorio a las rutas de búsqueda de DLL - ¿hay una forma correcta de hacerlo en Windows 7?Agregando un directorio temporalmente a las rutas de búsqueda de DLL de Windows 7
Escenario
Tengo una aplicación C#, vamos a llamarlo WonderApp.
WonderApp necesita llamar a C++ DLL, que se encuentra en C:\MyPath
. Por lo tanto, como parte de WonderApp de Program.Main()
, añadí el siguiente comando:
Environment.SetEnvironmentVariable("PATH",
"C:\\MyPath;" + Environment.GetEnvironmentVariable("PATH"));
Según this article, la adición de un directorio a la PATH
también debe agregarlo a la búsqueda de directorios de archivos DLL.
La solución funciona bien en Windows XP: si agrego el directorio al PATH
, la DLL se carga y el programa funciona bien. Si no agrego el directorio, la DLL no se carga, pero falla con un error "no encontrado".
Sin embargo, esto no funciona para Windows 7.
Así que pensé, vamos a probar usando SetDllDirectory()
. De esta manera:
[System.Runtime.InteropServices.DllImport("kernel32.dll", SetLastError = true)]
private static extern bool SetDllDirectory(string lpPathName);
Y, más adelante:
bool success = SetDllDirectory(Util.Paths.GetApplicationDataDir());
El valor de success
es true
, pero la DLL todavía no se puede cargar.
Finalmente, si configuro el PATH
para incluir PATH
manualmente, antes de ejecutar la aplicación, ¡todo funciona! La DLL se carga y funciona perfectamente.
lo tanto, para reiterar:
¿Hay una manera correcta de temporalmente añadir un directorio para las rutas de búsqueda de DLL en Windows 7?
ACTUALIZACIÓN: Utilizando Process Explorer, verifiqué el entorno de ejecución de la aplicación, y "C: \ MyPath" estaba realmente en el PATH
! Además, vi que Helper.dll
estaba en la lista de identificadores abiertos (como un archivo DLL, no solo como un archivo) y aún así afirmó no encontrarlo.
¿Es esta la versión de 64 bits de Windows? ¿Cuál es el verdadero nombre de ruta? –
Esto es Windows 7 Home de 32 bits. Y la ruta completa a la DLL es C: \ MyPath \ Helper.dll – scraimer
tal vez falten otros dlls intente cargando helper.dll en el programa "depends.exe" y verifique las dependencias de otros dlls. – OlimilOops