什么';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
类及其用法吗?
他们真的没有任何共同点。
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是不存在这种情况的主要示例之一(。