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.