我写了一篇需要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执行该代码?我知道这是不太可维护的,并且会完全被黑客攻击,但是如果有可能的话,我有兴趣知道该怎么做。
答案 0 :(得分:2)
有趣的是,在我进入Powershell之前,我只是一个快速概述
CLR 是许多编程语言使用的运行时以及您选择的语言 只要你使用的编译器以CLR
为目标就无所谓了除了Microsoft已经创建了几个针对运行时的语言编译器,C ++ / CLI,C#,F#等等
将源代码编译到托管模块的过程
将模块与程序集合并
然后编译器获取此托管模块(IL +元数据)和资源文件并将它们转换为程序集
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,它仍然无法工作。