Especifique la ruta de búsqueda para DllImport en .NET

¿Hay alguna forma de especificar las rutas que se deben buscar para un ensamblaje determinado que se importa con DllImport?

[DllImport("MyDll.dll")] static extern void Func(); 

Esto buscará el dll en el directorio de la aplicación y en la variable de entorno PATH. Pero a veces el dll se colocará en otro lado. ¿Se puede especificar esta información en app.config o en el archivo de manifiesto para evitar la carga dinámica y la invocación dinámica?

Llame a SetDllDirectory con sus rutas adicionales de DLL antes de llamar a la función importada por primera vez.

Firma de P / Invoke:

 [DllImport("kernel32.dll", SetLastError = true)] static extern bool SetDllDirectory(string lpPathName); 

Para establecer más de una ruta de búsqueda DLL adicional, modifique la PATH entorno PATH , por ejemplo:

 static void AddEnvironmentPaths(string[] paths) { string path = Environment.GetEnvironmentVariable("PATH") ?? string.Empty; path += ";" + string.Join(";", paths); Environment.SetEnvironmentVariable("PATH", path); } 

Hay más información sobre el orden de búsqueda de DLL aquí en MSDN .


Actualizado el 30/07/2013:

Versión actualizada de lo anterior utilizando Path.PathSeparator :

 static void AddEnvironmentPaths(IEnumerable paths) { var path = new[] { Environment.GetEnvironmentVariable("PATH") ?? string.Empty }; string newPath = string.Join(Path.PathSeparator.ToString(), path.Concat(paths)); Environment.SetEnvironmentVariable("PATH", newPath); } 

Intente llamar a AddDllDirectory con sus rutas adicionales de DLL antes de llamar a la función importada por primera vez.

Si su versión de Windows es inferior a 8, necesitará instalar este parche , que amplía la API con la función AddDllDirectory faltante para Windows 7, 2008 R2, 2008 y Vista (sin embargo, no hay parche para XP).

Esto podría ser útil DefaultDllImportSearchPathsAttribute Class
P.ej

 [assembly: DefaultDllImportSearchPaths(DllImportSearchPath.UserDirectories)] 

También tenga en cuenta que también puede usar AddDllDirectory para que no arruine nada que ya esté allí:

 [DllImport("kernel32.dll", SetLastError = true)] static extern bool AddDllDirectory(string path);