.NET Core 中的路徑問題


NET Core 應用程序相對於以前的.NET Framework 應用程序在啟動運行的方式上有一定的差異,今天就來談一談這個獲取應用程序啟動路徑的問題。

1.工作路徑 WorkingDirectory

下面的兩種方式都可以獲取工作路徑,結果都是一樣的:

Environment.CurrentDirectory;
Directory.GetCurrentDirectory();

其實所謂的工作路徑就是我們應用程序的啟動路徑,所以我們平時所說的獲取應用程序的啟動路徑,也是通過上面的方式。

(1)我們通過VS F5直接運行

1529820341662

VS會先編譯我們的項目,輸出到Debug\對應的sdk版本 目錄下,然后以這個目錄作為工作路徑,啟動我們的應用程序。

(2)通過dotnet 命令運行

我們在項目根目錄,執行 dotnet run命令:

1529820460067

我們執行 dotnet run命令來啟動時,對於程序的工作路徑就是執行命令的路徑,所以說,獲取到的路徑變化了。但是我們通過dotnet run命令運行的應用程序文件實際所在的目錄也是和上面的目錄一樣的,即:Debug\對應的sdk版本,我們可以通過代碼來測試一下:

1529820714691

新加的代碼是獲取程序集所在的路徑,可以發現也是在 Debug\對應的sdk版本 目錄下的。

我們將程序發布到 D:\test 目錄下

1529821435227

可以看到,前兩種方式獲取到的都是執行dotnet命令所在的目錄即工作目錄,后一種方式是獲取到的我們應用程序所在的目錄。

2.結論

通過上面的測試,我們可以得出結論,.NET Core 應用程序獲取工作路徑/啟動路徑,就是獲取的執行dotnet命令時所在的目錄,所以當我們在Linux等系統部署時,設置守護進程時,記得一定要將工作路徑設置為程序文件所在的目錄,不然應用程序獲取到的路徑將不會是應用程序文件所在的目錄,當我們在應用程序里設置了一些相對路徑,諸如讀取配置文件,寫日志(Log4net、NLog),將會與我們的預期不一樣。因為相對路徑,是默認相對於應用程序的工作路徑的。

Environment.CurrentDirectory; //獲取應用程序工作目錄
Directory.GetCurrentDirectory();//獲取應用程序工作目錄(和上面的方式效果是一樣的)

Path.GetDirectoryName(typeof(Program).Assembly.Location);//獲取應用程序所在目錄(絕對,不受工作目錄影響)

AppContext.BaseDirectory 也可以獲取應用程序所在目錄


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM