Поделиться через


Add-Type

Добавляет класс Microsoft .NET в сеанс PowerShell.

Синтаксис

Add-Type
   [-CodeDomProvider <CodeDomProvider>]
   [-CompilerParameters <CompilerParameters>]
   [-TypeDefinition] <String>
   [-Language <Language>]
   [-ReferencedAssemblies <String[]>]
   [-OutputAssembly <String>]
   [-OutputType <OutputAssemblyType>]
   [-PassThru]
   [-IgnoreWarnings]
   [<CommonParameters>]
Add-Type
   [-CodeDomProvider <CodeDomProvider>]
   [-CompilerParameters <CompilerParameters>]
   [-Name] <String>
   [-MemberDefinition] <String[]>
   [-Namespace <String>]
   [-UsingNamespace <String[]>]
   [-Language <Language>]
   [-ReferencedAssemblies <String[]>]
   [-OutputAssembly <String>]
   [-OutputType <OutputAssemblyType>]
   [-PassThru]
   [-IgnoreWarnings]
   [<CommonParameters>]
Add-Type
   [-CompilerParameters <CompilerParameters>]
   [-Path] <String[]>
   [-ReferencedAssemblies <String[]>]
   [-OutputAssembly <String>]
   [-OutputType <OutputAssemblyType>]
   [-PassThru]
   [-IgnoreWarnings]
   [<CommonParameters>]
Add-Type
   [-CompilerParameters <CompilerParameters>]
   -LiteralPath <String[]>
   [-ReferencedAssemblies <String[]>]
   [-OutputAssembly <String>]
   [-OutputType <OutputAssemblyType>]
   [-PassThru]
   [-IgnoreWarnings]
   [<CommonParameters>]
Add-Type
   -AssemblyName <String[]>
   [-PassThru]
   [-IgnoreWarnings]
   [<CommonParameters>]

Описание

Командлет Add-Type позволяет определить класс Microsoft .NET Framework в сеансе PowerShell. Затем можно создать экземпляры объектов с помощью командлета New-Object и использовать объекты так же, как и любой объект .NET Framework. При добавлении команды Add-Type в профиль PowerShell класс доступен во всех сеансах PowerShell.

Тип можно указать, указав существующие сборки или файлы исходного кода, или указать встроенный или сохраненный в переменной исходный код. Можно даже указать только метод и Add-Type определяет и создает класс. В Windows эту функцию можно использовать для вызова платформенного вызова (P/Invoke) неуправляемых функций в PowerShell. Если указать исходный код, Add-Type компилирует указанный исходный код и создает сборку в памяти, содержащую новые типы .NET Framework.

Параметры Add-Type можно использовать для указания альтернативного языка и компилятора, C# — это параметры компилятора, зависимости сборок, пространство имен класса, имена типа и результирующая сборка.

Примеры

Пример 1. Добавление типа .NET в сеанс

В этом примере в сеанс добавляется класс basicTest, указав исходный код, хранящийся в переменной. Класс BasicTest используется для добавления целых чисел, создания объекта и умножения целых чисел.

$Source = @"
public class BasicTest
{
  public static int Add(int a, int b)
    {
        return (a + b);
    }
  public int Multiply(int a, int b)
    {
    return (a * b);
    }
}
"@

Add-Type -TypeDefinition $Source
[BasicTest]::Add(4, 3)
$BasicTestObject = New-Object BasicTest
$BasicTestObject.Multiply(5, 2)

Переменная $Source сохраняет исходный код для класса. Тип имеет статический метод с именем Add и нестатический метод, называемый Multiply.

Командлет Add-Type добавляет класс в сеанс. Так как он использует встроенный исходный код, команда использует параметр TypeDefinition для указания кода в переменной $Source.

Статический метод AddBasicTest использует символы двойной двоеточия (::) для указания статического элемента класса. Добавляются целые числа и отображается сумма.

Командлет New-Object создает экземпляр класса BasicTest. Он сохраняет новый объект в переменной $BasicTestObject.

$BasicTestObject использует метод Multiply. Целые числа умножаются и отображается продукт.

Пример 2. Проверка добавленного типа

В этом примере используется командлет Get-Member для проверки объектов, созданных Add-Type и командлетов New-Object, созданных в примере 1.

[BasicTest] | Get-Member

TypeName: System.RuntimeType

Name                 MemberType Definition
----                 ---------- ----------
AsType               Method     type AsType()
Clone                Method     System.Object Clone(), System.Object ICloneable.Clone()
Equals               Method     bool Equals(System.Object obj), bool Equals(type o)
FindInterfaces       Method     type[] FindInterfaces(System.Reflection.TypeFilter filter...
...

[BasicTest] | Get-Member -Static

TypeName: BasicTest

Name            MemberType Definition
----            ---------- ----------
Add             Method     static int Add(int a, int b)
Equals          Method     static bool Equals(System.Object objA, System.Object objB)
new             Method     BasicTest new()
ReferenceEquals Method     static bool ReferenceEquals(System.Object objA, System.Object objB)

$BasicTestObject | Get-Member

TypeName: BasicTest

Name        MemberType Definition
----        ---------- ----------
Equals      Method     bool Equals(System.Object obj)
GetHashCode Method     int GetHashCode()
GetType     Method     type GetType()
Multiply    Method     int Multiply(int a, int b)
ToString    Method     string ToString()

Командлет Get-Member получает тип и члены класса BasicTest, который Add-Type добавлен в сеанс. Команда Get-Member показывает, что это объект System.RuntimeType, производный от класса System.Object.

Параметр Get-Memberstatic получает статические свойства и методы класса BasicTest. В выходных данных показано, что включен метод Add.

Командлет Get-Member получает члены объекта, хранящегося в переменной $BasicTestObject. $BasicTestObject был создан с помощью командлета New-Object с классом BasicTest. Выходные данные показывают, что значение переменной $BasicTestObject является экземпляром класса BasicTest и включает в себя элемент с именем Multiply.

Пример 3. Добавление типов из сборки

В этом примере классы из сборки Accessibility.dll добавляются в текущий сеанс.

$AccType = Add-Type -AssemblyName "accessib*" -PassThru

Переменная $AccType сохраняет объект, созданный с помощью командлета Add-Type. Add-Type использует параметр AssemblyName для указания имени сборки. Подстановочный знак звездочки (*) позволяет получить правильную сборку, даже если вы не уверены в имени или его орфографии. Параметр PassThru создает объекты, представляющие классы, добавленные в сеанс.

Пример 4. Вызов собственных API Windows

В этом примере показано, как вызывать собственные API Windows в PowerShell. Add-Type использует механизм вызова платформы (P/Invoke) для вызова функции в User32.dll из PowerShell. Этот пример работает только на компьютерах под управлением операционной системы Windows.

$Signature = @"
[DllImport("user32.dll")]public static extern bool ShowWindowAsync(IntPtr hWnd, int nCmdShow);
"@

$addTypeSplat = @{
    MemberDefinition = $Signature
    Name = "Win32ShowWindowAsync"
    Namespace = 'Win32Functions'
    PassThru = $true
}
$ShowWindowAsync = Add-Type @addTypeSplat

# Minimize the PowerShell console

$ShowWindowAsync::ShowWindowAsync((Get-Process -Id $PID).MainWindowHandle, 2)

# Restore the PowerShell console

$ShowWindowAsync::ShowWindowAsync((Get-Process -Id $PID).MainWindowHandle, 4)

Переменная $Signature сохраняет сигнатуру C# функции ShowWindowAsync. Чтобы убедиться, что результирующий метод отображается в сеансе PowerShell, ключевое слово public было добавлено в стандартную подпись. Дополнительные сведения см. в функции ShowWindowAsync.

Переменная $ShowWindowAsync сохраняет объект, созданный параметром Add-TypePassThru. Командлет Add-Type добавляет функцию ShowWindowAsync в сеанс PowerShell в качестве статического метода. Команда использует параметр MemberDefinition, чтобы указать определение метода, сохраненное в переменной $Signature. Команда использует параметры имени и пространства имен , чтобы указать имя и пространство имен для класса. Параметр PassThru создает объект, представляющий типы.

Новый ShowWindowAsync статический метод используется в командах для минимизации и восстановления консоли PowerShell. Метод принимает два параметра: дескриптор окна и целое число, указывающее, как отображается окно.

Чтобы свести к минимуму консоль PowerShell, ShowWindowAsync использует командлет Get-Process с автоматической переменной $PID, чтобы получить процесс, на котором размещен текущий сеанс PowerShell. Затем он использует свойство MainWindowHandle текущего процесса и значение 2, представляющее значение SW_MINIMIZE.

Чтобы восстановить окно, ShowWindowAsync использует значение 4 для положения окна, представляющего значение SW_RESTORE.

Чтобы развернуть окно, используйте значение 3, представляющее SW_MAXIMIZE.

Пример 5. Добавление типа из файла Visual Basic

В этом примере используется командлет Add-Type для добавления класса VBFromFile, определенного в файле Hello.vb в текущий сеанс. Текст файла Hello.vb отображается в выходных данных команды.

Add-Type -Path "C:\PS-Test\Hello.vb"
[VBFromFile]::SayHello(", World")

# From Hello.vb

Public Class VBFromFile
  Public Shared Function SayHello(sourceName As String) As String
    Dim myValue As String = "Hello"
    return myValue + sourceName
  End Function
End Class

Hello, World

Add-Type использует параметр path для указания исходного файла, Hello.vbи добавления типа, определенного в файле. Функция SayHello вызывается как статический метод класса VBFromFile.

Пример 6. Добавление класса с JScript.NET

В этом примере используется JScript.NET для создания нового класса FRectangleв сеансе PowerShell.

Add-Type @'
 class FRectangle {
   var Length : double;
   var Height : double;
   function Perimeter() : double {
       return (Length + Height) * 2; }
   function Area() : double {
       return Length * Height;  } }
'@ -Language JScript

$rect = [FRectangle]::new()
$rect

Length Height
------ ------
     0      0

Пример 7. Добавление компилятора F#

В этом примере показано, как использовать командлет Add-Type для добавления компилятора кода F# в сеанс PowerShell. Чтобы запустить этот пример в PowerShell, необходимо установить FSharp.Compiler.CodeDom.dll с языком F#.

Add-Type -Path "FSharp.Compiler.CodeDom.dll"
$Provider = New-Object Microsoft.FSharp.Compiler.CodeDom.FSharpCodeProvider
$FSharpCode = @"
let rec loop n =if n <= 0 then () else beginprint_endline (string_of_int n);loop (n-1)end
"@
$FSharpType = Add-Type -TypeDefinition $FSharpCode -CodeDomProvider $Provider -PassThru |
   Where-Object { $_.IsPublic }
$FSharpType::loop(4)

4
3
2
1

Add-Type использует параметр пути для указания сборки и получения типов в сборке. New-Object создает экземпляр поставщика кода F# и сохраняет результат в переменной $Provider. Переменная $FSharpCode сохраняет код F#, определяющий метод Loop.

Переменная $FSharpType сохраняет результаты командлета Add-Type, который сохраняет общедоступные типы, определенные в $FSharpCode. Параметр TypeDefinition указывает исходный код, определяющий типы. Параметр CodeDomProvider указывает компилятор исходного кода. Параметр PassThru направляет Add-Type для возврата объекта среды выполнения, представляющего типы. Объекты отправляются по конвейеру в командлет Where-Object, который возвращает только общедоступные типы. Командлет Where-Object используется, так как поставщик F# создает недоступные типы для поддержки результирующего общедоступного типа.

Метод Loop вызывается как статический метод типа, хранящегося в переменной $FSharpType.

Параметры

-AssemblyName

Указывает имя сборки, включающей типы. Add-Type принимает типы из указанной сборки. Этот параметр требуется при создании типов на основе имени сборки.

Введите полное или простое имя, также известное как частичное имя сборки. Подстановочные знаки разрешены в имени сборки. Если ввести простое или частичное имя, Add-Type разрешает его в полное имя, а затем использует полное имя для загрузки сборки.

Использование параметров path или LiteralPath гарантирует загрузку сборки, которую вы хотите загрузить. При использовании параметра AssemblyName PowerShell просит .NET разрешить имя сборки с помощью стандартного процесса разрешения сборки .NET. Так как .NET сначала выполняет поиск в папке приложения, Add-Type может загрузить сборку из $PSHOME вместо версии в текущей папке. Дополнительные сведения см. в расположении сборки.

Если .NET не удается устранить имя, PowerShell будет выглядеть в текущем расположении, чтобы найти сборку. При использовании подстановочных знаков в параметре AssemblyName процесс разрешения сборки .NET завершается ошибкой, что приводит к тому, что PowerShell будет выглядеть в текущем расположении.

Тип:String[]
Aliases:AN
Position:Named
Default value:None
Обязательно:True
Принять входные данные конвейера:False
Принять подстановочные знаки:True

-CodeDomProvider

Задает генератор кода или компилятор. Add-Type использует указанный компилятор для компиляции исходного кода. По умолчанию используется компилятор C#. Используйте этот параметр, если вы используете язык, который не может быть указан с помощью параметра language. CodeDomProvid er, указанный вами, должен иметь возможность создавать сборки из исходного кода.

Тип:CodeDomProvider
Aliases:Provider
Position:Named
Default value:C# compiler
Обязательно:False
Принять входные данные конвейера:False
Принять подстановочные знаки:False

-CompilerParameters

Задает параметры компилятора исходного кода. Эти параметры отправляются компилятору без редакции.

Этот параметр позволяет направлять компилятору создавать исполняемый файл, внедрять ресурсы или задавать параметры командной строки, например параметр /unsafe. Этот параметр реализует класс компилятора компилятора, System.CodeDom.Compiler.CompilerParameters.

Нельзя использовать параметры компилятора и ReferencedAssemblies в той же команде.

Тип:CompilerParameters
Aliases:CP
Position:Named
Default value:None
Обязательно:False
Принять входные данные конвейера:False
Принять подстановочные знаки:False

-IgnoreWarnings

Игнорирует предупреждения компилятора. Используйте этот параметр для предотвращения Add-Type обработки предупреждений компилятора в виде ошибок.

Тип:SwitchParameter
Position:Named
Default value:False
Обязательно:False
Принять входные данные конвейера:False
Принять подстановочные знаки:False

-Language

Указывает язык, используемый в исходном коде. Командлет Add-Type использует значение этого параметра для выбора соответствующего CodeDomProvider. CSharp — это значение по умолчанию. Допустимые значения для этого параметра приведены следующим образом:

  • CSharp
  • CSharpVersion2
  • CSharpVersion3
  • JScript
  • VisualBasic
Тип:Language
Допустимые значения:CSharp, CSharpVersion2, CSharpVersion3, JScript, VisualBasic
Position:Named
Default value:CSharp
Обязательно:False
Принять входные данные конвейера:False
Принять подстановочные знаки:False

-LiteralPath

Указывает путь к файлам исходного кода или файлам DLL сборки, содержащим типы. В отличие от пути, значение параметра LiteralPath используется точно так же, как он типизированный. Символы не интерпретируются как подстановочные знаки. Если путь содержит escape-символы, заключите его в одинарные кавычки. Одинарные кавычки говорят PowerShell не интерпретировать какие-либо символы как escape-последовательности.

Использование параметров path или LiteralPath гарантирует загрузку сборки, которую вы хотите загрузить.

Тип:String[]
Aliases:PSPath
Position:Named
Default value:None
Обязательно:True
Принять входные данные конвейера:False
Принять подстановочные знаки:False

-MemberDefinition

Задает новые свойства или методы для класса. Add-Type создает код шаблона, необходимый для поддержки свойств или методов.

В Windows эту функцию можно использовать для вызова платформенного вызова (P/Invoke) неуправляемых функций в PowerShell.

Тип:String[]
Position:1
Default value:None
Обязательно:True
Принять входные данные конвейера:False
Принять подстановочные знаки:False

-Name

Указывает имя создаваемого класса. Этот параметр требуется при создании типа из определения члена.

Имя типа и пространство имен должны быть уникальными в сеансе. Вы не можете выгрузить тип или изменить его. Чтобы изменить код для типа, необходимо изменить имя или запустить новый сеанс PowerShell. В противном случае команда завершается ошибкой.

Тип:String
Position:0
Default value:None
Обязательно:True
Принять входные данные конвейера:False
Принять подстановочные знаки:False

-Namespace

По умолчанию эта команда создает тип в пространстве имен Microsoft.PowerShell.Commands.AddType.AutoGeneratedTypes. При использовании этого параметра тип создается в указанном пространстве имен. Если значение пустой строки, тип создается в глобальном пространстве имен.

Тип:String
Aliases:NS
Position:Named
Default value:None
Обязательно:False
Принять входные данные конвейера:False
Принять подстановочные знаки:False

-OutputAssembly

Создает DLL-файл для сборки с указанным именем в расположении. Введите необязательный путь и имя файла. Разрешены подстановочные знаки. По умолчанию Add-Type создает сборку только в памяти. Если вы выводите сборку в файл, необходимо включить параметр PassThru, чтобы вернуть тип из созданной сборки.

Тип:String
Aliases:OA
Position:Named
Default value:None
Обязательно:False
Принять входные данные конвейера:False
Принять подстановочные знаки:True

-OutputType

Указывает выходной тип выходной сборки. По умолчанию выходной тип не указан. Этот параметр действителен только в том случае, если в команде указана выходная сборка. Дополнительные сведения о значениях см. в разделе OutputAssemblyType Enumeration.

Допустимые значения для этого параметра приведены следующим образом:

  • ConsoleApplication
  • Library
  • WindowsApplication
Тип:OutputAssemblyType
Aliases:OT
Допустимые значения:ConsoleApplication, Library, WindowsApplication
Position:Named
Default value:None
Обязательно:False
Принять входные данные конвейера:False
Принять подстановочные знаки:False

-PassThru

Возвращает объект System.Runtime, представляющий добавленные типы. По умолчанию этот командлет не создает выходные данные. Используйте этот параметр, если вы использовали OutputAssembly для создания DLL-файла и хотите вернуть тип из созданной сборки.

Тип:SwitchParameter
Position:Named
Default value:False
Обязательно:False
Принять входные данные конвейера:False
Принять подстановочные знаки:False

-Path

Указывает путь к файлам исходного кода или файлам DLL сборки, содержащим типы.

При отправке файлов исходного кода Add-Type компилирует код в файлах и создает сборку типов в памяти. Расширение файла, указанное в значении пути, определяет компилятор, который Add-Type использует.

При отправке файла сборки Add-Type принимает типы из сборки. Чтобы указать сборку в памяти или глобальный кэш сборок, используйте параметр AssemblyName.

Тип:String[]
Position:0
Default value:None
Обязательно:True
Принять входные данные конвейера:False
Принять подстановочные знаки:False

-ReferencedAssemblies

Указывает сборки, от которых зависит тип. По умолчанию Add-Type ссылки System.dll и System.Management.Automation.dll. На сборки, указанные с помощью этого параметра, ссылаются в дополнение к сборкам по умолчанию.

Нельзя использовать параметры компилятора и ReferencedAssemblies в той же команде.

Тип:String[]
Aliases:RA
Position:Named
Default value:None
Обязательно:False
Принять входные данные конвейера:False
Принять подстановочные знаки:False

-TypeDefinition

Указывает исходный код, содержащий определения типов. Введите исходный код в строке или строке или введите переменную, содержащую исходный код. Дополнительные сведения о строках см. в about_Quoting_Rules.

Добавьте объявление пространства имен в определение типа. Если опущено объявление пространства имен, тип может иметь то же имя, что и другой тип или ярлык другого типа, что приводит к непреднамеренной перезаписи. Например, если вы определяете тип исключения, скрипты, использующие исключений в качестве ярлыка для System.Exception, завершаются ошибкой.

Тип:String
Position:0
Default value:None
Обязательно:True
Принять входные данные конвейера:False
Принять подстановочные знаки:False

-UsingNamespace

Указывает другие пространства имен, необходимые для класса. Это так же, как ключевое слово C#, Using.

По умолчанию Add-Type ссылается на пространство имен System. Если используется параметр MemberDefinition, Add-Type также ссылается на пространство имен System.Runtime.InteropServices. Добавляемые пространства имен с помощью параметра using using UsingNamespace ссылаются в дополнение к пространствам имен по умолчанию.

Тип:String[]
Aliases:Using
Position:Named
Default value:System namespace
Обязательно:False
Принять входные данные конвейера:False
Принять подстановочные знаки:False

Входные данные

None

Невозможно передать объекты в этот командлет.

Выходные данные

None

По умолчанию этот командлет не возвращает выходные данные.

Type

При использовании параметра PassThru этот командлет возвращает объект System.Type, представляющий новый тип.

Примечания

Добавляемые типы существуют только в текущем сеансе. Чтобы использовать типы во всех сеансах, добавьте их в профиль PowerShell. Дополнительные сведения о профиле см. в about_Profiles.

Имена типов и пространства имен должны быть уникальными в сеансе. Вы не можете выгрузить тип или изменить его. Если вам нужно изменить код для типа, необходимо изменить имя или запустить новый сеанс PowerShell. В противном случае команда завершается ошибкой.

Класс CodeDomProvider для некоторых языков, таких как IronPython и J#, не создает выходные данные. В результате типы, написанные на этих языках, нельзя использовать с Add-Type.

Этот командлет основан на классе Microsoft .NET Framework CodeDomProvider.