Использование класса Powershell5 в Powershell4 путем компиляции в CIL? - PullRequest
0 голосов
/ 06 мая 2018

Я написал класс, который требует Powershell 5. Сегодня я решил протестировать класс на ПК на работе и ... очевидно:

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

Так что теперь я нахожусь в двух настроениях. Я мог бы изменить свой скрипт, чтобы импортировать класс C #, используя Add-Type. Однако это заставило меня задуматься ... Насколько я знаю, Powershell, C #, VB.NET и все языки программирования CLR все компилируются до Common Intermediate Language до того, как они на самом деле запускаются Common Language Runtime .

Если это так, то теоретически возможно ли будет скомпилировать мой код класса Powershell 5 в CIL, а затем выполнить этот код из Powershell 4? Я знаю, что это менее ремонтопригодно и будет полным взломом, но мне было бы интересно узнать, как это сделать, если бы это было возможно, независимо от этого.

Ответы [ 2 ]

0 голосов
/ 06 мая 2018

Короткий ответ - нет, вы не можете этого сделать. PowerShell генерирует IL внутренне, но мы не поддерживаем его экспорт в виде DLL. Ответ Джейсона содержит более подробную информацию о том, почему мы этого не делаем и почему, даже если вам удалось извлечь IL с помощью отладчика, он все равно не будет работать.

0 голосов
/ 06 мая 2018

Интересно, прежде чем я доберусь до Powershell, просто краткий обзор

CLR - это время выполнения, которое используется многими языками программирования и на каком языке вы выбрали не имеет значения, если используемый компилятор нацелен на CLR

Кроме того, Microsoft создала несколько языковых компиляторов, предназначенных для среды выполнения, C ++ / CLI, C #, F # и т. Д.

Процесс компиляции исходного кода для управляемых модулей

  1. Исходный код написан на языке
  2. Получается скомпилированным соответствующим компилятор (предназначенный для CLR)
  3. Вы получаете управляемый модуль (+ метаданные) который является стандартным переносимым исполняемым 32-битным Windows (PE32) или (PE64) 64 бита

enter image description here

Объединение модулей в сборки

Затем компилятор берет этот управляемый модуль (IL + Metadata) и файл ресурсов и преобразует их в сборку

enter image description here

Именно эта сборка (EXE / DLL) используется CLR для выполнения


Насколько я знаю, Powershell, C #, VB.NET и все программы CLR все языки компилируются до общего промежуточного языка до они на самом деле управляются средой Common Language Runtime.

Если это так, теоретически возможно ли это скомпилировать мой код класса Powershell 5 в CIL,

С Powershell он работает немного по-другому, хотя и основан на .NET Framework. Он не следует той же процедуре, что и в предыдущем примере.

При попытке запустить скрипт .ps1 (версия 3 и выше)

  • Сначала компилируется дерево синтаксического анализа в LINQ

  • Какой inturn преобразуется в байт-код (CIL), который затем интерпретируется (Just-In-Time)

  • Даже на этом этапе этот IL не может быть преобразован в сборки / DLL / достаточно простым способом (не насколько я знаю).

Но в качестве обходного пути вы можете рассмотреть преобразование скрипта Powershell в исполняемый файл (PS2EXE), хотя это не очень последовательный подход.


Ссылка:

Ссылка на PS2EXE: https://gallery.technet.microsoft.com/PS2EXE-Convert-PowerShell-9e4e07f1

Справочные издания: CLR via C #, Четвертое издание Джеффри Рихтера

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

Ответ Джейсона Ширка: Компилирует ли PowerShell сценарии?

...