[英]What's the difference between Application.ThreadException and AppDomain.CurrentDomain.UnhandledException?
[英]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.