簡體   English   中英

Application和AppDomain.CurrentDomain之間有什么區別

[英]What's the difference between Application and AppDomain.CurrentDomain

我對Application類和AppDomain類的使用感到困惑。
例如, Application.StartupPath等於AppDomain.CurrentDomain.BaseDirectory

我通常使用Application類並且最近發現了AppDomain - 有人可以向我解釋AppDomain類及其用法嗎?

他們沒有任何共同點,真的。

Application是特定於Windows Forms(.NET GUI技術)的類。 Application.StartupPath由Kernel32函數GetModuleFileName處理。 通過不傳遞指向模塊的指針,返回主模塊的路徑 - 基本上就是exe文件。

AppDomain是域隔離的核心.NET概念。 基本上,它允許您在單個本機進程中隔離(當然不完美)多個應用程序。 大多數應用程序只有一個AppDomain ,但您可以根據需要創建任意數量的AppDomain 應用程序域的基本路徑由Fusion(一種.NET程序集加載技術)處理。 一個非常典型的例子是IIS中托管的ASP.NET應用程序 - 每個應用程序都有自己的AppDomain ,但它們都托管在一個本機進程(“應用程序池”)中。 每個邏輯應用程序都可以在不觸及其他邏輯應用程序的情況下重新啟動,並且它們之間沒有(簡單)訪問權限,但是流程撕裂異常(例如StackOverflowException )仍將終止整個池。

另一個有趣的課程是Environment 您可以使用Environment.CommandLine來獲取進程命令行(包括可執行文件的路徑,包括可執行文件的名稱)。 這基本上是CLR和底層系統之間的通信接口 - 在這種情況下,它負責保存應用程序的參數(由OS傳遞給Main函數)並在將來的任何時候使它們可用。

Environment.CommandLine有點笨拙解析(它是原始命令行,基本上 - 我認為它在Windows上會有不同於Linux上的約定),但它是你總能找到可執行文件的唯一方法。 同樣, Application.StartupPath是特定於Winforms的,並且您可以擁有多個AppDomain - 可能, AppDomain可能甚至沒有合理的BaseDirectory

.NET Reflection API還為您提供了幾種方法。 例如, Assembly.GetEntryAssembly()將為您提供可執行程序集 - 但是,這僅適用於主AppDomain - 其他域將具有自己的條目程序集(實際上,它們通常只返回null :))。 您可以通過Assembly.CodeBase屬性獲取程序集的路徑,但請注意,這可能並不總是您所期望的。 您還可以使用Assembly.Location ,或獲取任何程序集模塊的FullyQualifiedName (同樣,大多數程序集只有一個模塊;而且,ASP.NET不是這種情況的主要示例之一) 。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM