c# - länge - title tag wordpress




Wie bekomme ich den Pfad der Assembly, in der sich der Code befindet? (18)

Alle vorgeschlagenen Antworten funktionieren, wenn der Entwickler den Code so ändern kann, dass er das erforderliche Snippet enthält. Wenn Sie dies jedoch tun möchten, ohne Code zu ändern, können Sie Process Explorer verwenden.

Es wird alle ausführenden DLLs auf dem System auflisten, Sie müssen möglicherweise die Prozess-ID Ihrer laufenden Anwendung ermitteln, aber das ist normalerweise nicht zu schwierig.

Ich habe eine vollständige Beschreibung wie dies für eine DLL innerhalb II geschrieben - http://nodogmablog.bryanhogan.net/2016/09/locating-and-checking-an-executing-dll-on-a-running-web-server/

Gibt es eine Möglichkeit, den Pfad für die Assembly zu ermitteln, in der sich der aktuelle Code befindet? Ich möchte nicht den Pfad der aufrufenden Assembly, sondern nur den, der den Code enthält.

Grundsätzlich muss mein Komponententest einige XML-Testdateien lesen, die sich relativ zur DLL befinden. Ich möchte, dass der Pfad immer korrekt aufgelöst wird, unabhängig davon, ob die Test-DLL von TestDriven.NET, der MbUnit-GUI oder etwas anderem ausgeführt wird.

Edit : Die Leute scheinen falsch zu verstehen, was ich verlange.

Meine Testbibliothek befindet sich in sagen

C: \ projekte \ myapplication \ daotests \ bin \ Debug \ daotests.dll

und ich möchte diesen Weg gehen:

C: \ Projekte \ MeineAnwendung \ Daotests \ bin \ Debug \

Die drei Vorschläge scheitern mir bisher, als ich von der MbUnit Gui renne:

  • Environment.CurrentDirectory gibt c: \ Programme \ MbUnit

  • System.Reflection.Assembly.GetAssembly(typeof(DaoTests)).Location gibt C: \ Dokumente und Einstellungen \ george \ Lokale Einstellungen \ Temp \ .... \ DaoTests.dll

  • System.Reflection.Assembly.GetExecutingAssembly().Location gibt das gleiche wie das vorherige.


Das aktuelle Verzeichnis, in dem Sie existieren.

Environment.CurrentDirectory;  // This is the current directory of your application

Wenn Sie die .xml-Datei mit Build kopieren, sollten Sie sie finden.

oder

System.Reflection.Assembly assembly = System.Reflection.Assembly.GetAssembly(typeof(SomeObject));

// The location of the Assembly
assembly.Location;

Das sollte funktionieren:

ExeConfigurationFileMap fileMap = new ExeConfigurationFileMap();
Assembly asm = Assembly.GetCallingAssembly();
String path = Path.GetDirectoryName(new Uri(asm.EscapedCodeBase).LocalPath);

string strLog4NetConfigPath = System.IO.Path.Combine(path, "log4net.config");

Ich benutze dies, um DLL-Dateibibliotheken zusammen mit einigen Konfigurationsdateien bereitzustellen (dies ist, um log4net aus der DLL-Datei zu verwenden).


Die einzige Lösung, die mir bei der Verwendung von CodeBase und UNC Network-Teilen geholfen hat, war:

System.IO.Path.GetDirectoryName(new System.Uri(System.Reflection.Assembly.GetExecutingAssembly().CodeBase).LocalPath);

Es funktioniert auch mit normalen URIs.


Hier ist ein VB.NET-Port von John Sibly's Code. Visual Basic unterscheidet nicht zwischen Groß- und Kleinschreibung, daher kollidierten einige seiner Variablennamen mit Typnamen.

Public Shared ReadOnly Property AssemblyDirectory() As String
    Get
        Dim codeBase As String = Assembly.GetExecutingAssembly().CodeBase
        Dim uriBuilder As New UriBuilder(codeBase)
        Dim assemblyPath As String = Uri.UnescapeDataString(uriBuilder.Path)
        Return Path.GetDirectoryName(assemblyPath)
    End Get
End Property

Hilft das?

//get the full location of the assembly with DaoTests in it
string fullPath = System.Reflection.Assembly.GetAssembly(typeof(DaoTests)).Location;

//get the folder that's in
string theDirectory = Path.GetDirectoryName( fullPath );

Ich habe Assembly.CodeBase anstelle von Location verwendet:

Assembly a;
a = Assembly.GetAssembly(typeof(DaoTests));
string s = a.CodeBase.ToUpper(); // file:///c:/path/name.dll
Assert.AreEqual(true, s.StartsWith("FILE://"), "CodeBase is " + s);
s = s.Substring(7, s.LastIndexOf('/') - 7); // 7 = "file://"
while (s.StartsWith("/")) {
    s = s.Substring(1, s.Length - 1);
}
s = s.Replace("/", "\\");

Es hat funktioniert, aber ich bin mir nicht mehr sicher, ob es zu 100% korrekt ist. Die Seite http://blogs.msdn.com/suzcook/archive/2003/06/26/assembly-codebase-vs-assembly-location.aspx sagt:

"Die CodeBase ist eine URL zu dem Ort, an dem die Datei gefunden wurde, während der Speicherort der Pfad ist, an dem sie tatsächlich geladen wurde. Wenn die Assembly beispielsweise aus dem Internet heruntergeladen wurde, beginnt ihre CodeBase möglicherweise mit" http: // " , aber seine Position kann mit "C: \" beginnen. Wenn die Datei shadowkopiert wurde, wäre der Speicherort der Pfad zur Kopie der Datei im Schattenkopierverzeichnis. Es ist auch gut zu wissen, dass die CodeBase nicht garantiert ist für Assemblys im GAC festgelegt werden. Der Speicherort wird jedoch immer für Assemblys festgelegt, die von der Festplatte geladen werden. "

Vielleicht möchten Sie CodeBase anstelle von Location verwenden.


Ich habe das gleiche Verhalten in der NUnit in der Vergangenheit. Standardmäßig kopiert NUnit Ihre Assembly in das temporäre Verzeichnis. Sie können dieses Verhalten in den NUnit Einstellungen ändern:

Vielleicht haben TestDriven.NET und MbUnit GUI die gleichen Einstellungen.


Ich vermute, dass das eigentliche Problem hier ist, dass dein Testläufer deine Assembly an einen anderen Ort kopiert. In der Laufzeit gibt es keine Möglichkeit zu sagen, wohin die Assembly kopiert wurde, aber Sie können wahrscheinlich einen Schalter umlegen, um den Test-Runner anzuweisen, die Assembly von dort auszuführen und nicht in ein Shadow-Verzeichnis zu kopieren.

Ein solcher Schalter ist natürlich für jeden Testläufer anders.

Haben Sie in Erwägung gezogen, Ihre XML-Daten als Ressourcen in Ihre Testassembly einzubetten?


Ich verwende dies, um den Pfad zum Bin Directory zu erhalten:

var i = Environment.CurrentDirectory.LastIndexOf(@"\");
var path = Environment.CurrentDirectory.Substring(0,i); 

Du bekommst dieses Ergebnis:

"c: \ Benutzer \ ricooley \ Dokumente \ Visual Studio 2010 \ Projekte \ Windows_Test_Project \ Windows_Test_Project \ bin"


In einer Windows-Formular-App können Sie einfach Application.StartupPath

aber für DLLs und Konsolen-Apps ist der Code viel schwerer zu merken ...

string slash = Path.DirectorySeparatorChar.ToString();
string root = Path.GetDirectoryName(System.Reflection.Assembly.GetExecutingAssembly().Location);

root += slash;
string settingsIni = root + "settings.ini"

Internetanwendung?

Server.MapPath("~/MyDir/MyFile.ext")

So einfach ist das:

var dir = AppDomain.CurrentDomain.BaseDirectory;

Soweit ich das beurteilen kann, haben die meisten anderen Antworten ein paar Probleme.

Die richtige Methode für eine datenträgerbasierte (im Gegensatz zu webbasierter) nicht GACed-Assembly besteht darin, die CodeBase Eigenschaft der aktuell ausgeführten Assembly zu CodeBase .

Dies gibt eine URL ( file:// ) zurück. Anstatt mit String-Manipulation oder UnescapeDataString , kann dies mit minimalem LocalPath konvertiert werden, indem die LocalPath Eigenschaft von Uri .

var codeBaseUrl = Assembly.GetExecutingAssembly().CodeBase;
var filePathToCodeBase = new Uri(codeBaseUrl).LocalPath;
var directoryPath = Path.GetDirectoryName(filePathToCodeBase);

Wie Johns Antwort, aber eine etwas weniger ausführliche Erweiterungsmethode.

public static string GetDirectoryPath(this Assembly assembly)
{
    string filePath = new Uri(assembly.CodeBase).LocalPath;
    return Path.GetDirectoryName(filePath);            
}

Jetzt können Sie tun:

var localDir = Assembly.GetExecutingAssembly().GetDirectoryPath();

oder wenn Sie bevorzugen:

var localDir = typeof(DaoTests).Assembly.GetDirectoryPath();

Wie wäre es damit ...

string ThisdllDirectory = System.IO.Path.GetDirectoryName(System.Reflection.Assembly.GetExecutingAssembly().Location);

Dann hack einfach was du nicht brauchst


string path = Path.GetDirectoryName(typeof(DaoTests).Module.FullyQualifiedName);

var assembly = System.Reflection.Assembly.GetExecutingAssembly();
var assemblyPath = assembly.GetFiles()[0].Name;
var assemblyDir = System.IO.Path.GetDirectoryName(assemblyPath);




reflection