Добавляет тип (класс) 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.






См. также




Содержание