什么';What is Application和AppDomain.CurrentDomain之间的区别

本文关键字:CurrentDomain AppDomain 之间 区别 Application What is 什么 | 更新日期: 2023-09-27 18:01:16

我对Application类和AppDomain类的用法有点困惑
例如,Application.StartupPath等于AppDomain.CurrentDomain.BaseDirectory

我经常使用Application类,最近发现了AppDomain-有人能给我解释一下AppDomain类及其用法吗?

什么';What is Application和AppDomain.CurrentDomain之间的区别

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

Application是一个特定于.NET GUI技术Windows窗体的类。CCD_ 9由Kernel32函数CCD_。通过不传递指向模块的指针,返回主模块的路径——基本上就是exe文件。

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

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

Environment.CommandLine解析起来有点笨拙(基本上是原始命令行——例如,我认为它在Windows上的约定与在Linux上的约定不同(,但这是始终获取可执行文件的唯一方法。同样,Application.StartupPath是Winforms特定的,并且可以有多个AppDomain-并且可能,AppDomain甚至可能没有合理的BaseDirectory

.NET反射API还提供了一些方法。例如,Assembly.GetEntryAssembly()将为您提供可执行程序集-然而,这只适用于主AppDomain-其他域将有自己的入口程序集(事实上,它们通常只返回null:((。您可以通过Assembly.CodeBase属性获得程序集的路径,但请注意,这可能并不总是您所期望的。您也可以使用Assembly.Location,或获取程序集的任何模块的FullyQualifiedName(同样,大多数程序集只有一个模块;同样,ASP.NET是不存在这种情况的主要示例之一(。