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
.
Статический метод Add
BasicTest использует символы двойной двоеточия (::
) для указания статического элемента класса. Добавляются целые числа и отображается сумма.
Командлет 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-Member
static получает статические свойства и методы класса 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-Type
PassThru.
Командлет 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
По умолчанию этот командлет не возвращает выходные данные.
При использовании параметра PassThru этот командлет возвращает объект System.Type, представляющий новый тип.
Примечания
Добавляемые типы существуют только в текущем сеансе. Чтобы использовать типы во всех сеансах, добавьте их в профиль PowerShell. Дополнительные сведения о профиле см. в about_Profiles.
Имена типов и пространства имен должны быть уникальными в сеансе. Вы не можете выгрузить тип или изменить его. Если вам нужно изменить код для типа, необходимо изменить имя или запустить новый сеанс PowerShell. В противном случае команда завершается ошибкой.
Класс CodeDomProvider для некоторых языков, таких как IronPython и J#, не создает выходные данные. В результате типы, написанные на этих языках, нельзя использовать с Add-Type
.
Этот командлет основан на классе Microsoft .NET Framework CodeDomProvider.
Связанные ссылки
PowerShell