Gibt es eine Möglichkeit, den Pfad für die Assembly abzurufen, 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 Unit-Test 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.
Bearbeiten : Die Leute scheinen falsch zu verstehen, was ich frage.
Meine Testbibliothek befindet sich beispielsweise in
C: \ projects \ myapplication \ daotests \ bin \ Debug \ daotests.dll
und ich möchte diesen Weg bekommen:
C: \ projects \ myapplication \ daotests \ bin \ Debug \
Die drei Vorschläge, die ich bisher gemacht habe, scheitern, wenn ich von der MbUnit Gui renne:
Environment.CurrentDirectory
gibt c: \ Programme \ MbUnitSystem.Reflection.Assembly.GetAssembly(typeof(DaoTests)).Location
gibt C: \ Dokumente und Einstellungen \ george \ Lokale Einstellungen \ Temp \ .... \ DaoTests.dllSystem.Reflection.Assembly.GetExecutingAssembly().Location
gibt das gleiche wie das vorherige.
quelle
packages
neben der SLN-Datei. ABER wenn Sie Dinge kompilieren und verteilen, gibt es keine sln-Datei und kein Paketverzeichnis. Während der Kompilierung werden die benötigten Dinge (aber nicht alles) in das bin-Verzeichnis kopiert. Am besten kopieren Sie die gewünschte Datei mit einem Postbuild-Skript.Antworten:
Ich habe die folgende Eigenschaft definiert, da wir diese häufig in Unit-Tests verwenden.
Die
Assembly.Location
Eigenschaft liefert manchmal einige lustige Ergebnisse, wenn Sie NUnit verwenden (wo Assemblys aus einem temporären Ordner ausgeführt werden). Daher bevorzuge ich die Verwendung,CodeBase
die Ihnen den Pfad im URI-Format gibt, dannUriBuild.UnescapeDataString
denFile://
am Anfang entfernt undGetDirectoryName
in das normale Windows-Format ändert .quelle
Hilft das?
quelle
typeof(DaoTests).Assembly
Assembly.GetExecutingAssembly()
. Es "ruft die Assembly ab, die den Code enthält, der gerade ausgeführt wird" (aus der Methodenbeschreibung). Ich verwende dies in meinem AddIn " EntitiesToDTOs ". Ein echtes Beispiel finden Sie unter AssemblyHelper.cs .So einfach ist das:
quelle
Path.GetDirectoryName(Assembly.GetExecutingAssembly().Location)
.AppDomain.CurrentDomain.RelativeSearchPath ?? AppDomain.CurrentDomain.BaseDirectory
Wie Johns Antwort, jedoch eine etwas weniger ausführliche Erweiterungsmethode.
Jetzt können Sie tun:
oder wenn Sie es vorziehen:
quelle
assembly
stattAssembly.GetExecutingAssembly()
?Die einzige Lösung, die bei der Verwendung von CodeBase- und UNC-Netzwerkfreigaben für mich funktioniert hat, war:
Es funktioniert auch mit normalen URIs.
quelle
GetExecutingAssembly()
durchGetCallingAssembly()
.AppDomain.CurrentDomain.RelativeSearchPath ?? AppDomain.CurrentDomain.BaseDirectory
. Der erste Teil ist für Webanwendungen und der zweite für andere Anwendungen.Dies sollte funktionieren, es sei denn, die Assembly ist schattenkopiert :
quelle
Was ist damit:
quelle
Ich vermute, dass das eigentliche Problem hier darin besteht, dass Ihr Testläufer Ihre Baugruppe an einen anderen Ort kopiert. Zur Laufzeit gibt es keine Möglichkeit festzustellen, woher die Assembly kopiert wurde, aber Sie können wahrscheinlich einen Schalter umlegen, um dem Testläufer mitzuteilen, dass die Assembly von ihrem Standort aus ausgeführt und nicht in ein Schattenverzeichnis kopiert werden soll.
Ein solcher Schalter ist natürlich wahrscheinlich für jeden Testläufer unterschiedlich.
Haben Sie darüber nachgedacht, Ihre XML-Daten als Ressourcen in Ihre Testassembly einzubetten?
quelle
Assembly.CodeBase
.funktioniert mit MbUnit GUI.
quelle
Ich glaube, das würde für jede Art von Anwendung funktionieren:
quelle
Soweit ich das beurteilen kann, haben die meisten anderen Antworten einige Probleme.
Der richtige Weg, dies für eine festplattenbasierte (im Gegensatz zu webbasierten), nicht GACed-Assembly zu tun, besteht darin, die
CodeBase
Eigenschaft der aktuell ausgeführten Assembly zu verwenden .Dies gibt eine URL (
file://
) zurück. Anstatt mit der Manipulation von Strings herumzuspielen oderUnescapeDataString
kann dies mit minimalem Aufwand konvertiert werden, indem dieLocalPath
Eigenschaft von genutzt wirdUri
.quelle
#
(EscapedCodeBase
funktioniert, aber EscapedCodeBase funktioniert nicht, wenn der Pfad z. B.%20
wörtlich enthält (was eine zulässige Zeichenfolge in einem Windows-Pfad ist)GetExecutingAssembly()
durch behebenGetCallingAssembly()
.Wie wäre es damit ...
Dann hacken Sie einfach ab, was Sie nicht brauchen
quelle
quelle
Hier ist ein VB.NET-Port von John Siblys Code. Visual Basic unterscheidet nicht zwischen Groß- und Kleinschreibung, daher kollidierten einige seiner Variablennamen mit Typnamen.
quelle
In all den Jahren hat niemand diesen tatsächlich erwähnt. Ein Trick, den ich aus dem großartigen ApprovalTests-Projekt gelernt habe . Der Trick besteht darin, dass Sie die Debugging-Informationen in der Assembly verwenden, um das ursprüngliche Verzeichnis zu finden.
Dies funktioniert weder im RELEASE-Modus noch bei aktivierten Optimierungen oder auf einem anderen Computer als dem, auf dem er kompiliert wurde.
Dadurch erhalten Sie jedoch Pfade, die sich auf den Speicherort der Quellcodedatei beziehen , aus der Sie sie aufrufen
quelle
Das aktuelle Verzeichnis, in dem Sie existieren.
Wenn Sie die XML-Datei mit Build kopieren, sollten Sie sie finden.
oder
quelle
Environment.CurrentDirectory
funktioniert, wenn Sie Reflection in der MSBuild-Taskklasse verwenden, in der sich die ausführende Assembly in GAC befindet und sich Ihr Code an einer anderen Stelle befindet.Ich habe Assembly.CodeBase anstelle von Location verwendet:
Es hat funktioniert, aber ich bin nicht mehr sicher, ob es 100% korrekt ist. Auf der Seite unter http://blogs.msdn.com/suzcook/archive/2003/06/26/assembly-codebase-vs-assembly-location.aspx heißt es:
"Die CodeBase ist eine URL zu dem Ort, an dem die Datei gefunden wurde, während der Speicherort der Pfad ist, in den sie tatsächlich geladen wurde. Wenn die Assembly beispielsweise aus dem Internet heruntergeladen wurde, beginnt ihre CodeBase möglicherweise mit" http: // ". , aber sein Speicherort kann mit "C: \" beginnen. Wenn die Datei im Schatten kopiert wurde, ist der Speicherort der Pfad zur Kopie der Datei im Schattenkopierverzeichnis. Es ist auch gut zu wissen, dass die CodeBase nicht garantiert ist Wird für Assemblys im GAC festgelegt. Der Speicherort wird jedoch immer für Assemblys festgelegt, die von der Festplatte geladen werden. "
Möglicherweise möchten Sie CodeBase anstelle von Location verwenden.
quelle
Sie können den Bin-Pfad über AppDomain.CurrentDomain.RelativeSearchPath abrufen
quelle
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 den Prozess-Explorer verwenden.
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 geschrieben, wie dies für eine DLL in II funktioniert - http://nodogmablog.bryanhogan.net/2016/09/locating-and-checking-an-executing-dll-on-a-running-web -Server/
quelle
In einer Windows Form App können Sie einfach verwenden
Application.StartupPath
Für DLLs und Konsolen-Apps ist der Code jedoch viel schwerer zu merken ...
quelle
quelle
Sie erhalten ein falsches Verzeichnis, wenn ein Pfad das Symbol '#' enthält. Daher verwende ich eine Modifikation der Antwort von John Sibly, nämlich die Kombination UriBuilder.Path und UriBuilder.Fragment:
quelle
Das habe ich mir ausgedacht. Zwischen Webprojekten Unit-Tests (Nunit und Resharper Test Runner) ; Ich fand das funktionierte für mich.
Ich habe nach Code gesucht, um festzustellen, in welcher Konfiguration sich der Build befindet
Debug/Release/CustomName
. Leider die#if DEBUG
. Also wenn jemand das verbessern kann !Fühlen Sie sich frei zu bearbeiten und zu verbessern.
App-Ordner abrufen . Nützlich für Web-Roots, Unittests, um den Ordner mit Testdateien abzurufen.
Bin-Ordner abrufen : Nützlich zum Ausführen von Assemblys mithilfe von Reflection. Wenn Dateien aufgrund von Build-Eigenschaften dorthin kopiert werden.
quelle
Das sollte funktionieren:
Ich verwende dies, um DLL-Dateibibliotheken zusammen mit einigen Konfigurationsdateien bereitzustellen (dies dient zur Verwendung von log4net aus der DLL-Datei heraus).
quelle
fileMap
hier verwendet?Ich finde meine Lösung ausreichend, um den Standort abzurufen.
quelle
Ich habe das gleiche Verhalten
NUnit
in der Vergangenheit. StandardmäßigNUnit
kopiert Ihre Assembly in das temporäre Verzeichnis. Sie können dieses Verhalten in denNUnit
Einstellungen ändern :Vielleicht
TestDriven.NET
undMbUnit
GUI haben die gleichen Einstellungen.quelle
Ich benutze dies, um den Pfad zum Bin-Verzeichnis zu erhalten:
Sie erhalten dieses Ergebnis:
quelle
Internetanwendung?
quelle