Add-Type
Agrega una clase de Microsoft .NET a una sesión de PowerShell.
Sintaxis
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
El cmdlet Add-Type
permite definir una clase de Microsoft .NET Core en la sesión de PowerShell. A continuación, puede crear instancias de objetos mediante el cmdlet New-Object
y usar los objetos igual que usaría cualquier objeto de .NET Core. Si agrega un comando Add-Type
al perfil de PowerShell, la clase está disponible en todas las sesiones de PowerShell.
Puede especificar el tipo especificando un ensamblado existente o archivos de código fuente, o bien puede especificar el código fuente insertado o guardado en una variable. Incluso puede especificar solo un método y Add-Type
define y genera la clase . En Windows, puede usar esta característica para realizar llamadas de invocación de plataforma (P/Invoke) a funciones no administradas en PowerShell. Si especifica código fuente, Add-Type
compila el código fuente especificado y genera un ensamblado en memoria que contiene los nuevos tipos de .NET Core.
Puede usar los parámetros de Add-Type
para especificar un lenguaje alternativo y un compilador, C# es el valor predeterminado, las opciones del compilador, las dependencias del ensamblado, el espacio de nombres de clase, los nombres del tipo y el ensamblado resultante.
A partir de PowerShell 7, Add-Type
no compila un tipo si ya existe un tipo con el mismo nombre. Además, Add-Type
busca ensamblados en una carpeta ref
en la carpeta que contiene pwsh.dll
.
Ejemplos
Ejemplo 1: Adición de un tipo de .NET a una sesión
En este ejemplo se agrega la clase BasicTest a la sesión especificando el código fuente almacenado en una variable. La clase BasicTest se usa para agregar enteros, crear un objeto y multiplicar enteros.
$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)
La variable $Source
almacena el código fuente de la clase . El tipo tiene un método estático denominado Add
y un método no estático denominado Multiply
.
El cmdlet Add-Type
agrega la clase a la sesión. Dado que usa código fuente insertado, el comando usa el parámetro TypeDefinition para especificar el código en la variable $Source
.
El método estático
El cmdlet New-Object
crea una instancia de la clase BasicTest. Guarda el nuevo objeto en la variable $BasicTestObject
.
$BasicTestObject
usa el método Multiply
. Los enteros se multiplican y se muestra el producto.
Ejemplo 2: Examen de un tipo agregado
En este ejemplo se usa el cmdlet Get-Member
para examinar los objetos que los cmdlets de Add-Type
y New-Object
creados en ejemplo 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()
El cmdlet Get-Member
revela que es un objeto System.RuntimeType, que se deriva de la clase System.Object.
El parámetro Add
.
El cmdlet Get-Member
obtiene los miembros del objeto almacenados en la variable $BasicTestObject
.
$BasicTestObject
es una instancia de la clase BasicTest y que incluye un miembro denominado Multiply
.
Ejemplo 3: Agregar tipos de un ensamblado
En este ejemplo se agregan las clases del ensamblado NJsonSchema.dll
a la sesión actual.
Set-Location -Path $PSHOME
$AccType = Add-Type -AssemblyName *jsonschema* -PassThru
La variable $AccType
almacena un objeto creado con el cmdlet Add-Type
.
Add-Type
usa el parámetro AssemblyName para especificar el nombre del ensamblado. El carácter comodín asterisco (*
) le permite obtener el ensamblado correcto incluso cuando no está seguro del nombre o su ortografía. El parámetro PassThru genera objetos que representan las clases que se agregan a la sesión.
Ejemplo 4: Llamada a las API nativas de Windows
En este ejemplo se muestra cómo llamar a las API nativas de Windows en PowerShell.
Add-Type
usa el mecanismo de invocación de plataforma (P/Invoke) para llamar a una función en User32.dll
desde PowerShell. Este ejemplo solo funciona en equipos que ejecutan el sistema operativo 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)
La variable $Signature
almacena la firma de C# de la función ShowWindowAsync
. Para asegurarse de que el método resultante está visible en una sesión de PowerShell, la palabra clave public
se agregó a la firma estándar. Para obtener más información, vea función showWindowAsync.
La variable Add-Type
agrega la función ShowWindowAsync
a la sesión de PowerShell como método estático. El comando usa el parámetro MemberDefinition para especificar la definición del método guardada en la variable $Signature
. El comando usa los parámetros Name y Namespace para especificar un nombre y un espacio de nombres para la clase . El parámetro PassThru genera un objeto que representa los tipos.
El nuevo ShowWindowAsync
método estático se usa en los comandos para minimizar y restaurar la consola de PowerShell. El método toma dos parámetros: el identificador de ventana y un entero que especifica cómo se muestra la ventana.
Para minimizar la consola de PowerShell, ShowWindowAsync
usa el cmdlet Get-Process
con la variable automática $PID
para obtener el proceso que hospeda la sesión actual de PowerShell. A continuación, usa la propiedad mainWindowHand le del proceso actual y un valor de 2
, que representa el valor de SW_MINIMIZE
.
Para restaurar la ventana, ShowWindowAsync
usa un valor de 4
para la posición de la ventana, que representa el valor de SW_RESTORE
.
Para maximizar la ventana, use el valor de 3
que representa SW_MAXIMIZE
.
Parámetros
-AssemblyName
Especifica el nombre de un ensamblado que incluye los tipos.
Add-Type
toma los tipos del ensamblado especificado. Este parámetro es necesario cuando se crean tipos basados en un nombre de ensamblado.
Escriba el nombre completo o simple, también conocido como nombre parcial, de un ensamblado. Se permiten caracteres comodín en el nombre del ensamblado. Si escribe un nombre simple o parcial, Add-Type
lo resuelve en el nombre completo y, a continuación, usa el nombre completo para cargar el ensamblado.
El uso de los parámetros Path o LiteralPath garantiza que está cargando el ensamblado que pretende cargar. Cuando se usa el parámetro AssemblyName, PowerShell pide a .NET que resuelva el nombre del ensamblado mediante el proceso de resolución de ensamblados de .NET estándar. Dado que .NET busca primero la carpeta de la aplicación, Add-Type
podría cargar un ensamblado desde $PSHOME
en lugar de la versión de la carpeta actual. Para obtener más información, vea Ubicación del ensamblado.
Si .NET no puede resolver el nombre, PowerShell busca en la ubicación actual para encontrar el ensamblado. Cuando se usan caracteres comodín en el parámetro AssemblyName, el proceso de resolución de ensamblados de .NET produce un error que hace que PowerShell busque en la ubicación actual.
Tipo: | String[] |
Alias: | AN |
Posición: | Named |
Valor predeterminado: | None |
Requerido: | True |
Aceptar entrada de canalización: | False |
Aceptar caracteres comodín: | True |
-CompilerOptions
Especifica las opciones del compilador de código fuente. Estas opciones se envían al compilador sin revisión.
Este parámetro permite dirigir al compilador para generar un archivo ejecutable, insertar recursos o establecer opciones de línea de comandos, como la opción /unsafe
.
Tipo: | String[] |
Posición: | Named |
Valor predeterminado: | None |
Requerido: | False |
Aceptar entrada de canalización: | False |
Aceptar caracteres comodín: | False |
-IgnoreWarnings
Omite las advertencias del compilador. Use este parámetro para evitar que Add-Type
controle las advertencias del compilador como errores.
Tipo: | SwitchParameter |
Posición: | Named |
Valor predeterminado: | False |
Requerido: | False |
Aceptar entrada de canalización: | False |
Aceptar caracteres comodín: | False |
-Language
Especifica el idioma que se usa en el código fuente. El valor aceptable para este parámetro es CSharp
.
Tipo: | Language |
Valores aceptados: | CSharp |
Posición: | Named |
Valor predeterminado: | CSharp |
Requerido: | False |
Aceptar entrada de canalización: | False |
Aceptar caracteres comodín: | False |
-LiteralPath
Especifica la ruta de acceso a archivos de código fuente o archivos DLL de ensamblado que contienen los tipos. A diferencia de path, el valor del parámetro LiteralPath se usa exactamente como se escribe. No se interpreta ningún carácter como caracteres comodín. Si la ruta de acceso incluye caracteres de escape, escríbala entre comillas simples. Las comillas simples indican a PowerShell que no interprete ningún carácter como secuencias de escape.
El uso de los parámetros Path o LiteralPath garantiza que está cargando el ensamblado que pretende cargar.
Tipo: | String[] |
Alias: | PSPath, LP |
Posición: | Named |
Valor predeterminado: | None |
Requerido: | True |
Aceptar entrada de canalización: | False |
Aceptar caracteres comodín: | False |
-MemberDefinition
Especifica nuevas propiedades o métodos para la clase .
Add-Type
genera el código de plantilla necesario para admitir las propiedades o métodos.
En Windows, puede usar esta característica para realizar llamadas de invocación de plataforma (P/Invoke) a funciones no administradas en PowerShell.
Tipo: | String[] |
Posición: | 1 |
Valor predeterminado: | None |
Requerido: | True |
Aceptar entrada de canalización: | False |
Aceptar caracteres comodín: | False |
-Name
Especifica el nombre de la clase que se va a crear. Este parámetro es necesario al generar un tipo a partir de una definición de miembro.
El nombre de tipo y el espacio de nombres deben ser únicos dentro de una sesión. No se puede descargar un tipo ni cambiarlo. Para cambiar el código de un tipo, debe cambiar el nombre o iniciar una nueva sesión de PowerShell. De lo contrario, se produce un error en el comando.
Tipo: | String |
Posición: | 0 |
Valor predeterminado: | None |
Requerido: | True |
Aceptar entrada de canalización: | False |
Aceptar caracteres comodín: | False |
-Namespace
Especifica un espacio de nombres para el tipo.
Si este parámetro no se incluye en el comando , el tipo se crea en el espacio de nombres Microsoft.PowerShell.Commands.AddType.AutoGeneratedTypes. Si el parámetro se incluye en el comando con un valor de cadena vacío o un valor de $Null
, el tipo se genera en el espacio de nombres global.
Tipo: | String |
Alias: | NS |
Posición: | Named |
Valor predeterminado: | None |
Requerido: | False |
Aceptar entrada de canalización: | False |
Aceptar caracteres comodín: | False |
-OutputAssembly
Genera un archivo DLL para el ensamblado con el nombre especificado en la ubicación. Escriba una ruta de acceso opcional y un nombre de archivo. Se permiten caracteres comodín. De forma predeterminada, Add-Type
genera el ensamblado solo en memoria.
Tipo: | String |
Alias: | OA |
Posición: | Named |
Valor predeterminado: | None |
Requerido: | False |
Aceptar entrada de canalización: | False |
Aceptar caracteres comodín: | True |
-OutputType
Especifica el tipo de salida del ensamblado de salida. De forma predeterminada, no se especifica ningún tipo de salida. Este parámetro solo es válido cuando se especifica un ensamblado de salida en el comando . Para obtener más información sobre los valores, vea OutputAssemblyType (enumeración).
Los valores aceptables para este parámetro son los siguientes:
ConsoleApplication
Library
WindowsApplication
Importante
A partir de PowerShell 7.1, no se admiten
Tipo: | OutputAssemblyType |
Alias: | OT |
Valores aceptados: | ConsoleApplication, Library, WindowsApplication |
Posición: | Named |
Valor predeterminado: | None |
Requerido: | False |
Aceptar entrada de canalización: | False |
Aceptar caracteres comodín: | False |
-PassThru
Devuelve un objeto System.Runtime que representa los tipos que se agregaron. De forma predeterminada, este cmdlet no genera ninguna salida.
Tipo: | SwitchParameter |
Posición: | Named |
Valor predeterminado: | False |
Requerido: | False |
Aceptar entrada de canalización: | False |
Aceptar caracteres comodín: | False |
-Path
Especifica la ruta de acceso a archivos de código fuente o archivos DLL de ensamblado que contienen los tipos.
Si envía archivos de código fuente, Add-Type
compila el código en los archivos y crea un ensamblado en memoria de los tipos. La extensión de archivo especificada en el valor de Path determina el compilador que Add-Type
usa.
El uso de los parámetros Path o LiteralPath garantiza que está cargando el ensamblado que pretende cargar.
Tipo: | String[] |
Posición: | 0 |
Valor predeterminado: | None |
Requerido: | True |
Aceptar entrada de canalización: | False |
Aceptar caracteres comodín: | False |
-ReferencedAssemblies
Especifica los ensamblados en los que depende el tipo. De forma predeterminada, Add-Type
hace referencia a System.dll
y System.Management.Automation.dll
. Se hace referencia a los ensamblados que especifique mediante este parámetro, además de los ensamblados predeterminados.
A partir de PowerShell 6, ensamblados a los que se hace referencia no incluye los ensamblados de .NET predeterminados. Debe incluir una referencia específica a ellos en el valor pasado a este parámetro.
Tipo: | String[] |
Alias: | RA |
Posición: | Named |
Valor predeterminado: | None |
Requerido: | False |
Aceptar entrada de canalización: | False |
Aceptar caracteres comodín: | False |
-TypeDefinition
Especifica el código fuente que contiene las definiciones de tipo. Escriba el código fuente en una cadena o una cadena aquí, o escriba una variable que contenga el código fuente. Para obtener más información sobre las cadenas aquí, vea about_Quoting_Rules.
Incluya una declaración de espacio de nombres en la definición de tipo. Si omite la declaración de espacio de nombres, es posible que el tipo tenga el mismo nombre que otro tipo o el acceso directo para otro tipo, lo que provoca una sobrescritura involuntaria. Por ejemplo, si define un tipo denominado Exception, se producirá un error en los scripts que usan Exception como acceso directo para System.Exception.
Tipo: | String |
Posición: | 0 |
Valor predeterminado: | None |
Requerido: | True |
Aceptar entrada de canalización: | False |
Aceptar caracteres comodín: | False |
-UsingNamespace
Especifica otros espacios de nombres necesarios para la clase . Esto es muy similar a la palabra clave de C#, Using
.
De forma predeterminada, Add-Type
hace referencia al espacio de nombres System. Cuando se usa el parámetro MemberDefinition, Add-Type
también hace referencia al espacio de nombres System.Runtime.InteropServices de forma predeterminada. Se hace referencia a los espacios de nombres que agregue mediante el parámetro using UsingNamespace, además de los espacios de nombres predeterminados.
Tipo: | String[] |
Alias: | Using |
Posición: | Named |
Valor predeterminado: | System namespace |
Requerido: | False |
Aceptar entrada de canalización: | False |
Aceptar caracteres comodín: | False |
Entradas
None
No se pueden canalizar objetos a este cmdlet.
Salidas
None
De forma predeterminada, este cmdlet no devuelve ninguna salida.
Cuando se usa el parámetro PassThru, este cmdlet devuelve un objeto System.Type que representa el nuevo tipo.
Notas
Los tipos que agregue solo existen en la sesión actual. Para usar los tipos de todas las sesiones, agréguelos al perfil de PowerShell. Para obtener más información sobre el perfil, consulte about_Profiles.
Los nombres de tipo y los espacios de nombres deben ser únicos dentro de una sesión. No se puede descargar un tipo ni cambiarlo. Si necesita cambiar el código de un tipo, debe cambiar el nombre o iniciar una nueva sesión de PowerShell. De lo contrario, se produce un error en el comando.
En Windows PowerShell (versión 5.1 y posteriores), debe usar Add-Type
para cualquier elemento que aún no esté cargado. Normalmente, esto se aplica a los ensamblados que se encuentran en la caché global de ensamblados (GAC).
En PowerShell 6 y versiones posteriores, no hay ninguna GAC, por lo que PowerShell instala sus propios ensamblados en $PSHOME
.
Estos ensamblados se cargan automáticamente a petición, por lo que no es necesario usar Add-Type
para cargarlos. Sin embargo, el uso de Add-Type
todavía está permitido permitir que los scripts sean implícitamente compatibles con cualquier versión de PowerShell.
Los ensamblados de la GAC se pueden cargar por nombre de tipo, en lugar de por ruta de acceso. La carga de ensamblados desde una ruta de acceso arbitraria requiere Add-Type
, ya que esos ensamblados no se pueden cargar automáticamente.