Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/.net/21.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# PowerShell是否编译脚本?_C#_.net_Debugging_Powershell_Cil - Fatal编程技术网

C# PowerShell是否编译脚本?

C# PowerShell是否编译脚本?,c#,.net,debugging,powershell,cil,C#,.net,Debugging,Powershell,Cil,假设我有一个简单的PowerShell脚本: 1..3 | Write-Host PowerShell如何处理它 它是在内存中构建程序集还是一些临时的.dll文件 我可以使用一些工具(例如ILSpy、VS、WinDbg)检查此程序集和MSIL吗 PowerShell是否以相同的方式处理文件脚本和REPL命令行输入(即编译/解释) 我可以将这个编译后的程序集与C#和其他.Net语言一起使用吗 PS脚本是否可以编译为本机二进制代码 PowerShell V2及更早版本从未编译过脚本,它总是通过

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

1..3 | Write-Host 
  • PowerShell如何处理它
  • 它是在内存中构建程序集还是一些临时的.dll文件
  • 我可以使用一些工具(例如ILSpy、VS、WinDbg)检查此程序集和MSIL吗
  • PowerShell是否以相同的方式处理文件脚本和REPL命令行输入(即编译/解释)
  • 我可以将这个编译后的程序集与C#和其他.Net语言一起使用吗
  • PS脚本是否可以编译为本机二进制代码

PowerShell V2及更早版本从未编译过脚本,它总是通过解析树中的虚拟“eval”方法进行解释

PowerShell V3和更高版本将解析树(the)编译为LINQ表达式树,然后将其编译为,然后对其进行解释

如果脚本被执行16次,那么脚本将在后台编译,一旦JIT编译完成,解释的代码将不会被使用。这同样适用于循环:如果一个循环迭代16次,那么循环体将被JIT编译,并且循环体将在尽可能早的时间从解释转换为JIT编译

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

JIT编译的代码位于“匿名方法”程序集中,无法保存。使用,您可以反汇编生成的代码

不太可能将编译后的IL代码保存为DLL,因为生成的代码依赖于活动对象。从技术上讲,PowerShell可以生成可以另存为DLL的代码,但尚未实现

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

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

从其他语言调用PowerShell脚本有点困难和尴尬,因为有几个因素——主要是管道和参数绑定 -与常规方法调度有所不同


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

的API,PowerShell是一种解释语言(是的,V3在内部缓存一些生成的IL)。没有这样的程序集,那么您就不能将它们与其他.NET语言一起使用,但当然您可以在.NET应用程序中托管PowerShell(还可以共享某些东西!)。其他答案则是由此产生的结果。关于检查缓存的IL…当然,使用ILSpy检查PS代码并使用WinDbg,您几乎可以做任何您想做的事情…如果您的目标是将PowerShell脚本部署为可执行文件,您可能想看看这个项目:感谢您提供的大量信息,我第一次读到这篇文章!您是否有关于此功能的文档链接?对不起,这篇文章和GirHub上的源代码都是关于此功能的。我猜这就是:
if(LoopStatementCount<300){//在循环16次迭代后开始编译。
EnterLoopInstruction=new EnterLoopInstruction(循环,compiler.Locals,16,compiler.Instructions.Count);
compiler.Instructions.Emit(EnterLoopInstruction);
}对于循环,函数也有类似的代码。