코드가있는 어셈블리의 경로는 어떻게 얻습니까?


781

현재 코드가있는 어셈블리의 경로를 얻는 방법이 있습니까? 호출 어셈블리의 경로를 원하지 않고 코드를 포함하는 경로 만 원합니다.

기본적으로 단위 테스트는 dll과 관련된 xml 테스트 파일을 읽어야합니다. 테스트 dll이 TestDriven.NET, MbUnit GUI 또는 기타에서 실행되는지 여부에 관계없이 항상 경로가 올바르게 해결되기를 원합니다.

편집 : 사람들은 내가 요구하는 것을 오해하는 것 같습니다.

내 테스트 라이브러리는

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

이 길을 가고 싶습니다 :

C : \ 프로젝트 \ myapplication \ daotests \ bin \ 디버그 \

MbUnit Gui에서 실행할 때 지금까지 세 가지 제안이 실패합니다.

  • Environment.CurrentDirectory 제공 \ 프로그램 파일 \ MbUnit에 C :

  • System.Reflection.Assembly.GetAssembly(typeof(DaoTests)).Location 제공 \ 문서 및 설정 \ 조지 \ 로컬 설정 \ 임시 \ .... \ DaoTests.dll : C

  • System.Reflection.Assembly.GetExecutingAssembly().Location 이전과 동일합니다.


102
이것이 당신의 해결책입니다 : var dir = AppDomain.CurrentDomain.BaseDirectory;
— Jalal El-Shaer

7
이것이 허용되는 솔루션이어야합니다. AppDomain.CurrentDomain.BaseDirectory가 올바른 방법입니다.
— aBetterGamer 2016 년

관련 참조 : find-my-
— main-

2
나는 pacakge 디렉토리에서 JSON 파일을 읽는 너겟 패키지에 대한 솔루션을 찾고 여기에 왔습니다. 너겟 패키지가 실행될 때 "AppDomain.CurrentDomain.BaseDirectory"는 너겟 패키지 디렉토리가 아니라 실행중인 프로젝트 디렉토리를 가리키는 것으로 보인다. 이들 중 어느 것도 너겟 패키지 디렉토리를 올바르게 목표로하는 것 같지 않습니다.
— Lucas

@Lucas 아니오 그것은이 질문에 관한 것이 아니기 때문에 아닙니다. (실제로 질문을 받았을 때, nuget이 존재하지 않았습니다)-새로운 질문을 시작하고 저를 ping하십시오. 그러나 지금 당신에게 말할 수 있습니다. 대부분의 경우 불가능합니다. 대부분의 프로젝트에서 너겟 디렉토리는 packagessln 파일 옆에 있습니다. 그러나 컴파일하고 배포 할 때 sln 파일과 패키지 디렉토리가 없습니다. 컴파일하는 동안 필요한 것 (모두는 아님)이 bin 디렉토리에 복사됩니다. 가장 좋은 방법은 포스트 빌드 스크립트를 사용하여 원하는 파일을 복사하는 것입니다.
— George Mauer

답변:


1036

단위 테스트에서이 속성을 자주 사용하므로 다음 속성을 정의했습니다.

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(어셈블리는 임시 폴더에서 실행) NUnit과를 사용하는 경우 속성은 가끔 사용하는 것을 선호하므로, 몇 가지 재미있는 결과를 제공합니다 CodeBase당신에게 URI 형식으로 경로를 제공하고 UriBuild.UnescapeDataString을 제거 File://처음에, 그리고 GetDirectoryName일반적인 윈도우 형식으로 변경 .


29
디렉토리 이름이 c : \ My % 20Directory 인 경우 Uri.UnescapeDataString은 다음을 반환합니다. c : \ My Directory 이는 File.Exists ( "c : \ My Directory \ MyFile.txt ")는 올바른 경로가 실제로"c : \ My % 20Directory \ MyFile.txt "이므로 false를 반환합니다. SVN 경로에 공백이 있고 체크 아웃하면 공백을 인코딩 하므로이 문제가 발생했습니다.
— row1

5
이 메소드를 사용하여 File.Exist ()를 확인할 때이 메소드는 UNC 경로에서 false를 리턴하므로주의하십시오. @Keith의 대답을 대신 사용하십시오.
— AZ.

3
공개하기 전에 정적 인 것을 넣을 수 있다는 것을 몰랐습니다. 알아
— 두면 좋으며

5
참고 : 네트워크 위치에서는 작동하지 않습니다 (예 : \\ REMOT_EPC \ Folder)
— Muxa

5
또한 디렉토리에 숫자 기호 '#'이 있으면 작동하지 않습니다. Windows의 디렉토리 및 파일 이름에는 숫자 기호가 허용됩니다.
— Huemac

321

도움이 되나요?

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

내 편집 내용을 참조하십시오. 그렇지 않습니다 .MbUnit이 어떻게 작동하는지 이상한 것입니까?
— George Mauer

3
xml 파일을 컨텐츠로 설정하고 dll 또는 리소스와 함께 dll에서 읽습니다.
— Keith

22
아니면 그냥typeof(DaoTests).Assembly
— SLaks

4
@SLaks @JohnySkovdal @Keith : 안녕하세요, 여러분 Assembly.GetExecutingAssembly(). 이것은 "현재 실행되는 코드를 포함하는 어셈블리 얻는다" (방법을 설명으로부터). 내 AddIn " EntitiesToDTOs " 에서 이것을 사용합니다 . 실제 예는 AssemblyHelper.cs 를 참조하십시오 .
— kzfabi 2016 년

4
@John Silby가 UNC 경로에서 작동하지 않는 것처럼 보이기 때문에 게시물에 문제가 있습니다 (예 : \\ Server \ Folder \ File.ext). 이것은 트릭을 수행했습니다. +1
— 블루 베리

312

다음과 같이 간단합니다.

var dir = AppDomain.CurrentDomain.BaseDirectory;

11
이것이 허용되는 솔루션이어야합니다. AppDomain.CurrentDomain.BaseDirectory가 올바른 방법입니다.
— aBetterGamer 2016 년

5
이 문제에 대해 다시 한 번 관심을 가져 주셔서 감사합니다. 질문을했을 당시에 사용 가능한지 확실하지 않지만 지금은 가능합니다.
— George Mauer

120
아니요, 잘못되었습니다. 현재 실행중인 코드가 아닌 ORIGINAL ENTRY POINT의 경로를 반환합니다. 다른 경로에서 수동으로 어셈블리를로드했거나 GAC에서로드 한 경우 잘못된 결과가 반환됩니다. 이 답변은 맞습니다 : stackoverflow.com/a/283917/243557 Quicker still is Path.GetDirectoryName(Assembly.GetExecutingAssembly().Location).
— nathanchere

9
실제로 이것은 웹 응용 프로그램에서는 작동하지 않지만 모든 유형의 응용 프로그램에서 다음과 같은 기능 보강이 작동한다는 것을 알았습니다.AppDomain.CurrentDomain.RelativeSearchPath ?? AppDomain.CurrentDomain.BaseDirectory
— Ilya Chernomordik

4
테스트 어셈블리의 원래 bin 경로를 가져 오려는 경우 (예 : 하위 폴더의 보조 데이터 파일에 도달하려는 경우) 단위 테스트에 적합합니다. 테스트 어셈블리는 코드의 진입 점입니다.
— MarioDS

68

John의 대답과 동일하지만 약간 덜 장황한 확장 방법입니다.

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

이제 할 수있는 일 :

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

또는 원하는 경우 :

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

6
당신은 assembly대신에 의미 했습니까 Assembly.GetExecutingAssembly()?
— Dude Pascalou

3
Dude가 지적한 것처럼, 당신은 인수를 전달하고 그것을 사용하지 못했습니다.
— Chris Moschini

4
이 답변은 당면한 질문에 대한 명백한 잘못입니다. 이 답변의 수정 된 버전은 주어진 어셈블리의 경로를 제공 할 수 있습니다. 그러나 여기서는 실행 어셈블리를 구체적으로 찾고 있으므로 어셈블리 전달은 의미가 없습니다. 확장 방법은 작업에 잘못된 도구입니다.
— Edward Brey

46

CodeBase 및 UNC 네트워크 공유를 사용할 때 나를 위해 일한 유일한 솔루션은 다음과 같습니다.

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

일반 URI에서도 작동합니다.


5
이것이 정답입니다. 기본 코드베이스가 UNC 공유를 올바르게 처리하지 못한다는 것은 정말 성가신 일입니다.
— Daniel Gilbert

폴더에 공백이 있고 신이 다른 문자를 알면 충돌이 발생합니다.
— MarioDS

1
나는이 많이 사용하고 발견 한 하나의 실패 어디 시나리오 : 코드 자체의이 행이 다음 응용 프로그램에서 사용하는 NuGet 패키지의 일부인 경우! 로 교체 GetExecutingAssembly()하여 해당 시나리오도 지원할 수 있습니다 GetCallingAssembly().
— Timo

@Timo :이 변경에 부작용이 있는지 확인 했습니까? 그렇다면 수정 사항을 포함하도록 답변을 편집하십시오.
— Ignacio Soler Garcia

@IgnacioSolerGarcia 슬프게도 한 계층 깊이에서만 작동한다고보고해야합니다. 즉, NuGet 패키지가 다른 NuGet 패키지에 의해 호출되면 실패합니다! 나는 이것을 이것을 사용하고있다 (Chernomordik 의이 페이지의 주석에서) : AppDomain.CurrentDomain.RelativeSearchPath ?? AppDomain.CurrentDomain.BaseDirectory. 첫 번째 부분은 웹 응용 프로그램을위한 것이고 두 번째 부분은 다른 응용 프로그램을위한 것입니다.
— Timo

32

어셈블리가 섀도 복사 되지 않는 한 작동합니다 .

string path = System.Reflection.Assembly.GetExecutingAssembly().Location

14

이건 어때?

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

11

여기서 실제 문제는 테스트 러너가 어셈블리를 다른 위치로 복사하는 것입니다. 런타임에 어셈블리가 어디에서 복사되었는지 알 수있는 방법은 없지만 테스트 러너에게 어셈블리를 현재 위치에서 실행하고 그림자 디렉토리로 복사하지 않도록 스위치를 전환 할 수 있습니다.

물론 이러한 스위치는 테스트 러너마다 다를 수 있습니다.

XML 데이터를 테스트 어셈블리 내에 리소스로 포함시키는 것을 고려 했습니까?


섀도 복사 문제를 지적하면 +1 그러나에서에서 원래 위치를 확인할 수 있습니다 Assembly.CodeBase.
— tm1

11
AppDomain.CurrentDomain.BaseDirectory

MbUnit GUI와 함께 작동합니다.


이것은 asp.net 웹 앱에서 루트 디렉토리에 상대적인 파일을 작성하는 데
— 효과적이었습니다

나는 이것이 가장 일반적으로 작동한다는 것을 알았습니다. 확실하지 않은 경우 선택하십시오.
— Erik Bergstedt

10

나는 이것이 모든 종류의 응용 프로그램에서 작동 할 것이라고 믿습니다.

AppDomain.CurrentDomain.RelativeSearchPath ?? AppDomain.CurrentDomain.BaseDirectory

1
필자의 실험은 웹 및 콘솔 응용 프로그램뿐만 아니라 단위 테스트 및 NuGet 패키지 (모든 수준의 재귀로 인한 호출)를 다루는 가장 확실한 대답임을 보여줍니다.
— Timo

8

내가 알 수있는 한, 다른 답변의 대부분에는 몇 가지 문제가 있습니다.

웹 기반이 아닌 디스크 기반 (GAC 기반이 아닌) 어셈블리 에 대해이 작업을 수행하는 올바른 방법 은 현재 실행중인 어셈블리의 CodeBase속성 을 사용하는 것 입니다.

URL ( file://)을 반환합니다 . 문자열 조작 이나 으로 엉망이되는 대신의 속성을 UnescapeDataString활용하여 최소한 의 혼란 으로 변환 할 수 있습니다 .LocalPathUri

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

1
경로가 포함 된 경우 작동하지 않습니다 #( EscapedCodeBase작품,하지만 경로가 포함되어있는 경우 EscapedCodeBase 일을하지 않는 예를 들어, %20축 어적 (이는 윈도우 경로에 허용되는 문자 순서)
— 마틴 바

이 코드를 NuGet 패키지에 포함 시키려면로 대체 GetExecutingAssembly()하여 해당 시나리오를 수정할 수 있습니다 GetCallingAssembly().
— Timo

8

이건 어때요 ...

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

그런 다음 필요없는 것을 해킹하십시오.


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

7

다음은 John Sibly 코드의 VB.NET 포트입니다. Visual Basic은 대소 문자를 구분하지 않으므로 변수 이름 두 개가 형식 이름과 충돌했습니다.

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

6

이 세월 동안 아무도 실제로 이것을 언급하지 않았습니다. 내가 멋진 ApprovalTests 프로젝트 에서 배운 트릭 . 비결은 어셈블리의 디버깅 정보를 사용하여 원래 디렉토리를 찾는 것입니다.

RELEASE 모드 나 최적화가 활성화 된 상태 또는 컴파일 된 컴퓨터와 다른 컴퓨터에서는 작동하지 않습니다.

그러나 이것은 당신이 그것을 호출하는 소스 코드 파일의 위치에 상대적인 경로를 얻을 것입니다

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

존재하는 현재 디렉토리.

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

빌드와 함께 .xml 파일을 복사하면 찾을 수 있습니다.

또는

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

// The location of the Assembly
assembly.Location;

어셈블리를 섀도 복사 한 경우 문제가됩니다 .
— 쓰셨

+1520! Environment.CurrentDirectoryMSBuild 작업 클래스에서 리플렉션을 사용하는 경우 실행 어셈블리가 GAC에 있고 코드가 다른 곳에 있습니다.
— vulcan raven

4
일반적으로 CurrentDirectory는 실행 파일이 어디에 있는지 알려주지 않습니다. 그것은 그것이 사용되는 것이 아닙니다. 실행 파일이있는 위치와 동일한 위치에있는 경우가 많으므로 많은 프로그래머가 그 차이를 이해하지 못합니다. 그런 다음 응용 프로그램이 CurrentDirectory의 올바른 사용을 이해하기를 기대하는 일부 최종 사용자에게 문제를 일으 킵니다.
— 벤트 트랜 버그

5

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

작동하지만 더 이상 100 % 정확하지 않습니다. http://blogs.msdn.com/suzcook/archive/2003/06/26/assembly-codebase-vs-assembly-location.aspx 의 페이지 는 다음과 같이 말합니다.

"CodeBase는 파일이있는 위치의 URL이고 Location은 실제로로드 된 경로입니다. 예를 들어, 어셈블리가 인터넷에서 다운로드 된 경우 CodeBase는"http : // "로 시작할 수 있습니다. 파일의 위치가 섀도 복사 본인 경우 위치는 섀도 복사본 디렉터리의 파일 복사본 경로가되며 CodeBase가 보장되지 않는 것도 좋습니다. 그러나 디스크에서로드 된 어셈블리에 대해서는 위치가 항상 설정됩니다. "

Location 대신 CodeBase를 사용할 수 있습니다 .


1
@ Kirkenet : URI를 경로로 변환하기위한 많은 코드. 물론 개선 될 수 있습니다. Mike Schall 또는 SoMoS의 답변을보십시오. 문자열 수준에서 URI를 변환하지 말고 대신 적절한 객체를 사용하십시오. 좋습니다. Assembly.CodeBase가 URI 또는 ​​FileInfo와 같이 더 적합한 개체 대신 문자열을 반환하는 것도 어색합니다.
— Seven

2

AppDomain.CurrentDomain.RelativeSearchPath로 bin 경로를 얻을 수 있습니다.


2

제안 된 모든 답변은 개발자가 필요한 스 니펫을 포함하도록 코드를 변경할 수있을 때 작동하지만 코드를 변경하지 않고이 작업을 수행하려는 경우 프로세스 탐색기를 사용할 수 있습니다.

시스템에서 실행중인 모든 dll을 나열합니다. 실행중인 응용 프로그램의 프로세스 ID를 결정해야 할 수도 있지만 일반적으로 그렇게 어렵지는 않습니다.

II 내부의 dll에 대해이 작업을 수행하는 방법에 대한 자세한 설명을 작성했습니다 -http://nodogmablog.bryanhogan.net/2016/09/locating-and-checking-an-executing-dll-on-a-running-web -섬기는 사람/


우선, 기사의 코드는 IIS 중심적이며 두 번째로, 현재로드 된 모든 dll을 제공하지만 한 번에 실행중인 것이 아닙니다.
— George Mauer

주어진 예제는 iis와 관련이 있지만 dll이 iis 외부의 프로세스에서 실행되는 경우 동일한 단계가 적용됩니다. 프로세스 ID를 식별하기 만하면됩니다. 참고로 기사를 업데이트하겠습니다. 제안 해 주셔서 감사합니다.
— Bryan

2

Windows Form 앱에서 간단히 사용할 수 있습니다. Application.StartupPath

그러나 DLL 및 콘솔 응용 프로그램의 경우 코드를 기억하기가 훨씬 어렵습니다 ...

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

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


1

경로에 '#'기호가 포함되어 있으면 잘못된 디렉토리가 표시됩니다. 그래서 UriBuilder.Path와 UriBuilder.Fragment 조합 인 John Sibly 답변의 수정을 사용합니다.

public static string AssemblyDirectory
{
    get
    {
        string codeBase = Assembly.GetExecutingAssembly().CodeBase;
        UriBuilder uri = new UriBuilder(codeBase);
        //modification of the John Sibly answer    
        string path = Uri.UnescapeDataString(uri.Path.Replace("/", "\\") + 
          uri.Fragment.Replace("/", "\\"));
        return Path.GetDirectoryName(path);
     }
}

0

이것이 내가 생각해 낸 것입니다. 웹 프로젝트 사이에서 단위 테스트 (nunit 및 resharper 테스트 러너) ; 나는 이것이 나를 위해 일한다는 것을 알았다.

빌드의 구성을 감지하는 코드를 찾고있었습니다 Debug/Release/CustomName. 아아, #if DEBUG. 누군가가 그것을 향상시킬 수 있다면 !

자유롭게 편집하고 개선하십시오.

앱 폴더 가져 오기 . 웹 루트에 유용합니다. unittests는 테스트 파일의 폴더를 가져옵니다.

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

bin 폴더 가져 오기 : 리플렉션을 사용하여 어셈블리를 실행하는 데 유용합니다. 빌드 특성으로 인해 파일이 복사 된 경우

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

이것은 작동해야합니다 :

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

이것을 사용하여 DLL 파일 라이브러리를 일부 구성 파일과 함께 배포하고 있습니다 (DLL 파일 내에서 log4net을 사용하는 것입니다).


fileMap여기에 무엇을 사용합니까?
— George Mauer

0

내 솔루션을 위치 검색에 적합하다고 생각합니다.

var executingAssembly = new FileInfo((Assembly.GetExecutingAssembly().Location)).Directory.FullName;

이것은 이미 최고 등급 대답 중 하나입니다 및 이 상황에서 작동하지 않는 무언가와 같은 질문에 명시 적으로 언급되어있다.
— George Mauer

사과는 반드시 놓쳤습니다! 분명히 나는 ​​철저히 읽지 않았습니다.
— Tez Wingfield

0

NUnit과거 에도 같은 행동을했습니다 . 기본적으로 NUnit어셈블리를 temp 디렉토리에 복사합니다. NUnit설정 에서이 동작을 변경할 수 있습니다 .

여기에 이미지 설명을 입력하십시오

어쩌면 TestDriven.NET및 MbUnitGUI 같은 설정이 있습니다.


-3

이것을 사용하여 Bin 디렉토리의 경로를 얻습니다.

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

이 결과를 얻습니다.

"c : \ 사용자 \ ricooley \ documents \ visual studio 2010 \ 프로젝트 \ Windows_Test_Project \ Windows_Test_Project \ bin"


6
Path.getDirectoryName을 피할 이유가 없습니다.
— Max Keller

@MaxKeller 이유가 보이지 않는다고해서 그것이 옳다는 것은 아닙니다. Path.GetDirectoryName의이 대체 방법은 10 배 더 빠릅니다.
— Ruslan Veselov

-3

웹 애플리케이션?

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

2
@christiandev 이것은 대답이지만 잘못된 질문에 대한 대답 인 것 같습니다. 질문에서 이것은 웹 응용 프로그램이 아니라 MbUnit으로 실행되는 어셈블리라는 것이 분명합니다. 그러나 Asp.Net 쉐도우 복사로 인해 대답은 실제로 정확하지 않습니다 (이 질문에 착륙 한 사람이 찾고있는 것일 수도 있음).
— George Mauer
당사 사이트를 사용함과 동시에 당사의 쿠키 정책과 개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.