通过编译到CIL,在Powershell4中使用Powershell5类?

时间:2018-05-06 15:24:33

标签: .net powershell clr cil

我写了一篇需要Powershell 5的课程。今天我决定在工作中在PC上测试课程......显然:

The 'class' keyword is not supported in this version of the language

所以现在我有两种心态。我可以更改我的脚本以使用Add-Type导入C#类。但是它让我思考......据我所知,Powershell,C#,VB.NET和所有CLR编程语言在Common Intermediate Language实际运行之前都编译为Common Language Runtime。 / p>

如果是这种情况,理论上是否可以将我的Powershell 5类代码编译为CIL,然后从Powershell 4执行该代码?我知道这是不太可维护的,并且会完全被黑客攻击,但是如果有可能的话,我有兴趣知道该怎么做。

2 个答案:

答案 0 :(得分:2)

有趣的是,在我进入Powershell之前,我只是一个快速概述

CLR 是许多编程语言使用的运行时以及您选择的语言 只要你使用的编译器以CLR

为目标就无所谓了

除了Microsoft已经创建了几个针对运行时的语言编译器,C ++ / CLI,C#,F#等等

将源代码编译到托管模块的过程

  1. 用语言编写的源代码
  2. 由各自编译 编译器(针对CLR)
  3. 您获得了一个托管模块(+元数据) 这是标准的Windows便携式可执行文件32位(PE32)或(PE64) 64位
  4. enter image description here

    将模块与程序集合并

    然后编译器获取此托管模块(IL +元数据)和资源文件并将它们转换为程序集

    enter image description here

    CLR使用此程序集(EXE / DLL)执行

      

    据我所知,Powershell,C#,VB.NET和所有CLR编程   语言之前都编译为通用中间语言   它们实际上是由Common Language Runtime运行的。

         

    如果是这种情况,那么从理论上讲是否可行   将我的Powershell 5类代码编译为CIL,

    使用Powershell 虽然它基于.NET Framework,但它的工作方式有所不同。它不遵循我们在前面的例子中看到的相同程序。

    当您尝试运行.ps1脚本(Ver:3及更高版本)

    • 首先将解析树编译为LINQ

    • 哪个inturn转换为字节代码(CIL),然后是Intepreted(即时)

    • 即使在这个阶段,这个IL也无法以合理的直接方式转换为Assemblies / DLLs(据我所知)。

    但是作为一种解决方法,您可以考虑将Powershell脚本转换为可执行文件(PS2EXE),尽管它不是一种非常一致的方法。

    <强>参考文献:

    链接到PS2EXE:https://gallery.technet.microsoft.com/PS2EXE-Convert-PowerShell-9e4e07f1

    参考书: CLR通过C#,第四版由Jeffrey Richter

    https://www.safaribooksonline.com/library/view/clr-via-c/9780735668737/

    Jason Shirk的回答:Does PowerShell compile scripts?

答案 1 :(得分:1)

简短的回答是否定的 - 你不能这样做。 PowerShell在内部生成IL,但我们不支持将其导出为.dll。 Jason's回答详细说明了为什么我们不这样做以及为什么,即使您设法使用调试器提取IL,它仍然无法工作。