web-dev-qa-db-fra.com

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'un dll que j'écris.

Le problème que j'ai est que l'endroit où je mets 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 mets les fichiers DLL et XML ici:

D:\Fichiers de programme\Microsoft Team Foundation Server 2010\Niveau d'application\Services Web\bin\Plugins

Mais si je tente de référencer le fichier XML (dans ma DLL) comme ceci:

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

then .\AggregatorItems.xml se traduit par:

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

Donc, je dois trouver un moyen (j'espère) de savoir où se trouve la dll en cours d'exécution. En gros, je cherche ceci:

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

Vous recherchez System.Reflection.Assembly.GetExecutingAssembly()

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

Remarque:

La propriété .Location Renvoie l'emplacement du fichier en cours d'exécution DLL.

Sous certaines conditions, la DLL est copiée dans l’ombre avant l’exécution, et la propriété .Location Renvoie le chemin de la copie. Si vous voulez utiliser le chemin de la DLL d’origine, utilisez la commande Assembly.GetExecutingAssembly().CodeBase propriété à la place.

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

109
BrokenGlass

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.
32
Nicholas Carey

Dans mon cas (mes assemblages chargés [sous forme de fichier] dans Outlook):

typeof(OneOfMyTypes).Assembly.CodeBase

Notez l'utilisation de CodeBase (pas Location) sur le Assembly. D'autres ont indiqué d'autres méthodes pour localiser l'Assemblée.

14
user166390
System.Reflection.Assembly.GetExecutingAssembly().Location
4
Hawxby

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

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, consultez 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 ni redéployer, mais que vous pouvez examiner les processus en cours sur l'ordinateur, utilisez Process Explorer. J'ai écrit une description détaillée ici .

Il dresse la liste de toutes les dll exécutées sur le système. Vous devrez peut-être déterminer l'ID de processus de votre application en cours d'exécution, mais cela n'est généralement pas trop difficile.

J'ai écrit une description complète de la procédure à suivre pour une dll à l'intérieur IIS - http://nodogmablog.bryanhogan.net/2016/09/locating-and-checking- un-exécutant-dll-sur-un-serveur-Web-en cours d'exécution /

1
Bryan