我对AppDomain
班级和Application.StartupPath
班级的使用感到困惑
例如,AppDomain.CurrentDomain.BaseDirectory
等于Application
我通常使用AppDomain
课程并且最近发现了AppDomain
- 有人可以向我解释ios::sync_with_stdio(false)
课程及其用法吗?
答案 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是此时的主要示例之一事实并非如此)。