.NET 5에서 PublishSingleFile을 지정하여 빌드한 앱의 실행 디렉토리

4319 단어 C#.NET

소개



이 기사 에서 p:PublishSingleFile 를 true로 만들 때 깨달았습니다. 파일 경로가 Assembly.GetExecutingAssembly().Location에서 검색할 수 없습니다.

이 기사에서는 .NET 5에서 PublishSingleFile을 지정하여 빌드 한 자체 완성 된 응용 프로그램에서 실행 디렉토리를 얻는 방법을 확인합니다.

자체 완결형 애플리케이션의 형식으로 앱을 빌드하고 각각 실행한다.



.NET 5 및 .NET Core 3.1 콘솔 응용 프로그램을 만들고 각각 기본 함수에 아래 코드를 제공합니다.

Program.cs
    class Program
    {
        static void Main(string[] args)
        {
            Console.WriteLine($"Environment.Version={Environment.Version}");
            Console.WriteLine($"Assembly.GetExecutingAssembly().Location={Assembly.GetExecutingAssembly().Location}");
            Console.WriteLine($"AppContext.BaseDirectory={AppContext.BaseDirectory}");
            Console.WriteLine("Hello World!");
            Console.ReadLine();
        }
    }

각각의 프로젝트를 아래의 커맨드 라인으로 앱을 자체 완결형 어플리케이션으로 빌드합니다.
dotnet publish -c Release -r win-x64 /p:PublishSingleFile=true /p:IncludeNativeLibrariesForSelfExtract=true

실행한 파일을 c:\temp 에서 더블클릭으로 실행하면 아래와 같은 결과가 되었습니다.



런타임
Assembly.GetExecutingAssembly().Location
AppContext.BaseDirectory


.NET 5
하늘
C:\temp\sample\AppUsing5.exe

.NET Core 3.1
%LOCALAPPDATA%\Temp.net\AppUsingCore3\dl4pjkfu.bol\AppUsingCore3.dll
C:\temp\sample\AppUsingCore3.exe


.NET 5에서 실행 파일의 경로를 찾는 방법?



단일 파일 배치 및 실행 파일 에 API 의 비호환성으로서 .NET 5 로 자가 완결형 어플리케이션으로 빌드했을 경우에 Assembly.Location 에서는 하늘을 돌려준다고 확실히 기재되고 있군요. 또, Assembly.GetFile 이나 Assembly.CodeBase 에서는 예외를 돌려준다고도 기재되어 있습니다.

실행 파일의 디렉토리를 참조하는 경우는 AppContext.BaseDirectory 를 사용하는 것이 올바른 것 같습니다.

자동화된 애플리케이션 실행 디렉토리



.NET 3.1에서는 ZIP 형식의 자체 완성형 응용 프로그램이 한 번 %LOCALAPPDATA%에 배포된 후 배포된 위치에서 프로그램이 시작됩니다. 이 때문에 실행 디렉토리를 참조하는 경우에는 Assembly.GetExecutingAssembly().Location 등을 확인할 필요가 있었고, 실행 파일이 존재하는 디렉토리를 확인하는 경우는 AppContext.BaseDirectory 를 사용하는 등의 구분이 필요했습니다.

.NET 5에서는 임시 디렉터리에 배포되지 않고 앱이 배포된 위치에서 바로 실행됩니다.

요약



.NET 5가되어 실행 경로를 얻는 방법을 알기 쉬워졌습니다.
실행 파일의 경로를 얻는 방법에 대해 MS 문서에서 언급하는 것은 처음이 아닐까요?

좋은 웹페이지 즐겨찾기