当前位置:  开发笔记 > 编程语言 > 正文

PowerShell是否编译脚本?

如何解决《PowerShell是否编译脚本?》经验,为你挑选了1个好方法。

假设我有一个简单的PowerShell脚本:

1..3 | Write-Host 

PowerShell如何处理它?

它是构建内存中的程序集还是一些临时的.dll文件?

我可以使用一些工具(例如ILSpy,VS,WinDbg)检查这个程序集和MSIL吗?

PowerShell是否以相同的方式处理文件脚本和REPL命令行输入(即编译/解释)?

我可以将此编译的程序集与C#和其他.Net语言一起使用吗?

PS脚本可以编译为本机二进制代码吗?

Jason Shirk.. 19

PowerShell V2和更早版本从未编译过脚本,它始终通过解析树中的虚拟"eval"方法进行解释.

PowerShell V3及更高版本将解析树(AST)编译为LINQ表达式树,然后将其编译为字节码,然后对其进行解释.

如果脚本执行了16次,则脚本在后台进行JIT编译,并且只要JIT编译完成,就不会使用解释的代码.这同样适用于循环:如果一个循环迭代16次,循环体将被JIT编译,循环体将在最早的时间从解释转换为JIT编译.

许多操作(如访问成员或调用C#方法)总是以小动态方法进行JIT编译.这些动态站点针对PowerShell的动态特性进行了优化,可根据需要适应不同类型的输入.

JIT编译的代码托管在"匿名方法"程序集中,无法保存.使用WinDbg,您可以反汇编生成的代码的IL.

将编译的IL代码保存为DLL是不可能的,因为生成的代码依赖于活动对象.从技术上讲,PowerShell可以生成可以保存为DLL的代码,但是没有实现.

脚本和REPL(交互式命令提示符)的工作方式完全相同.

请注意,如果PowerShell确实生成了一个程序集,它仍然需要安装编译脚本的PowerShell版本,您无法生成完全可移植的exe.

从其他语言调用PowerShell脚本会有些困难和尴尬,因为几个因素 - 主要是流水线和参数绑定 - 与正常的方法调度有所不同.

您可以使用C#中从PowerShell脚本返回的对象.从V3开始,如果dynamic在C#中使用关键字,则可以在PSObject实例上访问属性,调用脚本方法等,就像在任何其他对象上一样.在V3之前,你必须使用像这样的API psobj.Properties['SomeProperty'].



1> Jason Shirk..:

PowerShell V2和更早版本从未编译过脚本,它始终通过解析树中的虚拟"eval"方法进行解释.

PowerShell V3及更高版本将解析树(AST)编译为LINQ表达式树,然后将其编译为字节码,然后对其进行解释.

如果脚本执行了16次,则脚本在后台进行JIT编译,并且只要JIT编译完成,就不会使用解释的代码.这同样适用于循环:如果一个循环迭代16次,循环体将被JIT编译,循环体将在最早的时间从解释转换为JIT编译.

许多操作(如访问成员或调用C#方法)总是以小动态方法进行JIT编译.这些动态站点针对PowerShell的动态特性进行了优化,可根据需要适应不同类型的输入.

JIT编译的代码托管在"匿名方法"程序集中,无法保存.使用WinDbg,您可以反汇编生成的代码的IL.

将编译的IL代码保存为DLL是不可能的,因为生成的代码依赖于活动对象.从技术上讲,PowerShell可以生成可以保存为DLL的代码,但是没有实现.

脚本和REPL(交互式命令提示符)的工作方式完全相同.

请注意,如果PowerShell确实生成了一个程序集,它仍然需要安装编译脚本的PowerShell版本,您无法生成完全可移植的exe.

从其他语言调用PowerShell脚本会有些困难和尴尬,因为几个因素 - 主要是流水线和参数绑定 - 与正常的方法调度有所不同.

您可以使用C#中从PowerShell脚本返回的对象.从V3开始,如果dynamic在C#中使用关键字,则可以在PSObject实例上访问属性,调用脚本方法等,就像在任何其他对象上一样.在V3之前,你必须使用像这样的API psobj.Properties['SomeProperty'].

推荐阅读
惬听风吟jyy_802
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有