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


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.

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

Примеры

Пример 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 .

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

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

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

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

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

[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-Member параметр получает статические свойства и методы класса BasicTest. В выходных данных показано, что Add метод включен.

Командлет Get-Member получает члены объекта, хранящегося в переменной $BasicTestObject . $BasicTestObject был создан с помощью командлета с классом New-ObjectBasicTest . Выходные данные показывают, что значение переменной $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 сохраняет сигнатуру ShowWindowAsync C# функции. Чтобы убедиться, что результирующий метод отображается в сеансе 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использует параметр Path для указания сборки и получения типов в сборке. New-Object создает экземпляр поставщика кода F# и сохраняет результат в переменной $Provider . Переменная $FSharpCode сохраняет код F#, определяющий метод Loop .

Переменная $FSharpType сохраняет результаты командлета Add-Type , который сохраняет общедоступные типы, определенные в $FSharpCode. Параметр TypeDefinition указывает исходный код, определяющий типы. Параметр CodeDomProvider указывает компилятор исходного кода. Параметр PassThru направляется Add-Type к возврату объекта runtime , представляющего типы. Объекты отправляются по конвейеру 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 будет выглядеть в текущем расположении.

Type:String[]
Aliases:AN
Position:Named
Default value:None
Required:True
Accept pipeline input:False
Accept wildcard characters:True

-CodeDomProvider

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

Type:CodeDomProvider
Aliases:Provider
Position:Named
Default value:C# compiler
Required:False
Accept pipeline input:False
Accept wildcard characters:False

-CompilerParameters

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

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

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

Type:CompilerParameters
Aliases:CP
Position:Named
Default value:None
Required:False
Accept pipeline input:False
Accept wildcard characters:False

-IgnoreWarnings

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

Type:SwitchParameter
Position:Named
Default value:False
Required:False
Accept pipeline input:False
Accept wildcard characters:False

-Language

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

  • CSharp
  • CSharpVersion2
  • CSharpVersion3
  • JScript
  • VisualBasic
Type:Language
Accepted values:CSharp, CSharpVersion2, CSharpVersion3, JScript, VisualBasic
Position:Named
Default value:CSharp
Required:False
Accept pipeline input:False
Accept wildcard characters:False

-LiteralPath

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

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

Type:String[]
Aliases:PSPath
Position:Named
Default value:None
Required:True
Accept pipeline input:False
Accept wildcard characters:False

-MemberDefinition

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

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

Type:String[]
Position:1
Default value:None
Required:True
Accept pipeline input:False
Accept wildcard characters:False

-Name

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

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

Type:String
Position:0
Default value:None
Required:True
Accept pipeline input:False
Accept wildcard characters:False

-Namespace

Задает пространство имен для типа.

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

Type:String
Aliases:NS
Position:Named
Default value:None
Required:False
Accept pipeline input:False
Accept wildcard characters:False

-OutputAssembly

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

Type:String
Aliases:OA
Position:Named
Default value:None
Required:False
Accept pipeline input:False
Accept wildcard characters:True

-OutputType

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

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

  • ConsoleApplication
  • Library
  • WindowsApplication
Type:OutputAssemblyType
Aliases:OT
Accepted values:ConsoleApplication, Library, WindowsApplication
Position:Named
Default value:None
Required:False
Accept pipeline input:False
Accept wildcard characters:False

-PassThru

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

Type:SwitchParameter
Position:Named
Default value:False
Required:False
Accept pipeline input:False
Accept wildcard characters:False

-Path

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

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

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

Type:String[]
Position:0
Default value:None
Required:True
Accept pipeline input:False
Accept wildcard characters:False

-ReferencedAssemblies

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

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

Type:String[]
Aliases:RA
Position:Named
Default value:None
Required:False
Accept pipeline input:False
Accept wildcard characters:False

-TypeDefinition

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

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

Type:String
Position:0
Default value:None
Required:True
Accept pipeline input:False
Accept wildcard characters:False

-UsingNamespace

Задает другие пространства имен, которые требуются для класса. Это очень похоже на ключевое слово UsingC# .

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

Type:String[]
Aliases:Using
Position:Named
Default value:System namespace
Required:False
Accept pipeline input:False
Accept wildcard characters:False

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

None

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

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

None

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

Type

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

Примечания

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

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

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

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