范围vs Runspace vs Session vs AppDomain

时间:2017-01-18 19:41:52

标签: powershell session appdomain runspace

我努力为PowerShell划清界限。我的理解非常有限:

  • 范围包含用户/脚本定义的变量和函数,并且可以存在具有PS调用堆栈的范围层次结构。
  • Runspace规定了给定PS实例可以访问的内置功能。 Runspace可以跨越网络边界。
  • 会话是Powershell的特定实例。这些也可以跨越网络边界。
  • 应用程序域(或AppDomain)包含已加载的程序集。在许多情况下,一旦将数据加载到AppDomain中,就无法卸载它。必须处理AppDomain以支持新的AppDomain。如果通过其他应用程序调用PS脚本,则创建的PS实例将继承调用应用程序的AppDomain。

有人能更好地解释这些概念吗?是否有某种维恩图或其他能够充实这些信息的东西?在线文档没有太大帮助。

1 个答案:

答案 0 :(得分:2)

最简单的思考方式是与列出它们的方式相反:

所有AppDomain实例都由.NET公共语言运行时(CLR)托管在Windows进程内部。 AppDomain在Windows进程中就像 一样,因为它是安全边界。通常,一个应用程序域中的代码不允许直接越过另一应用程序域。

Windows PowerShell运行空间是实际创建PowerShell运行时的位置。它提供了一些核心基础结构,例如管道的创建。这是一个.NET对象,它继承了父应用程序域。它确实具有远程处理功能,但是它们实际上与.NET Framework本身提供的任何功能都不相关。相反,远程功能由Windows PowerShell产品基础结构提供。

单个运行空间可以成为多个会话的主机。会话实例可能以纯本地结构形式存在于本地计算机上,也可能存在于网络的其他位置。当针对远程会话发出命令时,该命令本身将发送到远程主机提供程序,并执行,并将整个管道的结果返回给原始请求者。

有几个不同的作用域,它们本质上是分层的。有顶级作用域,函数作用域,模块作用域,脚本作用域等。当作用域之间发生命名冲突时,以本地作用域为准。范围还使您能够隐藏数据,这在构建模块时非常有用。可以通过名称以及变量名称来访问任何范围。例如$script:myVar