Especificar la ruta de búsqueda para DllImport in.NET


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

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

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

Author: Stefan, 2010-05-19

3 answers

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

P/Invoke signature:

[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 variable de 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 DLL aquí en MSDN.


Actualizado 2013/07/30:

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

static void AddEnvironmentPaths(IEnumerable<string> paths)
{
    var path = new[] { Environment.GetEnvironmentVariable("PATH") ?? string.Empty };

    string newPath = string.Join(Path.PathSeparator.ToString(), path.Concat(paths));

    Environment.SetEnvironmentVariable("PATH", newPath);
}
 65
Author: Chris Schmich,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2013-07-30 20:19:12

Intenta llamar AddDllDirectory con sus rutas DLL adicionales 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 extiende la API con la función AddDllDirectory faltante para Windows 7, 2008 R2, 2008 y Vista (sin embargo, no hay ningún parche para XP).

 14
Author: jvrdev,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2013-06-11 12:08:16

Esto podría ser útil DefaultDllImportSearchPathsAttribute Class
Por ejemplo,

[assembly: DefaultDllImportSearchPaths(DllImportSearchPath.UserDirectories)]

También ten en cuenta que puedes usar AddDllDirectory así que no estás arruinando nada ya allí:

[DllImport("kernel32.dll", SetLastError = true)]
static extern bool AddDllDirectory(string path);
 1
Author: Eric,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2017-07-29 02:55:38