NET Core 應用程序相對於以前的.NET Framework 應用程序在啟動運行的方式上有一定的差異,今天就來談一談這個獲取應用程序啟動路徑的問題。
1.工作路徑 WorkingDirectory
下面的兩種方式都可以獲取工作路徑,結果都是一樣的:
Environment.CurrentDirectory;
Directory.GetCurrentDirectory();
其實所謂的工作路徑就是我們應用程序的啟動路徑,所以我們平時所說的獲取應用程序的啟動路徑,也是通過上面的方式。
(1)我們通過VS F5直接運行
VS會先編譯我們的項目,輸出到Debug\對應的sdk版本 目錄下,然后以這個目錄作為工作路徑,啟動我們的應用程序。
(2)通過dotnet 命令運行
我們在項目根目錄,執行 dotnet run
命令:
我們執行 dotnet run
命令來啟動時,對於程序的工作路徑就是執行命令的路徑,所以說,獲取到的路徑變化了。但是我們通過dotnet run
命令運行的應用程序文件實際所在的目錄也是和上面的目錄一樣的,即:Debug\對應的sdk版本,我們可以通過代碼來測試一下:
新加的代碼是獲取程序集所在的路徑,可以發現也是在 Debug\對應的sdk版本 目錄下的。
我們將程序發布到 D:\test
目錄下
可以看到,前兩種方式獲取到的都是執行dotnet命令所在的目錄即工作目錄,后一種方式是獲取到的我們應用程序所在的目錄。
2.結論
通過上面的測試,我們可以得出結論,.NET Core 應用程序獲取工作路徑/啟動路徑,就是獲取的執行dotnet命令時所在的目錄,所以當我們在Linux等系統部署時,設置守護進程時,記得一定要將工作路徑設置為程序文件所在的目錄,不然應用程序獲取到的路徑將不會是應用程序文件所在的目錄,當我們在應用程序里設置了一些相對路徑,諸如讀取配置文件,寫日志(Log4net、NLog),將會與我們的預期不一樣。因為相對路徑,是默認相對於應用程序的工作路徑的。
Environment.CurrentDirectory; //獲取應用程序工作目錄
Directory.GetCurrentDirectory();//獲取應用程序工作目錄(和上面的方式效果是一樣的)
Path.GetDirectoryName(typeof(Program).Assembly.Location);//獲取應用程序所在目錄(絕對,不受工作目錄影響)
AppContext.BaseDirectory 也可以獲取應用程序所在目錄