Czy istnieje sposób na uzyskanie ścieżki do zestawu, w którym znajduje się bieżący kod? Nie chcę ścieżki do wywołującego zestawu, tylko tego zawierającego kod.
Zasadniczo mój test jednostkowy musi odczytać niektóre pliki testowe xml, które znajdują się w stosunku do biblioteki dll. Chcę, aby ścieżka zawsze była poprawnie rozwiązywana bez względu na to, czy dll testujący jest uruchamiany z TestDriven.NET, interfejsu GUI MbUnit, czy czegoś innego.
Edycja : Ludzie wydają się nie rozumieć, o co pytam.
Moja biblioteka testów znajduje się w powiedzmy
C: \ projects \ myapplication \ daotests \ bin \ Debug \ daotests.dll
i chciałbym uzyskać tę ścieżkę:
C: \ projects \ myapplication \ daotests \ bin \ Debug \
Jak dotąd trzy sugestie mnie zawiodły, gdy uruchamiam z MbUnit Gui:
Environment.CurrentDirectory
daje c: \ Program Files \ MbUnitSystem.Reflection.Assembly.GetAssembly(typeof(DaoTests)).Location
daje C: \ Documents and Settings \ george \ Local Settings \ Temp \ .... \ DaoTests.dllSystem.Reflection.Assembly.GetExecutingAssembly().Location
daje to samo co poprzednie.
źródło
packages
obok pliku SLN. ALE podczas kompilacji i dystrybucji nie ma pliku SLN ani katalogu pakietów. Podczas kompilacji rzeczy, które są potrzebne (ale nie wszystko) są kopiowane do katalogu bin. Najlepszym rozwiązaniem jest użycie skryptu postbuild do skopiowania żądanego pliku.Odpowiedzi:
Zdefiniowałem następującą właściwość, ponieważ używamy jej często w testach jednostkowych.
Assembly.Location
Nieruchomość czasami daje jakieś zabawne rezultaty przy użyciu NUnit (gdzie zespoły uruchomić z folderu tymczasowego), więc wolę używaćCodeBase
co daje ścieżkę w formacie URI, a następnieUriBuild.UnescapeDataString
usuwaFile://
się na początku, aGetDirectoryName
zmienia go do formatu normalne okna .źródło
czy to pomaga?
źródło
typeof(DaoTests).Assembly
Assembly.GetExecutingAssembly()
. To „dostaje zespół, który zawiera kod, który jest aktualnie wykonywany” (z opisem metody). Używam tego w moich AddIn „ EntitiesToDTOs ”. Zobacz przykładowy plik AssemblyHelper.cs .To takie proste:
źródło
Path.GetDirectoryName(Assembly.GetExecutingAssembly().Location)
.AppDomain.CurrentDomain.RelativeSearchPath ?? AppDomain.CurrentDomain.BaseDirectory
Taki sam jak odpowiedź Johna, ale nieco mniej rozbudowana metoda rozszerzenia.
Teraz możesz zrobić:
lub jeśli wolisz:
źródło
assembly
zamiastAssembly.GetExecutingAssembly()
?Jedynym rozwiązaniem, które działało dla mnie podczas korzystania z CodeBase i udziałów sieciowych UNC było:
Działa również z normalnymi identyfikatorami URI.
źródło
GetExecutingAssembly()
goGetCallingAssembly()
.AppDomain.CurrentDomain.RelativeSearchPath ?? AppDomain.CurrentDomain.BaseDirectory
. Pierwsza część dotyczy aplikacji internetowych, a druga dotyczy innych aplikacji.Powinno to działać, chyba że zestaw jest kopiowany w tle :
źródło
A co z tym:
źródło
Podejrzewam, że prawdziwym problemem jest to, że Twój tester kopiuje zestaw w innym miejscu. W środowisku wykonawczym nie ma sposobu, aby dowiedzieć się, skąd zestaw został skopiowany, ale prawdopodobnie możesz przełączyć przełącznik, aby poinformować biegacza testowego, aby uruchomił zestaw z miejsca, w którym się znajduje, i nie kopiował go do katalogu cienia.
Oczywiście taka zmiana może być inna dla każdego uczestnika testu.
Czy rozważałeś osadzenie swoich danych XML jako zasobów w zestawie testowym?
źródło
Assembly.CodeBase
.współpracuje z GUI MbUnit.
źródło
Wierzę, że to zadziała dla każdego rodzaju aplikacji:
źródło
O ile wiem, większość innych odpowiedzi ma kilka problemów.
Prawidłowym sposobem na to w przypadku zestawu opartego na dysku (w przeciwieństwie do zestawu internetowego) bez GACed jest użycie właściwości aktualnie wykonywanego zestawu
CodeBase
.Zwraca URL (
file://
). Zamiast manipulować ciągami znaków lubUnescapeDataString
, można to przekonwertować przy minimalnym zamieszaniu, korzystając zLocalPath
właściwościUri
.źródło
#
(EscapedCodeBase
działa, ale EscapedCodeBase nie działa, jeśli ścieżka zawiera np.%20
Dosłownie (która jest dozwoloną sekwencją znaków w ścieżce systemu Windows)GetExecutingAssembly()
goGetCallingAssembly()
.Co powiesz na to ...
Następnie po prostu zhakuj to, czego nie potrzebujesz
źródło
źródło
Oto port VB.NET kodu Johna Sably'ego. W programie Visual Basic nie rozróżniana jest wielkość liter, więc kilka jego nazw zmiennych kolidowało z nazwami typów.
źródło
Przez te wszystkie lata nikt tak naprawdę nie wspomniał o tym. Sztuczka, której nauczyłem się z niesamowitego projektu ApprovalTests . Sztuczka polega na tym, że używasz informacji debugowania w zestawie, aby znaleźć oryginalny katalog.
Nie będzie to działać w trybie RELEASE, ani przy włączonych optymalizacjach, ani na komputerze innym niż ten, na którym został skompilowany.
Ale to da ci ścieżki, które są względne względem lokalizacji pliku kodu źródłowego, z którego go wywołujesz
źródło
Bieżący katalog, w którym istniejesz.
Jeśli skopiujesz plik .xml z kompilacją, powinieneś go znaleźć.
lub
źródło
Environment.CurrentDirectory
działa, jeśli używasz refleksji w klasie zadań MSBuild, gdzie wykonujący zestaw rezyduje w GAC, a twój kod jest gdzie indziej.Korzystałem z Assembly.CodeBase zamiast Location:
Działa, ale nie jestem już pewien, czy jest w 100% poprawny. Strona na stronie http://blogs.msdn.com/suzcook/archive/2003/06/26/assembly-codebase-vs-assembly-location.aspx mówi:
„CodeBase to adres URL miejsca, w którym plik został znaleziony, a Lokalizacja to ścieżka, w której rzeczywiście został załadowany. Na przykład, jeśli zestaw został pobrany z Internetu, jego CodeBase może zaczynać się od„ http: // ” , ale jego lokalizacja może zaczynać się od „C: \”. Jeśli plik został skopiowany w tle, lokalizacja byłaby ścieżką do kopii pliku w katalogu kopii w tle. Dobrze jest również wiedzieć, że CodeBase nie jest gwarantowana należy ustawić dla zestawów w GAC. Jednak lokalizacja będzie zawsze ustawiona dla zestawów ładowanych z dysku. ”
Ty może chcesz używać kodzie zamiast gości.
źródło
Ścieżkę do bin można uzyskać przez AppDomain.CurrentDomain.RelativeSearchPath
źródło
Wszystkie proponowane odpowiedzi działają, gdy programista może zmienić kod, tak aby zawierał wymagany fragment kodu, ale jeśli chcesz to zrobić bez zmiany kodu, możesz użyć Eksploratora procesów.
Spowoduje to wyświetlenie listy wszystkich wykonujących bibliotek DLL w systemie, może być konieczne określenie identyfikatora procesu uruchomionej aplikacji, ale zwykle nie jest to zbyt trudne.
Napisałem pełny opis tego, jak to zrobić dla biblioteki DLL wewnątrz II - http://nodogmablog.bryanhogan.net/2016/09/locating-and-checking-an-executing-dll-on-a-running-web -serwer/
źródło
w aplikacji systemu Windows można po prostu użyć
Application.StartupPath
ale w przypadku bibliotek DLL i aplikacji konsolowych kod jest znacznie trudniejszy do zapamiętania ...
źródło
źródło
Otrzymasz niepoprawny katalog, jeśli ścieżka zawiera symbol „#”. Używam więc modyfikacji odpowiedzi Johna Sible'a, która jest kombinacją UriBuilder.Path i UriBuilder.Fragment:
źródło
Właśnie to wymyśliłem. Pomiędzy projektami internetowymi, testami jednostkowymi (biegacz testowy nunit i resharper) ; Odkryłem, że to działało dla mnie.
Mam był patrząc na kod do wykrywania co konfiguracja kompilacji jest,
Debug/Release/CustomName
. Niestety,#if DEBUG
. Więc jeśli ktoś może to poprawić !Możesz edytować i ulepszać.
Pobieranie folderu aplikacji . Przydatny w przypadku katalogów internetowych, pozwala na uzyskanie folderu plików testowych.
Pobieranie folderu bin : Przydatne do wykonywania złożeń za pomocą odbicia. Jeśli pliki są tam kopiowane ze względu na właściwości kompilacji.
źródło
To powinno działać:
Używam tego do wdrażania bibliotek plików DLL wraz z niektórymi plikami konfiguracyjnymi (jest to użycie log4net z pliku DLL).
źródło
fileMap
służy tutaj?Uważam, że moje rozwiązanie jest odpowiednie do odzyskania lokalizacji.
źródło
W
NUnit
przeszłości miałem takie samo zachowanie . DomyślnieNUnit
kopiuje zestaw do katalogu tymczasowego. Możesz zmienić to zachowanie wNUnit
ustawieniach:Może
TestDriven.NET
iMbUnit
GUI mają te same ustawienia.źródło
Używam tego, aby uzyskać ścieżkę do katalogu bin:
Otrzymasz ten wynik:
źródło
Aplikacja internetowa?
źródło