112 votes

Comment obtenir l'emplacement de la DLL en cours d'exécution ?

J'ai un fichier de configuration que je dois charger dans le cadre de l'exécution d'une dll que je suis en train d'écrire.

Le problème que je rencontre est que l'endroit où j'ai placé la dll et le fichier de configuration n'est pas l'emplacement actuel lorsque l'application est en cours d'exécution.

Par exemple, je place les fichiers dll et xml ici :

D:\Program Dossiers \Microsoft Team Foundation Server 2010 \Application Niveau \Web Services \bin\Plugins

Mais si j'essaie de référencer le fichier xml (dans ma dll) comme ceci :

XDocument doc = XDocument.Load(@".\AggregatorItems.xml")

puis . \AggregatorItems.xml se traduit par :

C:\windows\system32\inetsrv\AggregatorItems.xml

Je dois donc trouver un moyen (je l'espère) de savoir où se trouve la dll qui s'exécute actuellement. En gros, je cherche ceci :

XDocument doc = XDocument.Load(CoolDLLClass.CurrentDirectory+@"\AggregatorItems.xml")

178voto

BrokenGlass Points 91618

Vous recherchez System.Reflection.Assembly.GetExecutingAssembly()

string assemblyFolder = Path.GetDirectoryName(Assembly.GetExecutingAssembly().Location);
string xmlFileName = Path.Combine(assemblyFolder,"AggregatorItems.xml");

Remarque :

En .Location renvoie l'emplacement du fichier DLL en cours d'exécution.

Dans certaines conditions, la DLL fait l'objet d'une copie fantôme avant d'être exécutée, et le fichier .Location renvoie le chemin de la copie. Si vous souhaitez obtenir le chemin de la DLL d'origine, utilisez la propriété Assembly.GetExecutingAssembly().CodeBase à la place.

.CodeBase contient un préfixe ( file:\ ), que vous devrez peut-être supprimer.

45voto

Nicholas Carey Points 24614

La réflexion est votre amie, comme cela a été souligné. Mais vous devez utiliser la bonne méthode ;

Assembly.GetEntryAssembly()     //gives you the entrypoint assembly for the process.
Assembly.GetCallingAssembly()   // gives you the assembly from which the current method was called.
Assembly.GetExecutingAssembly() // gives you the assembly in which the currently executing code is defined
Assembly.GetAssembly( Type t )  // gives you the assembly in which the specified type is defined.

18voto

Dans mon cas (avec mes assemblages chargés [comme fichier] dans Outlook) :

typeof(OneOfMyTypes).Assembly.CodeBase

Notez l'utilisation de CodeBase (pas Location ) sur le site de l Assembly . D'autres ont proposé d'autres méthodes pour localiser l'assemblage.

6voto

Hawxby Points 1814
System.Reflection.Assembly.GetExecutingAssembly().Location

2voto

Bryan Points 366

Si vous travaillez avec une application asp.net et que vous voulez localiser les assemblages lorsque vous utilisez le débogueur, ils sont généralement placés dans un répertoire temporaire. J'ai écrit cette méthode pour vous aider dans ce cas.

private string[] GetAssembly(string[] assemblyNames)
{
    string [] locations = new string[assemblyNames.Length];

    for (int loop = 0; loop <= assemblyNames.Length - 1; loop++)       
    {
         locations[loop] = AppDomain.CurrentDomain.GetAssemblies().Where(a => !a.IsDynamic && a.ManifestModule.Name == assemblyNames[loop]).Select(a => a.Location).FirstOrDefault();
    }
    return locations;
}

Pour plus de détails, voir cet article de blog http://nodogmablog.bryanhogan.net/2015/05/finding-the-location-of-a-running-assembly-in-net/

Si vous ne pouvez pas modifier le code source ou redéployer, mais que vous pouvez examiner les processus en cours sur l'ordinateur, utilisez l'Explorateur de processus. J'ai écrit une description détaillée aquí .

Vous devrez peut-être déterminer l'identifiant de processus de votre application en cours d'exécution, mais ce n'est généralement pas trop difficile.

J'ai écrit une description complète de la manière de procéder pour une dll dans IIS - http://nodogmablog.bryanhogan.net/2016/09/locating-and-checking-an-executing-dll-on-a-running-web-server/

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