Wie erhalte ich den Speicherort der aktuell ausgeführten DLL?

91

Ich habe eine Konfigurationsdatei, die ich im Rahmen der Ausführung einer DLL, die ich schreibe, laden muss.

Das Problem, das ich habe, ist, dass der Ort, an dem ich die DLL- und Konfigurationsdatei abgelegt habe, nicht der "aktuelle Speicherort" ist, wenn die App ausgeführt wird.

Zum Beispiel habe ich die DLL- und XML-Datei hier abgelegt:

D: \ Programme \ Microsoft Team Foundation Server 2010 \ Anwendungsebene \ Webdienste \ bin \ Plugins

Aber wenn ich versuche, auf die XML-Datei (in meiner DLL) wie folgt zu verweisen:

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

dann . \ AggregatorItems.xml übersetzt in:

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

Ich muss also einen Weg finden (ich hoffe), um zu wissen, wo sich die DLL befindet, die gerade ausgeführt wird. Grundsätzlich suche ich das:

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

Antworten:

135

Du suchst nach System.Reflection.Assembly.GetExecutingAssembly()

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

Hinweis:

Die .LocationEigenschaft gibt den Speicherort der aktuell ausgeführten DLL-Datei zurück.

Unter bestimmten Umständen wird die DLL vor der Ausführung im Schatten kopiert, und die .LocationEigenschaft gibt den Pfad der Kopie zurück. Wenn Sie den Pfad der ursprünglichen DLL möchten, verwenden Sie Assembly.GetExecutingAssembly().CodeBasestattdessen die Eigenschaft.

.CodeBaseenthält ein Präfix ( file:\), das Sie möglicherweise entfernen müssen.

Glassplitter
quelle
7
Ach! Das kehrt zurückC:\\Windows\\Microsoft.NET\\Framework64\\v4.0.30319\\Temporary ASP.NET Files\\tfs\\de3c0c8e\\c1bdf790\\assembly\\dl3\\20b156cb\\22331f24_bfb9cb01\\AggregatorItems.xml
Vaccano
22
Ah! Aber Assembly.GetExecutingAssembly().CodeBasehat es!
Vaccano
2
CodeBase gab mir Datei: \\ c: \ myassemblypath, was seltsam ist
Matt
9
@Matt verwenden Sie neue Uri (Assembly.GetExecutingAssembly (). CodeBase) .LocalPath, um einen richtigen Namen zu erhalten
Larry
2
string curAssemblyFolder = new System.Uri(System.Reflection.Assembly.GetExecutingAssembly().CodeBase).LocalPath;
Martin Connell
36

Reflexion ist dein Freund, wie bereits erwähnt wurde. Sie müssen jedoch die richtige Methode verwenden.

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.
Nicholas Carey
quelle
16

In meinem Fall (Umgang mit meinen Assemblys, die [als Datei] in Outlook geladen wurden):

typeof(OneOfMyTypes).Assembly.CodeBase

Beachten Sie die Verwendung von CodeBase(nicht Location) auf der Assembly. Andere haben auf alternative Methoden zum Lokalisieren der Baugruppe hingewiesen.


quelle
5
System.Reflection.Assembly.GetExecutingAssembly().Location
Hawxby
quelle
1

Wenn Sie mit einer asp.net-Anwendung arbeiten und bei Verwendung des Debuggers Assemblys suchen möchten, werden diese normalerweise in einem temporären Verzeichnis abgelegt. Ich habe diese Methode geschrieben, um bei diesem Szenario zu helfen.

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

Weitere Informationen finden Sie in diesem Blogbeitrag unter http://nodogmablog.bryanhogan.net/2015/05/finding-the-location-of-a-running-assembly-in-net/

Wenn Sie den Quellcode nicht ändern oder erneut bereitstellen können, aber die auf dem Computer ausgeführten Prozesse untersuchen können, verwenden Sie den Prozess-Explorer. Ich geschrieben , um eine detaillierte Beschreibung hier .

Es werden alle ausführenden DLLs auf dem System aufgelistet. Möglicherweise müssen Sie die Prozess-ID Ihrer laufenden Anwendung ermitteln. Dies ist jedoch normalerweise nicht allzu schwierig.

Ich habe eine vollständige Beschreibung der Vorgehensweise für eine DLL in IIS geschrieben - http://nodogmablog.bryanhogan.net/2016/09/locating-and-checking-an-executing-dll-on-a-running-web -Server/

Bryan
quelle