WPF 응용 프로그램에서 응용 프로그램 디렉토리 가져 오기


170

AppDomain을 사용하여 Windows Forms에 대한 솔루션을 찾았지만 WPF Application객체 와 동등한 솔루션은 무엇 입니까?

답변:


329

한 가지 방법 :

System.AppDomain.CurrentDomain.BaseDirectory

다른 방법은 다음과 같습니다.

System.IO.Path.GetDirectoryName(System.Diagnostics.Process.GetCurrentProcess().MainModule.FileName)

아 고마워 어떻게 든 AppDomain을 간과 했어야합니다. 나는 실제로 그것을 찾고 있었다.
Joey

3
@Helen : upvotes에서 판단 할 때, 이것은 분명히 훌륭한 답변입니다. 그러나 대답에는 앱 디렉토리를 얻는 두 가지 방법이 있습니다. 둘 다 똑같이 잘 작동합니까?
Christoffer Lette

21
첫 번째 대안을 사용하겠습니다. 더 단순 해 보이고 메서드 호출이 없으며 실제로 읽을 때 행이하는 일에 대해 의심을 덜 일으 킵니다.
Filip

3
WCF 서비스, WPF 응용 프로그램 및 클래스 라이브러리 프로젝트에서 첫 번째 방법을 사용했으며 모두 잘 작동했습니다.
Apostrofix

1
AppDomain을 2.0에서 추가되었다 항상 예상대로 설정 할 수 없기 때문에 NetCore 및 NetStandard, 나는, 두 번째를 추천 할 것입니다
cdie

28

여기 또 다른 것이 있습니다 :

System.Reflection.Assembly.GetExecutingAssembly().Location

2
이것은 문서에 명시된 바와 같이 섀도 복사 후 위치를 가져옵니다 . 수락 된 답변의 제안이 그림자 복사의 영향을 받는지 실제로 확실하지 않습니다.
Christoffer Lette

2
이것은 주 프로그램 디렉토리가 아닌 내가 호출 한 DLL의 하위 디렉토리를 제공했습니다.
strattonn

7

명령 행 인수의 첫 번째 인수를 사용할 수도 있습니다.

String exePath = System.Environment.GetCommandLineArgs()[0]


1
그러나 "악한"응용 프로그램은 명령 줄 인수를 수정할 수 있습니다.
다니엘 로즈

@ 다니엘 : 왜 그렇게할까요? 아니면 다른 응용 프로그램을 의미합니까?
Merlyn Morgan-Graham

1
@Merlyn : blogs.msdn.com/b/oldnewthing/archive/2009/11/25/9928372.aspx 참조 인용 하겠습니다 : "프로세스 시작 코드에 대해 편리하게 초기화 된 매개 변수"입니다. 따라서 의도적으로 또는 실수로 해당 메모리 위치를 수정할 수 있습니다.
Daniel Rose

1
@ 다니엘 : 누가 할 수 있습니까? 다른 프로세스 또는 동일한 프로세스? 발로 몸을 쏠 경우 추적하기 쉬워야합니다. 나는 그것을 덜 악하고 더 멍청하다고 부릅니다. 다른 프로세스가 그것을 할 수 있다면, 그것은 더 흥미 롭습니다. 편집 : 나는이 기사에서 실행중인 프로그램의 명령 줄을 수정하는 것에 대해 아무것도 보지 못했습니다. 시작 프로세스가 그것을 전달한다는 것만 시작합니다 (시작 프로세스가 명령 줄을 변경하는 것이 바람직하지 않은지 확실하지 않음) WMI를 통해.
Merlyn Morgan-Graham

@ MerlynMorgan-Graham 악의적 인 응용 프로그램은 메모리 주소를 수정하여 응용 프로그램이 다른 악의 응용 프로그램을 대신 실행하도록 할 수 있습니다. 그들의 응용 프로그램이 키로거이고 다른 응용 프로그램을 열 자마자 활성화되기를 원하기 때문에 이것은 악한 일입니다. 따라서 코드에서 애플리케이션 이름을 캡처하고 백그라운드에서 키로거를 실행 한 다음 애플리케이션을 실행합니다. 사용자는 단서가 없습니다. 이 기사에서는이를 설명하지만 그 방법을 알려주지는 않습니다. 아마 그게 당신이 찾고 있었던 것입니까?
pqsk 2016 년

6

나는 간단하게 string baseDir = Environment.CurrentDirectory;그 작업을 사용 했다.

행운을 빕니다

편집하다:

나는이 유형의 실수를 삭제하는 데 사용했지만이 답변의 마이너스 포인트가 사람들이 잘못된 방법을 아는 데 도움이된다고 생각하기 때문에 편집하는 것을 선호합니다. :) 위의 솔루션이 유용하지 않다는 것을 이해했으며 string appBaseDir = System.AppDomain.CurrentDomain.BaseDirectory; 다른 방법으로 변경했습니다 .

1. string baseDir =   
    System.IO.Path.GetDirectoryName(System.Reflection.Assembly.GetExecutingAssembly().Location);
 2. String exePath = System.Environment.GetCommandLineArgs()[0];
 3. string appBaseDir =    System.IO.Path.GetDirectoryName
    (System.Diagnostics.Process.GetCurrentProcess().MainModule.FileName);

행운을 빕니다


3
이것이 현재 작업 디렉토리입니다. 그것은 수 있습니다 응용 프로그램 디렉토리에 conincide 그러나 그 별도의 개념이다 (그리고 공통 파일 대화 상자가 열려 있던 경우에 가장 중요한 작업 디렉토리는, 예를 변경할 수 있습니다).
Joey

1
@ 조이 당신이 맞아요. 이것을 다음과 같이 변경했습니다. string appBaseDir = System.AppDomain.CurrentDomain.BaseDirectory; 감사.
QMaster

3
String exePath = System.Reflection.Assembly.GetExecutingAssembly().GetModules()[0].FullyQualifiedName;
 string dir = Path.GetDirectoryName(exePath);

이 시도!


3

이 시도. 잊지 마세요 using System.Reflection.

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

1

나는 이것을 시도했다 :

    label1.Content = Directory.GetCurrentDirectory();

디렉토리도 얻으십시오.


현재 작업 디렉토리를 가져 오며 프로세스 디렉토리와 다를 수 있습니다.
Thraka

Directory.GetCurrentDirectory ()를 평가해야한다고 생각합니다. 더. @Thraka에게 감사드립니다.
paul

0

System.Windows.Forms에서 자유롭게 Application.StartupPath를 사용할 수도 있지만 System.Windows.Forms 어셈블리에 대한 참조를 추가해야합니다!

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.