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?
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);
}
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).
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);
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