Add-Type
Aggiunge una classe Microsoft .NET a una sessione di PowerShell.
Sintassi
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>]
Descrizione
Il Add-Type
cmdlet consente di definire una classe Microsoft .NET Core nella sessione di PowerShell. È quindi possibile creare un'istanza di oggetti usando il New-Object
cmdlet e usare gli oggetti esattamente come si userebbe qualsiasi oggetto .NET Core. Se si aggiunge un Add-Type
comando al profilo di PowerShell, la classe è disponibile in tutte le sessioni di PowerShell.
È possibile specificare il tipo specificando un assembly o file di codice sorgente esistenti o possibile specificare il codice sorgente inline o salvato in una variabile. È anche possibile specificare solo un metodo e Add-Type
definire e generare la classe . In Windows è possibile usare questa funzionalità per effettuare chiamate Platform Invoke (P/Invoke) a funzioni non gestite in PowerShell. Se si specifica il codice sorgente, Add-Type
compila il codice sorgente specificato e genera un assembly in memoria contenente i nuovi tipi .NET Core.
È possibile usare i parametri di Add-Type
per specificare un linguaggio e un compilatore alternativi, C# è il valore predefinito, le opzioni del compilatore, le dipendenze dell'assembly, lo spazio dei nomi della classe, i nomi del tipo e l'assembly risultante.
A partire da PowerShell 7, Add-Type
non compila un tipo se esiste già un tipo con lo stesso nome. Add-Type
Cerca anche gli assembly in una ref
cartella nella cartella che contiene pwsh.dll
.
Esempio
Esempio 1: Aggiungere un tipo .NET a una sessione
In questo esempio viene aggiunta la classe BasicTest alla sessione specificando il codice sorgente archiviato in una variabile. La classe BasicTest viene usata per aggiungere numeri interi, creare un oggetto e moltiplicare i numeri interi.
$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 $Source
variabile archivia il codice sorgente per la classe . Il tipo ha un metodo statico denominato Add
e un metodo non statico denominato Multiply
.
Il Add-Type
cmdlet aggiunge la classe alla sessione. Poiché usa il codice sorgente inline, il comando usa il parametro TypeDefinition per specificare il codice nella $Source
variabile.
Il Add
metodo statico della classe BasicTest utilizza i caratteri a due punti (::
) per specificare un membro statico della classe . I numeri interi vengono aggiunti e viene visualizzata la somma.
Il New-Object
cmdlet crea un'istanza della classe BasicTest . Salva il nuovo oggetto nella $BasicTestObject
variabile .
$BasicTestObject
utilizza il Multiply
metodo . I numeri interi vengono moltiplicati e il prodotto viene visualizzato.
Esempio 2: Esaminare un tipo aggiunto
In questo esempio viene usato il Get-Member
cmdlet per esaminare gli oggetti creati dai cmdlet e New-Object
nell'esempio Add-Type
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()
Il Get-Member
cmdlet ottiene il tipo e i membri della classe BasicTest che Add-Type
ha aggiunto alla sessione. Il Get-Member
comando rivela che si tratta di un oggetto System.RuntimeType derivato dalla classe System.Object .
Il Get-Member
parametro Static ottiene le proprietà statiche e i metodi della classe BasicTest . L'output mostra che il Add
metodo è incluso.
Il Get-Member
cmdlet ottiene i membri dell'oggetto archiviato nella $BasicTestObject
variabile .
$BasicTestObject
è stato creato usando il New-Object
cmdlet con la classe BasicTest . L'output rivela che il valore della variabile è un'istanza della $BasicTestObject
classe BasicTest e che include un membro denominato Multiply
.
Esempio 3: Aggiungere tipi da un assembly
In questo esempio vengono aggiunte le classi dall'assembly JsonSchema.NET.dll
alla sessione corrente.
Set-Location -Path $PSHOME
$AccType = Add-Type -AssemblyName *jsonschema* -PassThru
Set-Location
usa il parametro Path per specificare la $PSHOME
variabile. La variabile fa riferimento alla directory di installazione di PowerShell in cui si trova il file DLL.
La $AccType
variabile archivia un oggetto creato con il Add-Type
cmdlet . Add-Type
utilizza il parametro AssemblyName per specificare il nome dell'assembly. Il carattere jolly asterisco (*
) consente di ottenere l'assembly corretto anche quando non si è certi del nome o del relativo ortografia. Il parametro PassThru genera oggetti che rappresentano le classi aggiunte alla sessione.
Esempio 4: Chiamare API Di Windows native
In questo esempio viene illustrato come chiamare API Windows native in PowerShell. Add-Type
usa il meccanismo Platform Invoke (P/Invoke) per chiamare una funzione in User32.dll
da PowerShell. Questo esempio funziona solo nei computer che eseguono il 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 $Signature
variabile archivia la firma C# della ShowWindowAsync
funzione. Per assicurarsi che il metodo risultante sia visibile in una sessione di PowerShell, la public
parola chiave è stata aggiunta alla firma standard. Per altre informazioni, vedere Funzione ShowWindowAsync .
La $ShowWindowAsync
variabile archivia l'oggetto creato dal Add-Type
parametro PassThru .
Il Add-Type
cmdlet aggiunge la ShowWindowAsync
funzione alla sessione di PowerShell come metodo statico. Il comando usa il parametro MemberDefinition per specificare la definizione del metodo salvata nella $Signature
variabile . Il comando usa i parametri Name e Namespace per specificare un nome e uno spazio dei nomi per la classe . Il parametro PassThru genera un oggetto che rappresenta i tipi.
Il nuovo ShowWindowAsync
metodo statico viene usato nei comandi per ridurre al minimo e ripristinare la console di PowerShell. Il metodo accetta due parametri: l'handle della finestra e un numero intero che specifica la modalità di visualizzazione della finestra.
Per ridurre al minimo la console di PowerShell, ShowWindowAsync
usa il Get-Process
cmdlet con la $PID
variabile automatica per ottenere il processo che ospita la sessione di PowerShell corrente. Usa quindi la proprietà MainWindowHandle del processo corrente e il valore 2
, che rappresenta il SW_MINIMIZE
valore .
Per ripristinare la finestra, ShowWindowAsync
usa un valore di 4
per la posizione della finestra, che rappresenta il SW_RESTORE
valore .
Per ingrandire la finestra, usare il valore di 3
che rappresenta SW_MAXIMIZE
.
Parametri
-AssemblyName
Specifica il nome di un assembly che include i tipi. Add-Type
accetta i tipi dall'assembly specificato. Questo parametro è obbligatorio quando si creano tipi in base a un nome di assembly.
Immettere il nome completo o semplice, noto anche come nome parziale, di un assembly. Nel nome dell'assembly sono consentiti i caratteri jolly. Se si immette un nome semplice o parziale, Add-Type
lo risolve nel nome completo e quindi usa il nome completo per caricare l'assembly.
L'uso dei parametri Path o LiteralPath garantisce il caricamento dell'assembly da caricare. Quando si usa il parametro AssemblyName , PowerShell chiede a .NET di risolvere il nome dell'assembly usando il processo di risoluzione dell'assembly .NET standard. Poiché .NET cerca prima la cartella dell'applicazione, Add-Type
potrebbe caricare un assembly da $PSHOME
anziché dalla versione nella cartella corrente. Per altre informazioni, vedere Percorso assembly.
Se .NET non riesce a risolvere il nome, PowerShell cerca nel percorso corrente per trovare l'assembly. Quando si usano caratteri jolly nel parametro AssemblyName , il processo di risoluzione dell'assembly .NET non riesce causando l'individuazione di PowerShell nella posizione corrente.
Tipo: | String[] |
Alias: | AN |
Posizione: | Named |
Valore predefinito: | None |
Necessario: | True |
Accettare l'input della pipeline: | False |
Accettare caratteri jolly: | True |
-CompilerOptions
Specifica le opzioni per il compilatore del codice sorgente. Queste opzioni vengono inviate al compilatore senza revisione.
Questo parametro consente di indirizzare il compilatore a generare un file eseguibile, incorporare risorse o impostare le opzioni della riga di comando, ad esempio l'opzione /unsafe
.
Tipo: | String[] |
Posizione: | Named |
Valore predefinito: | None |
Necessario: | False |
Accettare l'input della pipeline: | False |
Accettare caratteri jolly: | False |
-IgnoreWarnings
Ignora gli avvisi del compilatore. Usare questo parametro per impedire Add-Type
la gestione degli avvisi del compilatore come errori.
Tipo: | SwitchParameter |
Posizione: | Named |
Valore predefinito: | False |
Necessario: | False |
Accettare l'input della pipeline: | False |
Accettare caratteri jolly: | False |
-Language
Specifica il linguaggio usato nel codice sorgente. Il valore accettabile per questo parametro è CSharp
.
Tipo: | Language |
Valori accettati: | CSharp |
Posizione: | Named |
Valore predefinito: | CSharp |
Necessario: | False |
Accettare l'input della pipeline: | False |
Accettare caratteri jolly: | False |
-LiteralPath
Specifica il percorso dei file del codice sorgente o dei file DLL dell'assembly che contengono i tipi. A differenza di Path, il valore del parametro LiteralPath viene usato esattamente come viene digitato. Nessun carattere viene interpretato come carattere jolly. Se il percorso include caratteri di escape, racchiuderlo tra virgolette singole. Le virgolette singole indicano a PowerShell di non interpretare alcun carattere come sequenze di escape.
L'uso dei parametri Path o LiteralPath garantisce il caricamento dell'assembly da caricare.
Tipo: | String[] |
Alias: | PSPath, LP |
Posizione: | Named |
Valore predefinito: | None |
Necessario: | True |
Accettare l'input della pipeline: | False |
Accettare caratteri jolly: | False |
-MemberDefinition
Specifica nuovi metodi o proprietà per la classe. Add-Type
genera il codice del modello necessario per supportare le proprietà o i metodi.
In Windows è possibile usare questa funzionalità per effettuare chiamate Platform Invoke (P/Invoke) a funzioni non gestite in PowerShell.
Tipo: | String[] |
Posizione: | 1 |
Valore predefinito: | None |
Necessario: | True |
Accettare l'input della pipeline: | False |
Accettare caratteri jolly: | False |
-Name
Specifica il nome della classe da creare. Questo parametro è obbligatorio durante la generazione di un tipo da una definizione del membro.
Il nome del tipo e lo spazio dei nomi devono essere univoci all'interno di una sessione. Non è possibile scaricare un tipo o modificarlo. Per modificare il codice per un tipo, è necessario modificare il nome o avviare una nuova sessione di PowerShell. In caso contrario, il comando non riesce.
Tipo: | String |
Posizione: | 0 |
Valore predefinito: | None |
Necessario: | True |
Accettare l'input della pipeline: | False |
Accettare caratteri jolly: | False |
-Namespace
Specifica uno spazio dei nomi per il tipo.
Se questo parametro non è incluso nel comando, il tipo viene creato nello spazio dei nomi Microsoft.PowerShell.Commands.AddType.AutoGeneratedTypes . Se il parametro è incluso nel comando con un valore stringa vuoto o un valore di $Null
, il tipo viene generato nello spazio dei nomi globale.
Tipo: | String |
Alias: | NS |
Posizione: | Named |
Valore predefinito: | None |
Necessario: | False |
Accettare l'input della pipeline: | False |
Accettare caratteri jolly: | False |
-OutputAssembly
Genera un file DLL per l'assembly con il nome specificato nel percorso. Immettere un percorso e un nome file facoltativi. I caratteri jolly sono consentiti. Per impostazione predefinita, Add-Type
genera l'assembly solo in memoria.
Tipo: | String |
Alias: | OA |
Posizione: | Named |
Valore predefinito: | None |
Necessario: | False |
Accettare l'input della pipeline: | False |
Accettare caratteri jolly: | True |
-OutputType
Specifica il tipo di output dell'assembly di output. Per impostazione predefinita, non è specificato alcun tipo di output. Questo parametro è valido solo quando viene specificato un assembly di output nel comando. Per altre informazioni sui valori, vedere Enumerazione OutputAssemblyType.
I valori accettabili per questo parametro sono i seguenti:
ConsoleApplication
Library
WindowsApplication
Importante
A partire da PowerShell 7.1 ConsoleApplication
e non sono supportati e WindowsApplication
PowerShell genera un errore irreversibile se uno dei due è specificato come valori per il parametro OutputType .
Tipo: | OutputAssemblyType |
Alias: | OT |
Valori accettati: | ConsoleApplication, Library, WindowsApplication |
Posizione: | Named |
Valore predefinito: | None |
Necessario: | False |
Accettare l'input della pipeline: | False |
Accettare caratteri jolly: | False |
-PassThru
Restituisce un oggetto System.Runtime che rappresenta i tipi aggiunti. Per impostazione predefinita, questo cmdlet non genera alcun output.
Tipo: | SwitchParameter |
Posizione: | Named |
Valore predefinito: | False |
Necessario: | False |
Accettare l'input della pipeline: | False |
Accettare caratteri jolly: | False |
-Path
Specifica il percorso dei file del codice sorgente o dei file DLL dell'assembly che contengono i tipi.
Se si inviano file di codice sorgente, Add-Type
compila il codice nei file e crea un assembly in memoria dei tipi. L'estensione di file specificata nel valore di Path determina il compilatore che Add-Type
usa.
L'uso dei parametri Path o LiteralPath garantisce il caricamento dell'assembly da caricare.
Tipo: | String[] |
Posizione: | 0 |
Valore predefinito: | None |
Necessario: | True |
Accettare l'input della pipeline: | False |
Accettare caratteri jolly: | False |
-ReferencedAssemblies
Specifica gli assembly da cui dipende il tipo. Per impostazione predefinita, Add-Type
fa System.dll
riferimento a e System.Management.Automation.dll
. Oltre agli assembly predefiniti, il comando fa riferimento anche agli assembly specificati mediante questo parametro.
A partire da PowerShell 6, ReferencedAssemblies non include gli assembly .NET predefiniti. È necessario includere un riferimento specifico al parametro nel valore passato a questo parametro.
Tipo: | String[] |
Alias: | RA |
Posizione: | Named |
Valore predefinito: | None |
Necessario: | False |
Accettare l'input della pipeline: | False |
Accettare caratteri jolly: | False |
-TypeDefinition
Specifica il codice sorgente che contiene le definizioni dei tipi. Immettere il codice sorgente in una stringa o una stringa di tipo here o immettere una variabile che contiene il codice sorgente. Per altre informazioni sulle stringhe qui, vedere about_Quoting_Rules.
Includere una dichiarazione dello spazio dei nomi nella definizione del tipo. Se si omette la dichiarazione dello spazio dei nomi, il tipo potrebbe avere lo stesso nome di un altro tipo o il collegamento per un altro tipo, causando una sovrascrittura accidentale. Ad esempio, se si definisce un tipo denominato Eccezione, gli script che usano Exception come collegamento per System.Exception avranno esito negativo.
Tipo: | String |
Posizione: | 0 |
Valore predefinito: | None |
Necessario: | True |
Accettare l'input della pipeline: | False |
Accettare caratteri jolly: | False |
-UsingNamespace
Specifica altri spazi dei nomi necessari per la classe. Questo è molto simile alla parola chiave C#, Using
.
Per impostazione predefinita, Add-Type
fa riferimento allo spazio dei nomi System . Quando viene usato il parametro MemberDefinition , Add-Type
fa riferimento allo spazio dei nomi System.Runtime.InteropServices per impostazione predefinita. Gli spazi dei nomi aggiunti tramite il parametro UsingNamespace fanno riferimento oltre agli spazi dei nomi predefiniti.
Tipo: | String[] |
Alias: | Using |
Posizione: | Named |
Valore predefinito: | System namespace |
Necessario: | False |
Accettare l'input della pipeline: | False |
Accettare caratteri jolly: | False |
Input
None
Non è possibile inviare tramite pipe oggetti a questo cmdlet.
Output
None
Per impostazione predefinita, questo cmdlet non restituisce alcun output.
Quando si utilizza il parametro PassThru , questo cmdlet restituisce un oggetto System.Type che rappresenta il nuovo tipo.
Note
I tipi aggiunti esistono solo nella sessione corrente. Per usare i tipi in tutte le sessioni, aggiungerli al profilo di PowerShell. Per altre informazioni sul profilo, vedere about_Profiles.
I nomi dei tipi e gli spazi dei nomi devono essere univoci all'interno di una sessione. Non è possibile scaricare un tipo o modificarlo. Se è necessario modificare il codice per un tipo, è necessario modificare il nome o avviare una nuova sessione di PowerShell. In caso contrario, il comando non riesce.
In Windows PowerShell (versione 5.1 e successive), è necessario usare Add-Type
per qualsiasi elemento non già caricato. In genere, questo vale per gli assembly presenti nella Global Assembly Cache (GAC).
In PowerShell 6 e versioni successive non esiste alcuna gac, quindi PowerShell installa i propri assembly in $PSHOME
.
Questi assembly vengono caricati automaticamente su richiesta, quindi non è necessario usarli Add-Type
per caricarli. Tuttavia, l'uso Add-Type
di è ancora consentito per consentire la compatibilità implicita degli script con qualsiasi versione di PowerShell.
Gli assembly nella GAC possono essere caricati in base al nome del tipo, anziché in base al percorso. Il caricamento di assembly da un percorso arbitrario richiede Add-Type
, perché tali assembly non possono essere caricati automaticamente.