作用域与运行空间与会话与 AppDomain
Scope vs Runspace vs Session vs AppDomain
我正在努力在脑海中为 PowerShell 划定界限。我非常有限的理解是这样的:
- 一个作用域包含 user/script 个定义的变量和函数,并且可以有一个具有 PS 个调用堆栈的作用域层次结构。
- 运行空间决定了给定的 PS 实例可以访问哪些内置功能。运行空间可以跨越网络边界。
- 会话是 Powershell 的特定实例。这些也可以跨越网络边界。
- 应用程序域(或 AppDomain)包含加载的程序集。在许多情况下,一旦数据加载到 AppDomain 中,就无法卸载。 AppDomain 必须被处理掉以支持一个新的。如果 PS 脚本是通过另一个应用程序调用的,则创建的 PS 实例会继承调用应用程序的 AppDomain。
谁能更好地解释这些概念?是否有某种维恩图或可以充实这些信息的东西?在线文档并不是很有帮助。
考虑这些的最方便的方式是按照您列出它们的方式的相反顺序:
所有 AppDomain
个实例都由 .NET 公共语言运行时 (CLR) 在 Windows 进程中托管。 AppDomain
类似于 Windows 进程,因为它是一个安全边界。一般来说,一个应用域中的代码不允许直接跨到另一个应用域。
A Windows PowerShell 运行空间是实际创建 PowerShell 运行时的位置。它提供了一些核心基础设施,例如管道的创建。这是一个 .NET 对象,它继承父应用程序域。它确实具有远程处理功能,但它们与 .NET Framework 本质上提供的任何内容都没有真正的关系。相反,远程处理功能由 Windows PowerShell 产品基础结构提供。
一个运行空间可以是多个会话的宿主。会话实例可能作为纯本地结构存在于本地机器上,也可能存在于您网络的其他地方。当针对远程会话发出命令时,命令本身被发送到远程托管服务提供商,执行,整个管道的结果返回到原始请求者。
有几个不同的范围,它们本质上是分层的。有顶级作用域、函数作用域、模块作用域、脚本作用域等。当作用域之间发生命名冲突时,最局部的作用域获胜。范围还使您能够隐藏数据,如果您正在构建模块,这是一个非常有用的功能。任何范围都可以通过名称和变量名称进行访问。例如 $script:myVar
.
我正在努力在脑海中为 PowerShell 划定界限。我非常有限的理解是这样的:
- 一个作用域包含 user/script 个定义的变量和函数,并且可以有一个具有 PS 个调用堆栈的作用域层次结构。
- 运行空间决定了给定的 PS 实例可以访问哪些内置功能。运行空间可以跨越网络边界。
- 会话是 Powershell 的特定实例。这些也可以跨越网络边界。
- 应用程序域(或 AppDomain)包含加载的程序集。在许多情况下,一旦数据加载到 AppDomain 中,就无法卸载。 AppDomain 必须被处理掉以支持一个新的。如果 PS 脚本是通过另一个应用程序调用的,则创建的 PS 实例会继承调用应用程序的 AppDomain。
谁能更好地解释这些概念?是否有某种维恩图或可以充实这些信息的东西?在线文档并不是很有帮助。
考虑这些的最方便的方式是按照您列出它们的方式的相反顺序:
所有 AppDomain
个实例都由 .NET 公共语言运行时 (CLR) 在 Windows 进程中托管。 AppDomain
类似于 Windows 进程,因为它是一个安全边界。一般来说,一个应用域中的代码不允许直接跨到另一个应用域。
A Windows PowerShell 运行空间是实际创建 PowerShell 运行时的位置。它提供了一些核心基础设施,例如管道的创建。这是一个 .NET 对象,它继承父应用程序域。它确实具有远程处理功能,但它们与 .NET Framework 本质上提供的任何内容都没有真正的关系。相反,远程处理功能由 Windows PowerShell 产品基础结构提供。
一个运行空间可以是多个会话的宿主。会话实例可能作为纯本地结构存在于本地机器上,也可能存在于您网络的其他地方。当针对远程会话发出命令时,命令本身被发送到远程托管服务提供商,执行,整个管道的结果返回到原始请求者。
有几个不同的范围,它们本质上是分层的。有顶级作用域、函数作用域、模块作用域、脚本作用域等。当作用域之间发生命名冲突时,最局部的作用域获胜。范围还使您能够隐藏数据,如果您正在构建模块,这是一个非常有用的功能。任何范围都可以通过名称和变量名称进行访问。例如 $script:myVar
.