Application和AppDomain.CurrentDomain之间的区别是什么

时间:2015-07-07 08:03:20

标签: c# appdomain

我对AppDomain班级和Application.StartupPath班级的使用感到困惑 例如,AppDomain.CurrentDomain.BaseDirectory等于Application

我通常使用AppDomain课程并且最近发现了AppDomain - 有人可以向我解释ios::sync_with_stdio(false)课程及其用法吗?

1 个答案:

答案 0 :(得分:16)

他们没有任何共同点,真的。

Application是一个特定于Windows Forms的类,一种.NET GUI技术。 Application.StartupPath由Kernel32函数GetModuleFileName处理。通过不传递指向模块的指针,返回主模块的路径 - 基本上就是exe文件。

AppDomain是域隔离的核心.NET概念。基本上,它允许您在单个本机进程中隔离(当然不完美)多个应用程序。大多数应用程序只有一个AppDomain,但您可以根据需要创建任意数量的AppDomain。应用程序域的基本路径由Fusion(一种.NET程序集加载技术)处理。一个非常典型的例子是IIS中托管的ASP.NET应用程序 - 每个应用程序都有自己的StackOverflowException,但它们都托管在一个本机进程(“应用程序池”)中。每个逻辑应用程序都可以在不触及其他逻辑应用程序的情况下重新启动,并且它们之间没有(简单)访问权限,但是流程撕裂异常(例如Environment)仍会终止整个池。

另一个有点相关的有趣的课程是Environment.CommandLine。您可以使用Main来获取进程命令行(包括可执行文件的路径,包括可执行文件的名称)。这基本上是CLR和底层系统之间的通信接口 - 在这种情况下,它负责保存应用程序的参数(由OS传递给Environment.CommandLine函数)并使它们可用于任何未来的时间。

Application.StartupPath有点笨拙解析(这是原始的命令行,基本上 - 我认为它在Windows上会有不同于Linux的约定),但这是你可以的唯一方法总是到达可执行文件。同样,AppDomain是特定于Winforms的,并且您可以拥有多个AppDomain - 可能BaseDirectory甚至可能 合理Assembly.GetEntryAssembly() }。

.NET Reflection API还为您提供了几种方法。例如,AppDomain将为您提供可执行程序集 - 但是,这仅适用于主null - 其他域将具有自己的条目程序集(事实上,它们通常只返回{{1} :))。您可以通过Assembly.CodeBase属性获取程序集的路径,但请注意,这可能并不总是您所期望的。您也可以使用Assembly.Location,或者获取任何程序集模块的FullyQualifiedName(同样,大多数程序集只有一个模块;同样,ASP.NET是此时的主要示例之一事实并非如此)。