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

94

J'ai un fichier de configuration que je dois charger dans le cadre de l'exécution d'une DLL que j'écris.

Le problème que j'ai est que l'endroit où j'ai mis 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 ici le fichier dll et xml:

D: \ Program Files \ Microsoft Team Foundation Server 2010 \ Application Tier \ 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

Donc, j'ai besoin de trouver un moyen (j'espère) de savoir où se trouve la dll en cours d'exécution. Fondamentalement, je recherche ceci:

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

Réponses:

140

Tu recherches System.Reflection.Assembly.GetExecutingAssembly()

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

Remarque:

La .Locationpropriété renvoie l'emplacement du fichier DLL en cours d'exécution.

Dans certaines conditions, la DLL est copiée en miroir avant l'exécution et la .Locationpropriété renverra le chemin de la copie. Si vous voulez le chemin de la DLL d'origine, utilisez Assembly.GetExecutingAssembly().CodeBaseplutôt la propriété.

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

Verre brisé
la source
8
Hélas! Cela revientC:\\Windows\\Microsoft.NET\\Framework64\\v4.0.30319\\Temporary ASP.NET Files\\tfs\\de3c0c8e\\c1bdf790\\assembly\\dl3\\20b156cb\\22331f24_bfb9cb01\\AggregatorItems.xml
Vaccano
23
Ah! Mais l' Assembly.GetExecutingAssembly().CodeBaseavez-vous!
Vaccano le
2
CodeBase m'a donné le fichier: \\ c: \ myassemblypath, qui est bizarre
Matt
10
@Matt utilise le nouvel Uri (Assembly.GetExecutingAssembly (). CodeBase) .LocalPath pour obtenir un vrai nom
Larry
2
string curAssemblyFolder = new System.Uri(System.Reflection.Assembly.GetExecutingAssembly().CodeBase).LocalPath;
Martin Connell
37

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.
Nicolas Carey
la source
16

Dans mon cas (traitant de mes assemblys chargés [en tant que fichier] dans Outlook):

typeof(OneOfMyTypes).Assembly.CodeBase

Notez l'utilisation de CodeBase(non Location) sur le Assembly. D'autres ont indiqué des méthodes alternatives pour localiser l'assemblage.


la source
5
System.Reflection.Assembly.GetExecutingAssembly().Location
Hawxby
la source
1

Si vous travaillez avec une application asp.net et que vous souhaitez localiser des assemblys lors de l'utilisation du débogueur, ils sont généralement placés dans un répertoire temporaire. J'ai écrit 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 ce billet 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 le redéployer, mais que vous pouvez examiner les processus en cours d'exécution sur l'ordinateur, utilisez Process Explorer. J'ai écrit une description détaillée ici .

Il répertorie toutes les DLL en cours d'exécution sur le système, vous devrez peut-être déterminer l'ID 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 façon de procéder pour une dll dans IIS - http://nodogmablog.bryanhogan.net/2016/09/locating-and-checking-an-executing-dll-on-a-running-web -serveur/

Bryan
la source