通过编译为 CIL 在 Powershell4 中使用 Powershell5 class?

Using a Powershell5 class in Powershell4 by compiling to CIL?

我写了一个需要 Powershell 5 的 class。今天我决定在工作的 PC 上测试 class 并且......显然:

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

所以现在我有两种心态。我也许可以更改脚本以使用 Add-Type 导入 C# class。然而,这让我开始思考……据我所知,Powershell、C#、VB.NET 和所有 CLR 编程语言都编译成 Common Intermediate Language before they are actually run by the Common Language Runtime.

如果是这种情况,那么理论上是否可以将我的 Powershell 5 class 代码编译为 CIL,然后从 Powershell 4 执行该代码?我知道这不太容易维护,而且完全是 hack,但我很想知道如何做,如果可能的话,无论如何。

有趣的是,在我开始使用 Powershell 之前先简单了解一下

CLR是一个运行时间,被很多编程语言使用,你选择什么语言 没关系,只要您使用的编译器针对 CLR

此外,Microsoft 还创建了几种针对 运行time、C++/CLI、C#、F# 等的语言编译器

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

  1. 语言编写的源代码
  2. 由其各自编译 编译器(针对 CLR)
  3. 你得到一个托管模块(+元数据) 这是标准 Windows 可移植可执行文件 32 位 (PE32) 或 (PE64) 64 位

将模块组合到程序集

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

CLR 执行时使用的就是这个程序集(EXE/DLL)


As far as I know, Powershell, C#, VB.NET and all CLR programming languages all compile down to the Common Intermediate Language before they are actually run by the Common Language Runtime.

If this is the case, would it therefore be theoretically possible to compile my Powershell 5 class code to CIL,

使用 Powershell 虽然它基于 .NET Framework,但它的工作方式有点不同。它不遵循我们在上一个示例中看到的相同过程。

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

  • 它首先将解析树编译成 LINQ

  • 依次转换为字节码 (CIL),然后解释(即时)

  • 即使在这个阶段,这个 IL 也不能以相当直接的方式转换为 Assemblies/DLLs/(据我所知不是)。

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


参考文献:

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

参考书:Jeffrey Richter 的 CLR via C#,第四版

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

Jason Shirk 的回答:

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