Добавляет тип (класс) Microsoft .NET Framework в сеанс Windows PowerShell.
Синтаксис
Add-Type -AssemblyName <string[]> [-IgnoreWarnings] [-PassThru] [<CommonParameters>] Add-Type [-Name] <string> [-MemberDefinition] <string[]> [-CodeDomProvider <CodeDomProvider>] [-CompilerParameters <CompilerParameters>] [-Language {<CSharp> | <CSharpVersion3> | <VisualBasic> | <JScript>}] [-Namespace <string>] [-OutputAssembly <string>] [-OutputType <OutputAssemblyType>] [-ReferencedAssemblies <string[]>] [-UsingNamespace <string[]>] [-IgnoreWarnings] [-PassThru] [<CommonParameters>] Add-Type [-Path] <string[]> [-CompilerParameters <CompilerParameters>] [-OutputAssembly <string>] [-OutputType <OutputAssemblyType>] [-ReferencedAssemblies <string[]>] [-IgnoreWarnings] [-PassThru] [<CommonParameters>] Add-Type [-TypeDefinition] <string> [-CodeDomProvider <CodeDomProvider>] [-CompilerParameters <CompilerParameters>] [-Language {<CSharp> | <CSharpVersion3> | <VisualBasic> | <JScript>}] [-OutputAssembly <string>] [-OutputType <OutputAssemblyType>] [-ReferencedAssemblies <string[]>] [-IgnoreWarnings] [-PassThru] [<CommonParameters>]
Описание
Командлет Add-Type позволяет определить в сеансе Windows PowerShell класс .NET Framework. После этого можно создавать объекты соответствующего класса (с помощью командлета New-Object) и использовать их, как любые другие объекты .NET Framework. Если добавить команду Add-Type в профиль Windows PowerShell, то класс будет доступен во всех сеансах Windows PowerShell.
Тип можно задать, указав существующую сборку или файлы с исходным кодом; можно также указать исходный код в строке или сохранить его в виде переменной. Кроме того, можно просто указать метод, а команда Add-Type определит и создаст класс. С помощью этой функции в Windows PowerShell можно вызывать неуправляемые функции. Если задать исходный код, командлет Add-Type скомпилирует этот код и создаст хранимую в памяти сборку, содержащую новые типы .NET Framework.
С помощью параметров командлета Add-Type можно задать альтернативный язык и компилятор (по умолчанию используется CSharp), параметры компилятора, зависимости сборки, пространство имен класса, а также имена типа и получаемой в результате сборки.
Параметры
-AssemblyName <string[]>
Задает имя сборки, включающей типы. Команда Add-Type получает типы из указанной сборки. Этот параметр требуется указывать в случае создания типов на основании имени сборки.
Введите полное или простое имя (также называемое "частичным именем") сборки. В имени сборки разрешается использовать подстановочные знаки. В случае указания простого или частичного имени командлет Add-Type разрешает его в полное имя, а затем загружает сборку с использованием этого полного имени.
В качестве значения этого параметра нельзя указывать путь или имя файла. Чтобы указать путь к DLL-файлу, следует использовать параметр Path.
Обязательно? |
true |
Позиция? |
named |
Значение по умолчанию |
|
Принимать входные данные из конвейера? |
false |
Принимать подстановочные знаки? |
true |
-CodeDomProvider <CodeDomProvider>
Задает генератор кода или компилятор. Команда Add-Type использует указанный компилятор для компиляции исходного кода. По умолчанию используется компилятор CSharp. Этот параметр следует применять в том случае, если используемый язык нельзя указать с помощью параметра Language. Указываемый в параметре CodeDomProvider компилятор должен поддерживать создание сборок из исходного кода.
Обязательно? |
false |
Позиция? |
named |
Значение по умолчанию |
CSharp compiler |
Принимать входные данные из конвейера? |
false |
Принимать подстановочные знаки? |
false |
-CompilerParameters <CompilerParameters>
Задает параметры для компилятора исходного кода. Эти параметры передаются компилятору без проверки.
Этот параметр позволяет использовать компилятор для создания исполняемого файла и внедрения ресурсов или задать для компилятора параметры командной строки, например "/unsafe". Этот параметр реализует класс CompilerParameters (System.CodeDom.Compiler.CompilerParameters).
Обязательно? |
false |
Позиция? |
named |
Значение по умолчанию |
|
Принимать входные данные из конвейера? |
false |
Принимать подстановочные знаки? |
false |
-IgnoreWarnings
Игнорирует предупреждения компилятора. Этот параметр позволяет запретить командлету Add-Type обрабатывать предупреждения как ошибки.
Обязательно? |
false |
Позиция? |
named |
Значение по умолчанию |
False |
Принимать входные данные из конвейера? |
false |
Принимать подстановочные знаки? |
false |
-Language <Language>
Задает язык, используемый в исходном коде. Команда Add-Type использует значение языка для выбора нужного компилятора кода.
Допустимые значения: CSharp, CSharpVersion3, VisualBasic и JScript. По умолчанию используется значение CSharp.
Обязательно? |
false |
Позиция? |
named |
Значение по умолчанию |
CSharp |
Принимать входные данные из конвейера? |
false |
Принимать подстановочные знаки? |
false |
-MemberDefinition <string[]>
Задает новые свойства или методы класса. Команда Add-Type создает шаблон кода, необходимый для поддержки этих свойств и методов.
С помощью этой функции в Windows PowerShell можно вызывать неуправляемые функции. Дополнительные сведения см. в примерах.
Обязательно? |
true |
Позиция? |
2 |
Значение по умолчанию |
|
Принимать входные данные из конвейера? |
false |
Принимать подстановочные знаки? |
false |
-Name <string>
Задает имя создаваемого класса. Этот параметр требуется указывать при создании типа на основании определения элемента.
Имя типа и пространство имен должны быть уникальными в пределах одного сеанса. Невозможно выгрузить тип или изменить его. Если требуется изменить код типа, необходимо изменить его имя или запустить новый сеанс Windows PowerShell. В противном случае команда завершится с ошибкой.
Обязательно? |
true |
Позиция? |
1 |
Значение по умолчанию |
|
Принимать входные данные из конвейера? |
false |
Принимать подстановочные знаки? |
false |
-Namespace <string>
Задает пространство имен типа.
Если этот параметр не указан в команде, тип создается в пространстве имен Microsoft.PowerShell.Commands.AddType.AutoGeneratedTypes. Если этот параметр указан в команде и имеет значение пустой строки или $null, тип создается в глобальном пространстве имен.
Обязательно? |
false |
Позиция? |
named |
Значение по умолчанию |
Microsoft.PowerShell.Commands.AddType.AutoGeneratedTypes |
Принимать входные данные из конвейера? |
false |
Принимать подстановочные знаки? |
false |
-OutputAssembly <string>
Создает DLL-файл для сборки с заданным именем и расположением. Введите путь (необязательно) и имя файла. Подстановочные знаки разрешены. По умолчанию команда Add-Type создает сборку только в памяти.
Обязательно? |
false |
Позиция? |
named |
Значение по умолчанию |
|
Принимать входные данные из конвейера? |
false |
Принимать подстановочные знаки? |
true |
-OutputType <OutputAssemblyType>
Задает тип выходных данных результирующей сборки. Допустимые значения: Library, ConsoleApplication и WindowsApplication.
По умолчанию тип выходных данных не задан.
Этот параметр допустим, только если в команде задана результирующая сборка.
Обязательно? |
false |
Позиция? |
named |
Значение по умолчанию |
нет |
Принимать входные данные из конвейера? |
false |
Принимать подстановочные знаки? |
false |
-PassThru
Возвращает объект System.Runtime, представляющий добавленные типы. По умолчанию этот командлет не формирует никаких выходных данных.
Обязательно? |
false |
Позиция? |
named |
Значение по умолчанию |
|
Принимать входные данные из конвейера? |
false |
Принимать подстановочные знаки? |
false |
-Path <string[]>
Задает путь к файлам с исходным кодом или DLL-файлам сборки, содержащим типы.
Если задать файлы с исходным кодом, командлет Add-Type скомпилирует код в этих файлах и создаст хранимую в памяти сборку с этими типами. Расширение имени файла, указываемое в значении параметра Path, определяет компилятор, который будет использовать командлет Add-Type.
Если задать файл сборки, команда Add-Type будет использовать типы из этой сборки. Чтобы указать сборку, хранимую в памяти, или глобальный кэш сборок, следует использовать параметр AssemblyName.
Обязательно? |
true |
Позиция? |
1 |
Значение по умолчанию |
|
Принимать входные данные из конвейера? |
false |
Принимать подстановочные знаки? |
false |
-ReferencedAssemblies <string[]>
Задает сборки, от которых зависит тип. По умолчанию команда Add-Type ссылается на сборки System.dll и System.Management.Automation.dll. При указании сборок с помощью этого параметра ссылки на эти сборки добавляются к ссылкам на сборки по умолчанию.
Обязательно? |
false |
Позиция? |
named |
Значение по умолчанию |
|
Принимать входные данные из конвейера? |
false |
Принимать подстановочные знаки? |
false |
-TypeDefinition <string>
Задает исходный код, содержащий определения типа. Введите исходный код в виде строки или автономной строки, либо укажите переменную, содержащую исходный код. Дополнительные сведения об автономных строках см. в разделе about_Quoting_Rules.
Включите в определение типа объявление пространства имен. Если опустить объявление пространства имен, имя типа может совпасть с именем или ярлыком другого типа, в результате чего другой тип может быть непреднамеренно перезаписан. Например, если определить тип с именем "Exception", то скрипты, в которых "Exception" используется в качестве псевдонима для System.Exception, перестанут работать.
Обязательно? |
true |
Позиция? |
1 |
Значение по умолчанию |
|
Принимать входные данные из конвейера? |
false |
Принимать подстановочные знаки? |
false |
-UsingNamespace <string[]>
Задает другие пространства имен, необходимые для класса. Назначение этого параметра похоже на назначение ключевого слова "Using" в C#.
По умолчанию Add-Type ссылается на пространство имен System. В случае использования параметра MemberDefinition Add-Type по умолчанию также ссылается на пространство имен System.Runtime.InteropServices. При указании пространств имен с помощью параметра UsingNamespace ссылки на эти пространства имен добавляются к ссылкам на пространства имен по умолчанию.
Обязательно? |
false |
Позиция? |
named |
Значение по умолчанию |
|
Принимать входные данные из конвейера? |
false |
Принимать подстановочные знаки? |
false |
<CommonParameters>
Данный командлет поддерживает общие параметры -Verbose, -Debug, -ErrorAction, -ErrorVariable, -OutBuffer и -OutVariable. Дополнительные сведения см. в разделе about_Commonparameters.
Ввод и вывод
Входным типом является тип объектов, которые можно передавать командлету по конвейеру. Возвращаемым типом является тип объектов, возвращаемых командлетом.
Входные данные |
Нет Объекты невозможно передать командлету Add-Type по конвейеру. |
Выходные данные |
Нет или System.RuntimeType При использовании параметра PassThru командлет Add-Type возвращает объект System.RuntimeType, представляющий новый тип. В противном случае этот командлет не формирует никаких выходных данных. |
Примечания
Добавляемые типы существуют только в рамках текущего сеанса. Чтобы использовать типы во всех сеансах, их следует добавить в профиль Windows PowerShell. Дополнительные сведения о профиле см. в разделе about_Profiles.
Имена типов (и пространства имен) должны быть уникальными в пределах одного сеанса. Невозможно выгрузить тип или изменить его. Если требуется изменить код типа, необходимо изменить его имя или запустить новый сеанс Windows PowerShell. В противном случае команда завершится с ошибкой.
Класс CodeDomProvider для некоторых языков, например IronPython и JSharp, не позволяет сформировать выходные данные. Поэтому типы, написанные на этих языках, нельзя использовать с командлетом Add-Type.
Этот командлет основан на классе CodeDomProvider. Дополнительные сведения об этом классе см. в описании пакета SDK Microsoft .NET Framework.
Пример 1
C:\PS>$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); } } "@ C:\PS> Add-Type -TypeDefinition $source C:\PS> [BasicTest]::Add(4, 3) C:\PS> $basicTestObject = New-Object BasicTest C:\PS> $basicTestObject.Multiply(5, 2) Описание ----------- Эти команды добавляют в сеанс класс BasicTest при указании исходного кода, хранимого в переменной. У типа имеется статический метод Add и нестатический метод Multiply. Первая команда хранит исходный код класса в переменной $source. Вторая команда использует командлет Add-Type для добавления класса в сеанс. Поскольку используется встроенный исходный код, для указания кода в переменной $source команда использует параметр TypeDefinition. Оставшиеся команды используют новый класс. Третья команда вызывает статический метод Add класса BasicTest. Для указания статических элементов класса используются двойные двоеточия (::). Четвертая команда использует командлет New-Object для создания экземпляра класса BasicTest. Она сохраняет новый объект в переменной $basicTestObject. Пятая команда использует метод Multiply объекта $basicTestObject.
Пример 2
C:\PS>[BasicTest] | get-member C:\PS> [BasicTest] | get-member -static C:\PS> $basicTestObject | get-member C:\PS> [BasicTest] | get-member TypeName: System.RuntimeType Name MemberType Definition ---- ---------- ---------- Clone Method System.Object Clone() Equals Method System.Boolean Equals FindInterfaces Method System.Type[] FindInt ... C:\PS> [BasicTest] | get-member -static TypeName: BasicTest Name MemberType Definition ---- ---------- ---------- Add Method static System.Int32 Add(Int32 a, Int32 b) Equals Method static System.Boolean Equals(Object objA, ReferenceEquals Method static System.Boolean ReferenceEquals(Obj C:\PS> $basicTestObject | get-member TypeName: BasicTest Name MemberType Definition ---- ---------- ---------- Equals Method System.Boolean Equals(Object obj) GetHashCode Method System.Int32 GetHashCode() GetType Method System.Type GetType() Multiply Method System.Int32 Multiply(Int32 a, Int32 b) ToString Method System.String ToString() Описание ----------- Эти команды используют командлет Get-Member для проверки объектов, созданных в предыдущем примере с помощью командлетов Add-Type и New-Object. Первая команда использует командлет Get-Member, чтобы получить тип и элементы класса BasicTest, добавленного в сеанс с помощью командлета Add-Type. Командлет Get-Member позволяет узнать, чтоб объект имеет тип System.RuntimeType, являющийся производным для класса System.Object. Вторая команда использует параметр Static командлета Get-Member, чтобы получить статические свойства и статические методы класса BasicTest. Результат содержит метод Add. Третья команда использует командлет Get-Member, чтобы получить элементы объекта, хранящегося в переменной $BasicTestObject. Это экземпляр объекта класса $BasicType, созданного с помощью командлета New-Object. Результат выполнения команды показывает, что значение переменной $basicTestObject является экземпляром класса BasicTest и содержит элемент Multiply.
Пример 3
C:\PS>$accType = add-type -assemblyname accessib* -passthru Описание ----------- Эта команда добавляет в текущий сеанс классы из сборки Accessibility. Команда использует параметр AssemblyName для указания имени сборки. Подстановочный знак позволяет получить нужную сборку, даже если точное имя сборки или его написание неизвестно. Команда использует параметр PassThru, чтобы создать объекты, представляющие классы, добавляемые в сеанс, и сохраняет эти объекты в переменной $accType.
Пример 4
C:\PS>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 C:\PS> [VBFromFile]::SayHello(", World") Hello, World Описание ----------- В этом примере командлет Add-Type используется для добавления в текущий сеанс класса VBFromFile, определенного в файле Hello.vb. Текст файла Hello.vb показан в результатах выполнения команды. Первая команда использует командлет Add-Type для добавления в текущий сеанс типа, определенного в файле Hello.vb. Для указания исходного файла в этой команде используется параметр path. Вторая команда вызывает функцию SayHello в качестве статического метода класса VBFromFile.
Пример 5
C:\PS>$signature = @" [DllImport("user32.dll")] public static extern bool ShowWindowAsync(IntPtr hWnd, int nCmdShow); "@ $showWindowAsync = Add-Type -memberDefinition $signature -name "Win32ShowWindowAsync" -namespace Win32Functions -passThru # Minimize the Windows PowerShell console $showWindowAsync::ShowWindowAsync((Get-Process -id $pid).MainWindowHandle, 2) # Restore it $showWindowAsync::ShowWindowAsync((Get-Process -id $pid).MainWindowHandle, 4) Описание ----------- Команды в этом примере показывают, как вызывать в Windows PowerShell собственные API Windows. Командлет Add-Type использует механизм вызова неуправляемого кода, чтобы вызвать в Windows PowerShell функцию из файла User32.dll. Первая команда сохраняет в переменной $signature сигнатуру C# функции ShowWindowAsync. (Дополнительные сведения см. в разделе "Функция ShowWindowAsync" библиотеки MSDN по адресу (на английском языке).) Чтобы получаемый в результате метод был доступен в сеансе Windows PowerShell, к стандартной сигнатуре было добавлено ключевое слово "public". Вторая команда использует командлет Add-Type для добавления функции ShowWindowAsync в сеанс Windows PowerShell в качестве статического метода класса, создаваемого командлетом Add-Type. Команда использует параметр MemberDefinition для задания определения метода, сохраняемого в переменной $signature. Команда использует параметры Name и Namespace для задания имени и пространства имен класса. Она использует параметр PassThru, чтобы создать объект, представляющий типы, и сохраняет этот объект в переменной $showWindowAsync. В третьей и четвертой командах используется новый статический метод ShowWindowAsync. Этот метод принимает два параметра — дескриптор окна и целое значение, определяющее отображение окна. Третья команда вызывает метод ShowWindowAsync. Она использует командлет Get-Process с автоматической переменной $pid, чтобы получить процесс, в котором работает текущий сеанс Windows PowerShell. После этого она использует свойство MainWindowHandle текущего процесса и значение 2, соответствующее значению SW_MINIMIZE. Чтобы восстановить окно, четвертая команда использует для определения положения окна значение 4, что соответствует значению SW_RESTORE. (Положению SW_MAXIMIZE соответствует значение 3.)
Пример 6
C:\PS>Add-Type -MemberDefinition $jsMethod -Name "PrintInfo" -Language JScript Описание ----------- Эта команда использует командлет Add-Type, чтобы добавить в сеанс Windows PowerShell метод из встроенного кода JScript. Для отправки исходного кода, хранящегося в переменной $jsMethod, используется параметр MemberDefinition. Команда использует переменную Name, чтобы задать имя класса, создаваемого с помощью командлета Add-Type для данного метода, и параметр Language, чтобы указать, что используется язык JScript.
Пример 7
C:\PS>Add-Type -Path FSharp.Compiler.CodeDom.dll C:\PS> Add-Type -Path FSharp.Compiler.CodeDom.dll C:\PS> $provider = New-Object Microsoft.FSharp.Compiler.CodeDom.FSharpCodeProvider C:\PS> $fSharpCode = @" let rec loop n = if n <= 0 then () else begin print_endline (string_of_int n); loop (n-1) end "@ C:\PS> $fsharpType = Add-Type -TypeDefinition $fSharpCode -CodeDomProvider $provider -PassThru | where { $_.IsPublic } C:\PS> $fsharpType::loop(4) 4 3 2 1 Описание ----------- В этом примере показано, как с помощью командлета Add-Type добавить в сеанс Windows PowerShell компилятор кода FSharp. Чтобы запустить этот пример в Windows PowerShell, требуется сборка FSharp.Compiler.CodeDom.dll, устанавливаемая вместе с языком FSharp. Первая команда в этом примере использует командлет Add-Type с параметром Path, чтобы задать сборку. Командлет Add-Type получает типы из сборки. Вторая команда использует командлет New-Object, чтобы создать экземпляр поставщика кода FSharp, и сохраняет результат в переменной $provider. Третья команда сохраняет код FSharp, который определяет метод Loop в переменной $FSharpCode. Четвертая команда использует командлет Add-Type, чтобы сохранить в переменной $fSharpType общие типы, определенные в переменной $fSharpCode. Параметр TypeDefinition задает исходный код, в котором определены типы. Параметр CodeDomProvider задает компилятор исходного кода. Параметр PassThru означает, что командлет Add-Type должен вернуть объект Runtime, представляющий типы, а оператор конвейера (|) передает объект Runtime командлету Where-Object, который возвращает только общие типы. Фильтр Where-Object используется потому, что поставщик FSharp создает для поддержки конечного общего типа типы, не являющиеся общими. Пятая команда вызывает метод Loop в качестве статического метода типа, хранящегося в переменной $fSharpType.
См. также