55 votes

Spécifiez le chemin de recherche pour DllImport dans .NET

Existe-t-il un moyen de spécifier les chemins à rechercher pour un assembly donné importé avec DllImport?

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

Cela recherchera la dll dans le répertoire de l'application et dans la variable d'environnement PATH. Mais parfois la dll sera placée ailleurs. Cette information peut-elle être spécifiée dans app.config ou dans le fichier manifeste pour éviter le chargement dynamique et l'appel dynamique?

70voto

Chris Schmich Points 16390

Appelez SetDllDirectory avec votre DLL chemins avant de vous appeler dans la fonction importée pour la première fois.

P/Invoke signature:

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

Pour définir plus d'une DLL chemin de recherche, de modifier l' PATH variable d'environnement, par exemple:

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

    Environment.SetEnvironmentVariable("PATH", path);
}

Il n'y a plus d'infos à propos de la DLL ordre de recherche ici sur MSDN.


Mise à jour 2013/07/30:

Version mise à jour de la ci-dessus en utilisant 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);
}

14voto

jvrdev Points 111

Essayez d'appeler AddDllDirectory avec votre DLL chemins avant de vous appeler dans la fonction importée pour la première fois.

Si votre version de Windows est inférieur à 8, vous devrez installer ce patch, qui s'étend de l'API avec les disparus AddDllDirectory fonction pour Windows 7, 2008 R2, 2008 et Vista (il n'y a pas de patch pour XP, tout de même).

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X