【发布时间】:2017-01-18 19:41:52
【问题描述】:
我正在努力为 PowerShell 划定界限。我非常有限的理解是这样的:
- 范围包含用户/脚本定义的变量和函数,并且可以存在具有 PS 调用堆栈的范围层次结构。
- 运行空间规定了给定 PS 实例可以访问的内置功能。运行空间可以跨越网络边界。
- 会话是 Powershell 的特定实例。这些也可以跨越网络边界。
- 应用程序域(或 AppDomain)包含已加载的程序集。在许多情况下,一旦数据被加载到 AppDomain 中,就无法卸载。必须将 AppDomain 弃置以换取新的。如果 PS 脚本通过另一个应用程序调用,则创建的 PS 实例会继承调用应用程序的 AppDomain。
谁能更好地解释这些概念?是否有某种维恩图或某种可以充实这些信息的东西?在线文档并不是很有帮助。
【问题讨论】:
-
“跨网络边界”是什么意思?
-
我的意思是它可以远程存在(在另一台机器上)
-
我会根据我的经验告诉你我是如何理解这些范围的。 AppDomain 和 Runspace 是一样的。运行空间是加载添加 powershell 运行空间的程序集的位置。根据我的 .NET 背景,这必须与 AppDomain 映射,因为程序集加载规则是 .NET 的核心,不能被覆盖。就我而言,会话是我的 powershell 控制台,因此是运行空间和 AppDomain。我从来没有设法让它工作。
-
@AlexSarafian - 我通过 PowerShell 脚本使用运行空间工厂类创建了几个运行空间,从每个运行空间中检索了当前的 App Domain 对象并检查了该 appdomain 对象的 ID 属性。对于包括主机 powershell 运行空间在内的所有运行空间,它都是相同的 (ID = 1)。当我使用 AppDomain]::CreateDomain 静态方法创建一个新的应用程序域时,它返回了 ID 2。这证明,在 powershell 会话中创建的所有自定义运行空间都在同一个主机 powershell 进程的应用程序域内......除非我错过了什么。
-
@Steve 令人难以置信的怀旧提醒。自从我上次做任何 powershell 以来已经有很多年了。但是您的解释是确认方法是正确的,因此我对我当时评论的理解是错误的。可能是当 PowerShell 桌面版变为 Core 时它发生了变化。
标签: powershell session appdomain runspace