Net coreで現在のパスを取得するためのさまざまな方法のテスト


.Net Core取得プログラムの現在のパス

  • 試験環境
  • テストコード
  • 出力
  • win-x64
  • linux-64
  • まとめ
  • テスト環境


    主なペアNet Coreの下のいくつかのファイルを取得する方式はテストを行い、環境をテストする.Net Standard 2.0クラスライブラリClassLibrary 1.Net Core 3.1コンソールプログラムLinuxPathTest
    パブリケーションはlinux-x 64とwin-x 64のそれぞれにパッケージされています.

    テストコード


    ClassLibrary1
    using System.Collections;
    using System.Collections.Generic;
    using System.Diagnostics;
    using System.IO;
    
    namespace ClassLibrary1
    {
        public class Library: IEnumerable<string>
        {
            public IEnumerator<string> GetEnumerator()
            {
                yield return $"{Environment.CurrentDirectory}";
                yield return $"{Directory.GetCurrentDirectory()}";
                yield return $"{GetType().Assembly.Location}";
                yield return $"{Process.GetCurrentProcess().MainModule.FileName}";
                yield return $"{AppDomain.CurrentDomain.BaseDirectory}";
            }
    
            IEnumerator IEnumerable.GetEnumerator()
            {
                return GetEnumerator();
            }
        }
    }
    

    LinuxPathTest
    using ClassLibrary1;
    
    using System;
    using System.Diagnostics;
    using System.IO;
    
    namespace LinuxPathTest
    {
        class Program
        {
            static void Main(string[] args)
            {
                Console.WriteLine("-------------------------------");
                foreach (var item in new Library())
                {
                    Console.WriteLine($"{item}");
                }
                Console.WriteLine("-------------------------------");
                Console.WriteLine($"{Environment.CurrentDirectory}");
                Console.WriteLine($"{Directory.GetCurrentDirectory()}");
                Console.WriteLine($"{(new object()).GetType().Assembly.Location}");
                Console.WriteLine($"{Process.GetCurrentProcess().MainModule.FileName}");
                Console.WriteLine($"{AppDomain.CurrentDomain.BaseDirectory}");
                Console.WriteLine($"{AppDomain.CurrentDomain.SetupInformation.ApplicationBase}"); // .net standard  
                Console.ReadLine();
            }
        }
    }
    

    しゅつりょく


    win-x64


    実行可能ファイルのパスE:ProjectsLinuxPathTestLinuxPathTestbinReleaseetcoreap 3.1\publish
    -------------------------------
    E:\Projects\LinuxPathTest\LinuxPathTest\bin\Release
    etcoreapp3.1\publish E:\Projects\LinuxPathTest\LinuxPathTest\bin\Release
    etcoreapp3.1\publish C:\Users\ \AppData\Local\Temp\.net\LinuxPathTest\3c0ont0d.sts\ClassLibrary1.dll E:\Projects\LinuxPathTest\LinuxPathTest\bin\Release
    etcoreapp3.1\publish\LinuxPathTest.exe C:\Users\ \AppData\Local\Temp\.net\LinuxPathTest\3c0ont0d.sts\ ------------------------------- E:\Projects\LinuxPathTest\LinuxPathTest\bin\Release
    etcoreapp3.1\publish E:\Projects\LinuxPathTest\LinuxPathTest\bin\Release
    etcoreapp3.1\publish C:\Users\ \AppData\Local\Temp\.net\LinuxPathTest\3c0ont0d.sts\System.Private.CoreLib.dll E:\Projects\LinuxPathTest\LinuxPathTest\bin\Release
    etcoreapp3.1\publish\LinuxPathTest.exe C:\Users\ \AppData\Local\Temp\.net\LinuxPathTest\3c0ont0d.sts\ C:\Users\ \AppData\Local\Temp\.net\LinuxPathTest\3c0ont0d.sts\

    linux-64


    実行可能ファイルパス/home/ユーザー名/desktop/Test
    -------------------------------
    /home/ /Desktop/Test
    /home/ /Desktop/Test
    /var/tmp/.net/LinuxPathTest/5kkarywl.a5s/ClassLibrary1.dll
    /home/ /Desktop/Test/LinuxPathTest
    /var/tmp/.net/LinuxPathTest/5kkarywl.a5s/
    -------------------------------
    /home/ /Desktop/Test
    /home/ /Desktop/Test
    /var/tmp/.net/LinuxPathTest/5kkarywl.a5s/System.Private.CoreLib.dll
    /home/ /Desktop/Test/LinuxPathTest
    /var/tmp/.net/LinuxPathTest/5kkarywl.a5s/
    /var/tmp/.net/LinuxPathTest/5kkarywl.a5s/
    

    まとめ


    .Net Coreがホストから無依存の単一ファイルにパッケージ化された後、ファイルを一時ファイルに解放する操作がさらに多くなるため、ファイルパスを取得する方法によって得られる結果と.Net Frameworkでは一致しません.