Kaip gauti kūrimo kelią, kuriame yra kodas?

Ar yra būdas gauti kelią į surinkimą, kuriame yra dabartinis kodas? Man nereikia skambinančiojo susirinkimo kelio, tik tas, kuriame yra kodas.

Iš esmės, mano vieneto testas turėtų perskaityti kai kuriuos testo xml failus, susijusius su dll. Noriu, kad kelias visada būtų teisingai išspręstas, neatsižvelgiant į tai, ar bandymo dll paleidžiamas iš TestDriven.NET, MBUnit GUI ar kažko kito.

Keisti . Žmonės, atrodo, nesupranta, ką prašau.

Mano bandymų biblioteka yra skyriuje

C: Projektai Mano taikomosios programos datos Įrašai Debug dotests.dll

ir norėčiau gauti tokį būdą:

C: Projektai Mano taikomosios programos datos

Trys sakiniai vis dar neveiks, kai paleisiu iš MbUnit Gui:

  • Environment.CurrentDirectory suteikia c: Failų failai MbUnit

  • System.Reflection.Assembly.GetAssembly(typeof(DaoTests)).Location suteikia C: Dokumentai ir nustatymai George Vietiniai nustatymai Temp ... DaTests.dll

  • System.Reflection.Assembly.GetExecutingAssembly().Location suteikia tą patį kaip ir ankstesnis.

584
09 сент. nustatė George Mauer 09 rugsėjis 2008-09-09 23:12 '08 at 11:12 2008-09-09 23:12
@ 25 atsakymai

Apibrėžiau šią savybę, nes ji dažnai naudojama vienetų testavimui.

 public static string AssemblyDirectory { get { string codeBase = Assembly.GetExecutingAssembly().CodeBase; UriBuilder uri = new UriBuilder(codeBase); string path = Uri.UnescapeDataString(uri.Path); return Path.GetDirectoryName(path); } } 

Assembly.Location Vietos nuosavybė kartais suteikia jums šiek tiek juokingų rezultatų, kai naudojate NUnit (kai sąrankos veikia iš laikino aplanko), todėl aš norėčiau naudoti CodeBase , kuri suteikia jums kelią URI formatu, tada UriBuild.UnescapeDataString pašalina File:// pradžioje ir GetDirectoryName pakeitimus jį įprasta „Windows“ formato forma.

807
12 нояб. John Sibly atsakymas, lapkričio 12 d. 2008-11-12 16:24 '08 at 4:24 pm 2008-11-12 16:24

Ar tai padeda?

border=0
 //get the full location of the assembly with DaoTests in it string fullPath = System.Reflection.Assembly.GetAssembly(typeof(DaoTests)).Location; //get the folder that in string theDirectory = Path.GetDirectoryName( fullPath ); 
260
10 сент. Atsakymas, kurį pateikė Keith Sep 10 2008-09-10 00:26 '08 12:26 am. 2008-09-10 00:26

Tai taip paprasta:

 var dir = AppDomain.CurrentDomain.BaseDirectory; 
255
22 мая '10 в 12:14 2010-05-22 12:14 atsakymą pateikė Jalal El-Shaer , gegužės 22 d., 10 val. 12:14 2010-05-22 12:14

Tas pats kaip ir Johno atsakymas, bet šiek tiek mažiau išsamus pratęsimo metodas.

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

Dabar galite padaryti:

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

arba jei norite:

 var localDir = typeof(DaoTests).Assembly.GetDirectoryPath(); 
60
02 апр. atsakymą pateikė Sneal 02 balandžio. 2010-04-02 17:43 '10, 5:43 val. 2010-04-02 17:43

Vienintelis sprendimas, kuris naudojo mane naudodamas „CodeBase“ ir „UNC Network“ akcijas:

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

Jis taip pat dirba su reguliariais URI.

41
16 марта '12 в 15:40 2012-03-16 15:40 Atsakymas, kurį pateikė Ignacio Soler Garcia , kovo 16 d., 15 val. 15:40 2012-03-16 15:40

Tai turėtų veikti, jei surinkimas nėra kopijuojamas šešėlio kopija:

 string path = System.Reflection.Assembly.GetExecutingAssembly().Location 
30
09 сент. atsakymą pateikė jodonnell 09 rugsėjis 2008-09-09 23:14 '08 at 11:14 2008-09-09 23:14

Kaip apie tai:

 System.IO.Path.GetDirectoryName(System.Reflection.Assembly.GetExecutingAssembly().Location); 
11
10 сент. atsakymas duotas huseyint 10 rugsėjis 2008-09-10 00:40 '08 0:40 2008-09-10 00:40

Įtariu, kad tikroji problema yra ta, kad jūsų bandymo bėgikas nukopijuoja jūsų pastatą į kitą vietą. Veikimo metu nėra galimybės nurodyti, iš kurios kopijos buvo surinkta, bet tikriausiai galite perjungti jungiklį ir pasakyti testo bėgikui, kad jis vykdo surinkimą, kur jis yra, o ne nukopijuokite jį į šešėlių katalogą.

Toks jungiklis, žinoma, gali būti skirtingas kiekvienam bandomam asmeniui.

Ar manėte, kad įterpti savo XML duomenis į bandymus?

10
10 сент. Curt Hagenlocher atsakymas 2008-09-10 00:36 '08 0:36 2008-09-10 00:36
 AppDomain.CurrentDomain.BaseDirectory 

veikia su MbUnit GUI.

9
16 июня '10 в 11:07 2010-06-16 11:07 atsakymą pateikė vartotojo368021 birželio 16 d. 11:07 2010-06-16 11:07

Čia yra VB.NET kodo kodas John Siblis. „Visual Basic“ nėra didžiosios ir mažosios raidės, todėl keli jo kintamieji pavadinimai susidūrė su tipo pavadinimais.

 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 
7
19 мая '09 в 21:58 2009-05-19 21:58 atsakė Mike Schall gegužės 19 d. 09:21 val. 2009-05-19 21:58

Vietoj vietovės naudoju Assembly.CodeBase

 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("/", "\\"); 

Jis dirbo, bet nesu įsitikinęs, ar jis yra 100% teisus. Http://blogs.msdn.com/suzcook/archive/2003/06/26/assembly-codebase-vs-assembly-location.aspx sakoma:

„CodeBase yra vietos, kurioje buvo rastas failas, URL, o vieta yra kelias, kuriuo jis buvo atsisiunčiamas. Pavyzdžiui, jei surinkimas buvo atsisiunčiamas iš interneto, jo CodeBase gali prasidėti http: //, bet jo vieta Jei failas buvo nukopijuotas su bakstelėjimu, tada vieta bus kelias į failo kopiją šešėlinio kopijavimo kataloge. Taip pat gerai žinoti, kad „CodeBase“ nėra garantuota GAC ​​rinkiniams, tačiau vieta visada bus nustatyta pakrautoms sąrankoms iš disko.

Vietoj vietovės galite naudoti „CodeBase“.

6
10 сент. Atsakymas dan gibson 10 rugsėjis 2008-09-10 00:50 '08 0:50 2008-09-10 00:50

Kiek galiu pasakyti, dauguma kitų atsakymų turi keletą problemų.

Tinkamas būdas tai padaryti diskui (kitaip nei žiniatinklyje), išskyrus GACed, yra naudoti šiuo metu veikiančią CodeBase surinkimo savybę.

Grąžina URL ( file:// ). Vietoj to, kad su jais UnescapeDataString su UnescapeDataString manipuliacijomis ar UnescapeDataString , tai galima konvertuoti naudojant minimalų LocalPath naudojant „ Uri LocalPath savybę.

 var codeBaseUrl = Assembly.GetExecutingAssembly().CodeBase; var filePathToCodeBase = new Uri(codeBaseUrl).LocalPath; var directoryPath = Path.GetDirectoryName(filePathToCodeBase); 
5
16 июня '14 в 21:13 2014-06-16 21:13 atsakymas pateikiamas Spender 16 birželio 14 d. 21:13 2014-06-16 21:13

Visais šiais metais niekas to nepaminėjo. Trickas, kurį aš sužinojau iš nuostabaus projekto „Patvirtinti testai“ . Triukas yra tai, kad naudojate statymo debug informaciją, kad rastumėte šaltinio katalogą.

Tai neveiks RELEASE režimu nei su įgalintais optimizavimais, nei su kita mašina, nei ji buvo sudaryta.

Bet tai suteiks jums kelius, kurie yra susiję su šaltinio kodo failo vieta, iš kurios skambinate

 public static class PathUtilities { public static string GetAdjacentFile(string relativePath) { return GetDirectoryForCaller(1) + relativePath; } public static string GetDirectoryForCaller() { return GetDirectoryForCaller(1); } public static string GetDirectoryForCaller(int callerStackDepth) { var stackFrame = new StackTrace(true).GetFrame(callerStackDepth + 1); return GetDirectoryForStackFrame(stackFrame); } public static string GetDirectoryForStackFrame(StackFrame stackFrame) { return new FileInfo(stackFrame.GetFileName()).Directory.FullName + Path.DirectorySeparatorChar; } } 
5
30 сент. George Mauer atsakymas rugsėjo 30 d 2015-09-30 18:27 '15 , 18:27 2015-09-30 18:27

Dabartinis katalogas, kuriame esate.

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

Jei nukopijuosite .xml failą su surinkimu, turėtumėte jį rasti.

arba

 System.Reflection.Assembly assembly = System.Reflection.Assembly.GetAssembly(typeof(SomeObject)); // The location of the Assembly assembly.Location; 
5
09 сент. Atsakyti David Basarab 09 rugsėjis 2008-09-09 23:16 '08, 23:16, 2008-09-09 23:16
 var assembly = System.Reflection.Assembly.GetExecutingAssembly(); var assemblyPath = assembly.GetFiles()[0].Name; var assemblyDir = System.IO.Path.GetDirectoryName(assemblyPath); 
3
10 сент. Mark Cidade atsakymas rugsėjo 10 d 2008-09-10 00:32 '08 0:32 2008-09-10 00:32

Galite gauti kelią į „AppDomain.CurrentDomain.RelativeSearchPath“

1
22 апр. atsakymas pateikiamas sumitup 22 balandžio. 2016-04-22 16:19 '16, 16:19 pm 2016-04-22 16:19
 string path = Path.GetDirectoryName(typeof(DaoTests).Module.FullyQualifiedName); 
1
10 сент. Atsakymą pateikė Jesse C. Slicer . 2008-09-10 00:46 '08, 12:46 val. 2008-09-10 00:46

Kaip apie tai ...

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

Tada tiesiog nulaužkite tai, ko jums nereikia

1
30 авг. Atsakyti David C Fuchs rugpjūčio 30 d 2016-08-30 01:37 '16 at 1:37 2016-08-30 01:37

Štai ką aš atėjau. Tarp interneto projektų, vieneto testų (nunit ir resharper testo bėgikas) ; Man tai teko dirbti.

Ieškojau kodo, kad galėčiau nustatyti konfigūraciją, kurioje yra surinkimas, Debug/Release/CustomName . Deja, #if DEBUG . Todėl, jei kas nors gali ją pagerinti!

Nesivaržykite redaguoti ir tobulinti.

Programos aplanko gavimas . Naudinga žiniatinklio šaknims, atleistoms, norint gauti bandomųjų failų aplanką.

 public static string AppPath { get { DirectoryInfo appPath = new DirectoryInfo(AppDomain.CurrentDomain.BaseDirectory); while (appPath.FullName.Contains(@"\bin\", StringComparison.CurrentCultureIgnoreCase) || appPath.FullName.EndsWith(@"\bin", StringComparison.CurrentCultureIgnoreCase)) { appPath = appPath.Parent; } return appPath.FullName; } } 

Dėžutės aplanko gavimas : naudinga surinkti naudojant atspindį. Jei failai nukopijuojami dėl pastatų savybių.

 public static string BinPath { get { string binPath = AppDomain.CurrentDomain.BaseDirectory; if (!binPath.Contains(@"\bin\", StringComparison.CurrentCultureIgnoreCase)  !binPath.EndsWith(@"\bin", StringComparison.CurrentCultureIgnoreCase)) { binPath = Path.Combine(binPath, "bin"); //-- Please improve this if there is a better way //-- Also note that apps like webapps do not have a debug or release folder. So we would just return bin. #if DEBUG if (Directory.Exists(Path.Combine(binPath, "Debug"))) binPath = Path.Combine(binPath, "Debug"); #else if (Directory.Exists(Path.Combine(binPath, "Release"))) binPath = Path.Combine(binPath, "Release"); #endif } return binPath; } } 
0
03 июля '13 в 8:20 2013-07-03 08:20 atsakymas duotas Valamoje - AUS liepos 03 d. 13 val. 2013-07-03 08:20

Tai turėtų veikti:

 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"); 

Aš naudoju tai dislokuoti DLL failų bibliotekas kartu su kai kuriais konfigūracijos failais (būtina naudoti log4net iš DLL failo).

0
12 июня '13 в 11:04 2013-06-12 11:04 atsakymas pateikiamas mmmmmm 12 birželio 13 d. 11:04 2013-06-12 11:04

Anksčiau buvau toks pat elgesys NUnit . Pagal numatytuosius nustatymus, „ NUnit nukopijuoja jūsų pastatą į temp katalogą. Šį elgesį galite pakeisti NUnit nustatymuose:

2019

30 сент. Atsakymą pateikė Andrey Bushman 30 rugsėjis 2015-09-30 12:55 '15 at 12:55 2015-09-30 12:55

Visi siūlomi atsakymai veikia, kai kūrėjas gali pakeisti kodą, kad įtrauktų norimą fragmentą, tačiau jei norite tai padaryti nekeičiant kodo, galite naudoti „Process Explorer“.

Jis parodys visus vykdomuosius DLL sistemoje, jums gali tekti nustatyti jūsų vykdomos programos proceso ID, tačiau tai paprastai nėra taip sunku.

Aš parašiau išsamų aprašymą, kaip tai padaryti dll viduje II - http://nodogmablog.bryanhogan.net/2016/09/locating-and-checking-an-executing-dll-on-a-running-web-server/

0
17 сент. Atsakymą pateikė Bryan 17 sep. 2016-09-17 19:24 '16 ne 19:24 2016-09-17 19:24

Radau, kad mano sprendimas yra tinkamas rasti vietą.

 var executingAssembly = new FileInfo((Assembly.GetExecutingAssembly().Location)).Directory.FullName; 
0
23 сент. Atsakymą pateikė Tez Wingfield 23 rugsėjis. 2015-09-23 14:54 '15, 14:54, 2015-09-23 14:54

Naudoju tai noriu gauti kelią į „Bin“ katalogą:

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

Jūs gausite šį rezultatą:

"c: vartotojai ricooley dokumentai" studija "2010" projektai Windows_Test_Project Windows_Test_Project

-2
21 дек. atsakymą pateikė rcooley56 21 dec. 2011-12-21 21:00 '11 21:00 val. 2011-12-21 21:00

Interneto programa?

 Server.MapPath("~/MyDir/MyFile.ext") 
-3
18 июня '14 в 13:34 2014-06-18 13:34 atsakymas pateiktas vartotojo2009677 birželio 18 d. 14 val. 13:34 2014-06-18 13:34

Kiti klausimai apie tags arba Ask a question