Come ottenere la posizione della DLL attualmente in esecuzione?


93

Ho un file di configurazione che devo caricare come parte dell'esecuzione di una dll che sto scrivendo.

Il problema che sto riscontrando è che il posto in cui ho inserito il file dll e config non è il "percorso corrente" quando l'app è in esecuzione.

Ad esempio, metto il file dll e xml qui:

D: \ Programmi \ Microsoft Team Foundation Server 2010 \ Livello applicazione \ Servizi Web \ bin \ Plugins

Ma se provo a fare riferimento al file xml (nella mia dll) in questo modo:

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

quindi . \ AggregatorItems.xml si traduce in:

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

Quindi, ho bisogno di trovare un modo (spero) di sapere dove si trova la dll attualmente in esecuzione. Fondamentalmente sto cercando questo:

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

Risposte:


139

Stai cercando System.Reflection.Assembly.GetExecutingAssembly()

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

Nota:

La .Locationproprietà restituisce la posizione del file DLL attualmente in esecuzione.

In alcune condizioni la DLL viene copiata shadow prima dell'esecuzione e la .Locationproprietà restituirà il percorso della copia. Se vuoi il percorso della DLL originale, usa Assembly.GetExecutingAssembly().CodeBaseinvece la proprietà.

.CodeBasecontiene un prefisso ( file:\), che potrebbe essere necessario rimuovere.


8
Ahimè! Che ritornaC:\\Windows\\Microsoft.NET\\Framework64\\v4.0.30319\\Temporary ASP.NET Files\\tfs\\de3c0c8e\\c1bdf790\\assembly\\dl3\\20b156cb\\22331f24_bfb9cb01\\AggregatorItems.xml
Vaccano

23
Ah! Ma ce l' Assembly.GetExecutingAssembly().CodeBaseha!
Vaccano

2
CodeBase mi ha dato il file: \\ c: \ myassemblypath, che è strano
Matt

10
@ Matt usa il nuovo Uri (Assembly.GetExecutingAssembly (). CodeBase) .LocalPath per ottenere un vero nome
Larry

2
string curAssemblyFolder = new System.Uri(System.Reflection.Assembly.GetExecutingAssembly().CodeBase).LocalPath;
Martin Connell

36

La riflessione è tua amica, come è stato sottolineato. Ma devi usare il metodo corretto;

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.

16

Nel mio caso (gestendo i miei assembly caricati [come file] in Outlook):

typeof(OneOfMyTypes).Assembly.CodeBase

Notare l'uso di CodeBase(not Location) su Assembly. Altri hanno indicato metodi alternativi per localizzare l'assieme.


5
System.Reflection.Assembly.GetExecutingAssembly().Location

1

Se si lavora con un'applicazione asp.net e si desidera individuare gli assembly quando si usa il debugger, di solito vengono inseriti in una directory temporanea. Ho scritto questo metodo per aiutare con quello scenario.

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;
}

Per maggiori dettagli vedere questo post del blog http://nodogmablog.bryanhogan.net/2015/05/finding-the-location-of-a-running-assembly-in-net/

Se non è possibile modificare il codice sorgente o ridistribuirlo, ma è possibile esaminare i processi in esecuzione sul computer, utilizzare Process Explorer. Ho scritto una descrizione dettagliata qui .

Elencherà tutte le DLL in esecuzione sul sistema, potrebbe essere necessario determinare l'ID del processo dell'applicazione in esecuzione, ma di solito non è troppo difficile.

Ho scritto una descrizione completa di come farlo per una dll all'interno di IIS - http://nodogmablog.bryanhogan.net/2016/09/locating-and-checking-an-executing-dll-on-a-running-web -server/

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.