programing

현재 실행 가능한 파일 이름을 어떻게 찾습니까?

nasanasas 2020. 8. 21. 07:51
반응형

현재 실행 가능한 파일 이름을 어떻게 찾습니까? [복제]


중복 가능성 :
C #에서 현재 실행 파일의 이름을 어떻게 얻습니까?

실행 파일은 외부 라이브러리를로드합니다.
라이브러리가 호출 실행 파일을 알 수있는 방법이 있습니까?

(나는 이것에 대한 답을 다른 곳에서 보았지만 더 이상 찾을 수 없다고 맹세했을 것입니다.)


System.Diagnostics.Process.GetCurrentProcess().MainModule.FileName

실행 파일을 원하는 경우 :

System.Reflection.Assembly.GetEntryAssembly().Location

라이브러리를 사용하는 어셈블리를 원하는 경우 (코드가 실행 파일 내의 클래스에서 직접 호출되는 경우 위와 동일한 어셈블리 일 수 있음) :

System.Reflection.Assembly.GetCallingAssembly().Location

경로가 아닌 파일 이름 만 원하는 경우 다음을 사용하십시오.

Path.GetFileName(System.Reflection.Assembly.GetEntryAssembly().Location)

위의 답변 외에도.

콘솔 응용 프로그램으로 test.exe를 작성했습니다.

static void Main(string[] args) {
  Console.WriteLine(
    System.Diagnostics.Process.GetCurrentProcess().MainModule.FileName);
  Console.WriteLine(
    System.Reflection.Assembly.GetEntryAssembly().Location);
  Console.WriteLine(
    System.Reflection.Assembly.GetExecutingAssembly().Location);
  Console.WriteLine(
    System.Reflection.Assembly.GetCallingAssembly().Location);
}

그런 다음 프로젝트를 컴파일하고 출력 이름을 test2.exe 파일로 변경했습니다. 출력 라인은 정확하고 동일합니다.

그러나 Visual Studio에서 시작하면 결과는 다음과 같습니다.

d : \ test2.vhost.exe

d : \ test2.exe

d : \ test2.exe

C : \ Windows \ Microsoft.NET \ Framework \ v2.0.50727 \ mscorlib.dll

Visual Studio에 대한 ReSharper 플러그인은

System.Diagnostics.Process.GetCurrentProcess().MainModule

가능한 System.NullReferenceException. MainModule의 문서를 살펴보면이 속성이 NotSupportedException, PlatformNotSupportedException 및 InvalidOperationException도 throw 할 수 있음을 알 수 있습니다.

GetEntryAssembly 메서드도 100 % "안전"하지 않습니다. MSDN :

관리되지 않는 응용 프로그램에서 관리되는 어셈블리가로드 된 경우 GetEntryAssembly 메서드는 null을 반환 할 수 있습니다. 예를 들어 관리되지 않는 응용 프로그램이 C #으로 작성된 COM 구성 요소의 인스턴스를 만드는 경우 프로세스의 진입 점이 관리되는 어셈블리가 아니라 관리되지 않는 코드이기 때문에 C # 구성 요소에서 GetEntryAssembly 메서드를 호출하면 null이 반환됩니다.

내 솔루션의 경우 Assembly.GetEntryAssembly().Location.

가상화 문제를 해결해야하는 경우 더 많은 관심이 있습니다. 예를 들어 Xenocode Postbuild를 사용하여 .net 코드를 하나의 실행 파일로 연결하는 프로젝트가 있습니다. 이 실행 파일의 이름을 바꿔야합니다. 따라서 위의 모든 방법은 원래 어셈블리 또는 내부 프로세스에 대한 정보 만 가져 오기 때문에 작동하지 않았습니다.

내가 찾은 유일한 해결책은

var location = System.Reflection.Assembly.GetEntryAssembly().Location;
var directory = System.IO.Path.GetDirectoryName(location);
var file = System.IO.Path.Combine(directory, 
  System.Diagnostics.Process.GetCurrentProcess().ProcessName + ".exe");

Environment.GetCommandLineArgs () [0]


나는 이것이 당신이 원하는 것이라고 생각합니다.

System.Reflection.Assembly.GetEntryAssembly().Location

이렇게하면 프로세스가 시작될 때 처음로드 된 어셈블리가 반환됩니다.

GetCallingAssembly 호출 스택에서 바로 위에있는 메서드를 포함하는 어셈블리를 반환하기 때문에 일반적인 경우에 원하는 어셈블리를 반드시 반환하지는 않습니다 (즉, 동일한 DLL에있을 수 있음).


Assembly.GetEntryAssembly()


이것은 포함되지 않았습니다.

System.Windows.Forms.Application.ExecutablePath;

~ 조

참고 URL : https://stackoverflow.com/questions/980202/how-do-i-find-the-current-executable-filename

반응형