Share via


Add-Type

Adiciona uma classe do Microsoft .NET a uma sessão do PowerShell.

Syntax

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

Description

O Add-Type cmdlet permite definir uma classe do Microsoft .NET Core em sua sessão do PowerShell. Em seguida, você pode instanciar objetos usando o New-Object cmdlet e usar os objetos da mesma forma que usaria qualquer objeto .NET Core. Se você adicionar um Add-Type comando ao seu perfil do PowerShell, a classe estará disponível em todas as sessões do PowerShell.

Você pode especificar o tipo especificando um assembly existente ou arquivos de código-fonte, ou você pode especificar o código-fonte embutido ou salvo em uma variável. Você pode até mesmo especificar apenas um método e Add-Type define e gera a classe . No Windows, você pode usar esse recurso para fazer chamadas P/Invoke (Invocação de Plataforma) para funções não gerenciadas no PowerShell. Se você especificar o código-fonte, Add-Type compilará o código-fonte especificado e gerará um assembly na memória que contém os novos tipos do .NET Core.

Você pode usar os parâmetros de Add-Type para especificar uma linguagem e um compilador alternativos, C# é o padrão, opções do compilador, dependências de assembly, o namespace de classe, os nomes do tipo e o assembly resultante.

A partir do PowerShell 7, Add-Type não compila um tipo se já existir um tipo com o mesmo nome. Além disso, Add-Type procura assemblies em uma ref pasta na pasta que contém pwsh.dll.

Exemplos

Exemplo 1: adicionar um tipo .NET a uma sessão

Este exemplo adiciona a classe BasicTest à sessão especificando o código-fonte armazenado em uma variável. A classe BasicTest é usada para adicionar inteiros, criar um objeto e multiplicar inteiros.

$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)

A $Source variável armazena o código-fonte da classe . O tipo tem um método estático chamado Add e um método não estático chamado Multiply.

O Add-Type cmdlet adiciona a classe à sessão. Como ele está usando o código-fonte embutido, o comando usa o parâmetro TypeDefinition para especificar o código na $Source variável.

O Add método estático da classe BasicTest usa os caracteres de dois-pontos (::) para especificar um membro estático da classe . Os inteiros são adicionados e a soma é exibida.

O New-Object cmdlet cria uma instância da classe BasicTest . Ele salva o novo objeto na $BasicTestObject variável .

$BasicTestObject usa o Multiply método . Os inteiros são multiplicados e o produto é exibido.

Exemplo 2: examinar um tipo adicionado

Este exemplo usa o Get-Member cmdlet para examinar os objetos que os Add-Type cmdlets e New-Object criaram no Exemplo 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()

O Get-Member cmdlet obtém o tipo e os membros da classe BasicTest que Add-Type foram adicionados à sessão. O Get-Member comando revela que é um objeto System.RuntimeType , que é derivado da classe System.Object .

O Get-Member parâmetro Static obtém as propriedades estáticas e os métodos da classe BasicTest. A saída mostra que o Add método está incluído.

O Get-Member cmdlet obtém os membros do objeto armazenado na $BasicTestObject variável . $BasicTestObject foi criado usando o New-Object cmdlet com a classe BasicTest . A saída revela que o valor da $BasicTestObject variável é uma instância da classe BasicTest e que inclui um membro chamado Multiply.

Exemplo 3: Adicionar tipos de um assembly

Este exemplo adiciona as classes do NJsonSchema.dll assembly à sessão atual.

Set-Location -Path $PSHOME
$AccType = Add-Type -AssemblyName *jsonschema* -PassThru

Set-Location usa o parâmetro Path para especificar a $PSHOME variável. A variável faz referência ao diretório de instalação do PowerShell em que o arquivo DLL está localizado.

A $AccType variável armazena um objeto criado com o Add-Type cmdlet . Add-Type usa o parâmetro AssemblyName para especificar o nome do assembly. O caractere curinga asterisco (*) permite que você obtenha o assembly correto mesmo quando não tiver certeza do nome ou da ortografia. O parâmetro PassThru gera objetos que representam as classes adicionadas à sessão.

Exemplo 4: Chamar APIs nativas do Windows

Este exemplo demonstra como chamar APIs nativas do Windows no PowerShell. Add-Type usa o mecanismo P/Invoke (Invocação de Plataforma) para chamar uma função no User32.dll do PowerShell. Este exemplo só funciona em computadores que executam o sistema operacional Windows.

$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 PowerShell console

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

# Restore the PowerShell console

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

A $Signature variável armazena a assinatura C# da ShowWindowAsync função. Para garantir que o método resultante esteja visível em uma sessão do PowerShell, o public palavra-chave foi adicionado à assinatura padrão. Para obter mais informações, consulte Função ShowWindowAsync.

A $ShowWindowAsync variável armazena o objeto criado pelo Add-Type parâmetro PassThru. O Add-Type cmdlet adiciona a ShowWindowAsync função à sessão do PowerShell como um método estático. O comando usa o parâmetro MemberDefinition para especificar a definição de método salva na $Signature variável . O comando usa os parâmetros Name e Namespace para especificar um nome e um namespace para a classe. O parâmetro PassThru gera um objeto que representa os tipos.

O novo ShowWindowAsync método estático é usado nos comandos para minimizar e restaurar o console do PowerShell. O método usa dois parâmetros: o identificador de janela e um inteiro que especifica como a janela é exibida.

Para minimizar o console do PowerShell, ShowWindowAsync o usa o Get-Process cmdlet com a $PID variável automática para obter o processo que está hospedando a sessão atual do PowerShell. Em seguida, ele usa a propriedade MainWindowHandle do processo atual e um valor de 2, que representa o SW_MINIMIZE valor.

Para restaurar a janela, ShowWindowAsync usa um valor de 4 para a posição da janela, que representa o SW_RESTORE valor.

Para maximizar a janela, use o valor de 3 que representa SW_MAXIMIZE.

Parâmetros

-AssemblyName

Especifica o nome de um assembly que inclui os tipos. Add-Type usa os tipos do assembly especificado. Esse parâmetro é necessário quando você está criando tipos com base em um nome de assembly.

Insira o nome completo ou simples, também conhecido como nome parcial, de um assembly. Caracteres curinga são permitidos no nome do assembly. Se você inserir um nome simples ou parcial, Add-Type o resolverá para o nome completo e usará o nome completo para carregar o assembly.

Esse parâmetro não aceita um caminho ou um nome de arquivo. Para inserir o caminho para o arquivo DLL (biblioteca de vínculo dinâmico) do assembly, use o parâmetro Path .

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

-CompilerOptions

Especifica as opções para o compilador de código fonte. Essas opções são enviadas sem revisão para o compilador.

Esse parâmetro permite que você direcione o compilador para gerar um arquivo executável, inserir recursos ou definir opções de linha de comando, como a opção /unsafe .

Não é possível usar os parâmetros CompilerOptions e ReferencedAssemblies no mesmo comando.

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

-IgnoreWarnings

Ignora os avisos do compilador. Use esse parâmetro para impedir o Add-Type tratamento de avisos do compilador como erros.

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

-Language

Especifica a linguagem usada no código-fonte. O valor aceitável para esse parâmetro é

  • CSharp
Type:Language
Accepted values:CSharp
Position:Named
Default value:CSharp
Required:False
Accept pipeline input:False
Accept wildcard characters:False

-LiteralPath

Especifica o caminho para arquivos de código fonte ou arquivos DLL de assembly que contêm os tipos. Ao contrário de Path, o valor do parâmetro LiteralPath é usado exatamente como ele é digitado. Nenhum caractere é interpretado como caractere curinga. Se o caminho incluir caracteres de escape, coloque-o entre aspas simples. Aspas simples dizem ao PowerShell para não interpretar nenhum caractere como sequências de escape.

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

-MemberDefinition

Especifica novas propriedades ou métodos para a classe. Add-Type gera o código de modelo necessário para dar suporte às propriedades ou métodos.

No Windows, você pode usar esse recurso para fazer chamadas P/Invoke (Invocação de Plataforma) para funções não gerenciadas no PowerShell.

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

-Name

Especifica o nome da classe a ser criada. Esse parâmetro é necessário ao gerar um tipo por meio de uma definição de membro.

O nome do tipo e o namespace devem ser exclusivos dentro de uma sessão. Não é possível descarregar um tipo ou alterá-lo. Para alterar o código de um tipo, você deve alterar o nome ou iniciar uma nova sessão do PowerShell. Caso contrário, o comando falhará.

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

-Namespace

Especifica um namespace para o tipo.

Se esse parâmetro não estiver incluído no comando, o tipo será criado no namespace Microsoft.PowerShell.Commands.AddType.AutoGeneratedTypes . Se o parâmetro estiver incluído no comando com um valor de cadeia de caracteres vazio ou um valor de $Null, o tipo será gerado no namespace global.

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

-OutputAssembly

Gera um arquivo DLL para o assembly com o nome especificado no local. Insira um caminho opcional e um nome de arquivo. Caracteres curinga são permitidos. Por padrão, Add-Type gera o assembly somente na memória.

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

-OutputType

Especifica o tipo de saída do assembly de saída. Por padrão, nenhum tipo de saída é especificado. Este parâmetro é válido somente quando um assembly de saída é especificado no comando. Para obter mais informações sobre os valores, consulte OutputAssemblyType Enumeration.

Os valores aceitáveis para esse parâmetro são os seguintes:

  • ConsoleApplication
  • Library
  • WindowsApplication

Importante

A partir do PowerShell 7.1, ConsoleApplication e WindowsApplication não têm suporte e o PowerShell gera um erro de encerramento se um deles for especificado como valores para o parâmetro OutputType .

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

Retorna um objeto System.Runtime que representa os tipos adicionados. Por padrão, esse cmdlet não gera nenhuma saída.

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

-Path

Especifica o caminho para arquivos de código fonte ou arquivos DLL de assembly que contêm os tipos.

Se você enviar arquivos de código-fonte, Add-Type compila o código nos arquivos e cria um assembly na memória dos tipos. A extensão de arquivo especificada no valor de Path determina o compilador que Add-Type usa.

Se você enviar um arquivo de assembly, Add-Type usará os tipos do assembly. Para especificar um assembly na memória ou o cache de assembly global, use o parâmetro AssemblyName.

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

-ReferencedAssemblies

Especifica os assemblies dos quais depende o tipo. Por padrão, Add-Type referências System.dll e System.Management.Automation.dll. Os assemblies que você especificar usando esse parâmetro são referenciados além os assemblies padrão.

A partir do PowerShell 6, ReferencedAssemblies não inclui os assemblies .NET padrão. Você deve incluir uma referência específica a eles no valor passado para esse parâmetro.

Não é possível usar os parâmetros CompilerOptions e ReferencedAssemblies no mesmo comando.

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

-TypeDefinition

Especifica o código-fonte que contém as definições de tipo. Insira o código-fonte em uma cadeia de caracteres ou cadeia de caracteres here, ou insira uma variável que contenha o código-fonte. Para obter mais informações sobre cadeias de caracteres aqui, consulte about_Quoting_Rules.

Inclua uma declaração de namespace em sua definição de tipo. Se você omitir a declaração de namespace, seu tipo pode ter o mesmo nome que outro tipo ou o atalho para outro tipo, causando uma substituição não intencional. Por exemplo, se você definir um tipo chamado Exceção, os scripts que usam Exceção como atalho para System.Exception falharão.

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

-UsingNamespace

Especifica outros namespaces que são necessários para a classe. Isso é muito parecido com o palavra-chave C#, Using.

Por padrão, Add-Type faz referência ao namespace Sistema . Quando o parâmetro MemberDefinition é usado, Add-Type também faz referência ao namespace System.Runtime.InteropServices por padrão. Os namespaces que você adiciona usando o parâmetro UsingNamespace são mencionados além dos namespaces padrão.

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

Entradas

None

Não é possível enviar objetos pelo pipeline para Add-Type.

Saídas

None or System.Type

Quando você usa o parâmetro PassThru , Add-Type retorna um objeto System.Type que representa o novo tipo. Caso contrário, esse cmdlet não gerará nenhuma saída.

Observações

Os tipos que você adiciona existem apenas na sessão atual. Para usar os tipos em todas as sessões, adicione-os ao seu perfil do PowerShell. Para obter mais informações sobre o perfil, consulte about_Profiles.

Nomes de tipo e namespaces devem ser exclusivos em uma sessão. Não é possível descarregar um tipo ou alterá-lo. Se você precisar alterar o código de um tipo, deverá alterar o nome ou iniciar uma nova sessão do PowerShell. Caso contrário, o comando falhará.

No Windows PowerShell (versão 5.1 e inferior), você precisa usar Add-Type para qualquer coisa que ainda não esteja carregada. Mais comumente, isso se aplica a assemblies encontrados no GAC (Cache de Assembly Global). No PowerShell 6 e superior, não há GAC, portanto, o PowerShell instala seus próprios assemblies no $PSHome. Esses assemblies são carregados automaticamente na solicitação, portanto, não há necessidade de usá-los Add-Type para carregá-los. No entanto, o uso Add-Type de ainda tem permissão para permitir que os scripts sejam implicitamente compatíveis com qualquer versão do PowerShell.

Assemblies no GAC podem ser carregados por nome de tipo, em vez de por caminho. Carregar assemblies de um caminho arbitrário requer Add-Type, pois esses assemblies não podem ser carregados automaticamente.