Add-Type

Hiermee wordt een Microsoft .NET-klasse toegevoegd aan een PowerShell-sessie.

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

Met de Add-Type cmdlet kunt u een Microsoft .NET Core-klasse definiëren in uw PowerShell-sessie. Vervolgens kunt u objecten instantiëren met behulp van de New-Object cmdlet en de objecten gebruiken, net zoals u elk .NET Core-object zou gebruiken. Als u een Add-Type opdracht aan uw PowerShell-profiel toevoegt, is de klasse beschikbaar in alle PowerShell-sessies.

U kunt het type opgeven door een bestaande assembly- of broncodebestanden op te geven, of u kunt de broncode inline opgeven of opslaan in een variabele. U kunt zelfs alleen een methode opgeven en Add-Type de klasse definiëren en genereren. In Windows kunt u deze functie gebruiken om P/Invoke-aanroepen (Platform Invoke) te maken naar onbeheerde functies in PowerShell. Als u broncode opgeeft, Add-Type compileert u de opgegeven broncode en genereert u een assembly in het geheugen die de nieuwe .NET Core-typen bevat.

U kunt de parameters gebruiken om Add-Type een alternatieve taal en compiler op te geven. C# is de standaardinstelling, compileropties, assemblyafhankelijkheden, de klassenaamruimte, de namen van het type en de resulterende assembly.

Vanaf PowerShell 7 Add-Type wordt geen type gecompileerd als er al een type met dezelfde naam bestaat. Add-Type Zoekt ook naar assembly's in een ref map onder de map die bevatpwsh.dll.

Voorbeelden

Voorbeeld 1: Een .NET-type toevoegen aan een sessie

In dit voorbeeld wordt de Klasse BasicTest toegevoegd aan de sessie door broncode op te geven die is opgeslagen in een variabele. De klasse BasicTest wordt gebruikt om gehele getallen toe te voegen, een object te maken en gehele getallen te vermenigvuldigen.

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

De $Source variabele slaat de broncode voor de klasse op. Het type heeft een statische methode aangeroepen Add en een niet-statische methode met de naam Multiply.

De Add-Type cmdlet voegt de klasse toe aan de sessie. Omdat de code inlinebroncode wordt gebruikt, gebruikt de opdracht de parameter TypeDefinition om de code in de $Source variabele op te geven.

De Add statische methode van de klasse BasicTest gebruikt de dubbele dubbele punttekens (::) om een statisch lid van de klasse op te geven. De gehele getallen worden toegevoegd en de som wordt weergegeven.

Met New-Object de cmdlet wordt een instantie van de Klasse BasicTest geïnstitueert. Het nieuwe object wordt opgeslagen in de $BasicTestObject variabele.

$BasicTestObject gebruikt de Multiply methode. De gehele getallen worden vermenigvuldigd en het product wordt weergegeven.

Voorbeeld 2: Een toegevoegd type onderzoeken

In dit voorbeeld wordt de Get-Member cmdlet gebruikt om de objecten te onderzoeken die door de Add-Type en New-Object cmdlets zijn gemaakt in voorbeeld 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()

De Get-Member cmdlet haalt het type en de leden van de BasicTest-klasse op die Add-Type aan de sessie zijn toegevoegd. De Get-Member opdracht laat zien dat het een System.RuntimeType-object is, dat is afgeleid van de klasse System.Object .

De Get-Memberstatische parameter haalt de statische eigenschappen en methoden van de klasse BasicTest op. In de uitvoer ziet u dat de Add methode is opgenomen.

De Get-Member cmdlet haalt de leden van het object op dat is opgeslagen in de $BasicTestObject variabele. $BasicTestObject is gemaakt met behulp van de New-Object cmdlet met de Klasse BasicTest . De uitvoer laat zien dat de waarde van de $BasicTestObject variabele een exemplaar is van de Klasse BasicTest en dat deze een lid bevat met de naam Multiply.

Voorbeeld 3: Typen toevoegen uit een assembly

In dit voorbeeld worden de klassen van de NJsonSchema.dll assembly toegevoegd aan de huidige sessie.

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

Set-Location gebruikt de parameter Path om de $PSHOME variabele op te geven. De variabele verwijst naar de Installatiemap van PowerShell waar het DLL-bestand zich bevindt.

Met $AccType de variabele wordt een object opgeslagen dat is gemaakt met de Add-Type cmdlet. Add-Type gebruikt de parameter AssemblyName om de naam van de assembly op te geven. Met het jokerteken sterretje (*) kunt u de juiste assembly ophalen, zelfs als u niet zeker weet of de naam of de spelling is. Met de parameter PassThru worden objecten gegenereerd die de klassen vertegenwoordigen die aan de sessie worden toegevoegd.

Voorbeeld 4: Systeemeigen Windows-API's aanroepen

In dit voorbeeld ziet u hoe u systeemeigen Windows-API's aanroept in PowerShell. Add-Type gebruikt het platformoproepmechanisme (P/Invoke) om een functie aan User32.dll te roepen vanuit PowerShell. Dit voorbeeld werkt alleen op computers met het Windows-besturingssysteem.

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

De $Signature variabele slaat de C#-handtekening van de ShowWindowAsync functie op. Om ervoor te zorgen dat de resulterende methode zichtbaar is in een PowerShell-sessie, is het public trefwoord toegevoegd aan de standaardhandtekening. Zie de functie ShowWindowAsync voor meer informatie.

De $ShowWindowAsync variabele slaat het object op dat is gemaakt met de Add-Type parameter PassThru. De Add-Type cmdlet voegt de ShowWindowAsync functie als statische methode toe aan de PowerShell-sessie. De opdracht maakt gebruik van de parameter MemberDefinition om de methodedefinitie op te geven die is opgeslagen in de $Signature variabele. De opdracht maakt gebruik van de parameters Naam en Naamruimte om een naam en naamruimte voor de klasse op te geven. Met de parameter PassThru wordt een object gegenereerd dat de typen vertegenwoordigt.

De nieuwe ShowWindowAsync statische methode wordt gebruikt in de opdrachten om de PowerShell-console te minimaliseren en te herstellen. De methode heeft twee parameters: de venstergreep en een geheel getal dat aangeeft hoe het venster wordt weergegeven.

Als u de PowerShell-console wilt minimaliseren, ShowWindowAsync gebruikt u de Get-Process cmdlet met de $PID automatische variabele om het proces op te halen dat als host fungeert voor de huidige PowerShell-sessie. Vervolgens wordt de eigenschap MainWindowHandle van het huidige proces en een waarde van 2, die de SW_MINIMIZE waarde vertegenwoordigt, gebruikt.

Als u het venster wilt herstellen, ShowWindowAsync gebruikt u een waarde voor de positie van 4 het venster, die de SW_RESTORE waarde vertegenwoordigt.

Gebruik de waarde van 3 dat venster om het venster te maximaliseren SW_MAXIMIZE.

Parameters

-AssemblyName

Hiermee geeft u de naam van een assembly die de typen bevat. Add-Type neemt de typen van de opgegeven assembly. Deze parameter is vereist wanneer u typen maakt op basis van een assemblynaam.

Voer de volledige of eenvoudige naam in, ook wel de gedeeltelijke naam genoemd, van een assembly. Jokertekens zijn toegestaan in de assemblynaam. Als u een eenvoudige of gedeeltelijke naam invoert, Add-Type wordt deze omgezet in de volledige naam en wordt de volledige naam gebruikt om de assembly te laden.

Deze parameter accepteert geen pad of bestandsnaam. Als u het pad naar het DLL-bestand (Assembly Dynamic Link Library) wilt invoeren, gebruikt u de parameter Path .

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

Hiermee geeft u de opties voor de broncode compiler. Deze opties worden zonder revisie naar de compiler verzonden.

Met deze parameter kunt u de compiler omsturen om een uitvoerbaar bestand te genereren, resources in te sluiten of opdrachtregelopties in te stellen, zoals de /unsafe optie.

U kunt de parameters CompilerOptions en ReferencedAssemblies niet gebruiken in dezelfde opdracht.

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

Hiermee worden compilerwaarschuwingen genegeerd. Gebruik deze parameter om te voorkomen dat Add-Type compilerwaarschuwingen als fouten worden verwerkt.

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

Hiermee geeft u de taal op die wordt gebruikt in de broncode. De acceptabele waarde voor deze parameter is

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

Hiermee geeft u het pad naar broncodebestanden of ASSEMBLY DLL-bestanden die de typen bevatten. In tegenstelling tot Path wordt de waarde van de parameter LiteralPath precies gebruikt zoals deze wordt getypt. Er worden geen tekens geïnterpreteerd als jokertekens. Als het pad escapetekens bevat, plaatst u het tussen enkele aanhalingstekens. Enkele aanhalingstekens geven PowerShell aan dat er geen tekens moeten worden geïnterpreteerd als escapereeksen.

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

Hiermee geeft u nieuwe eigenschappen of methoden voor de klasse. Add-Type genereert de sjablooncode die is vereist voor de ondersteuning van de eigenschappen of methoden.

In Windows kunt u deze functie gebruiken om P/Invoke-aanroepen (Platform Invoke) te maken naar onbeheerde functies in PowerShell.

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

Hiermee geeft u de naam van de klasse die moet worden gemaakt. Deze parameter is vereist bij het genereren van een type van een liddefinitie.

De typenaam en naamruimte moeten uniek zijn binnen een sessie. U kunt een type niet verwijderen of wijzigen. Als u de code voor een type wilt wijzigen, moet u de naam wijzigen of een nieuwe PowerShell-sessie starten. Anders mislukt de opdracht.

Type:String
Position:0
Default value:None
Accept pipeline input:False
Accept wildcard characters:False
-Namespace

Hiermee geeft u een naamruimte voor het type.

Als deze parameter niet is opgenomen in de opdracht, wordt het type gemaakt in de naamruimte Microsoft.PowerShell.Commands.AddType.AutoGeneratedTypes . Als de parameter is opgenomen in de opdracht met een lege tekenreekswaarde of een waarde, $Nullwordt het type gegenereerd in de globale naamruimte.

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

Genereert een DLL-bestand voor de assembly met de opgegeven naam op de locatie. Voer een optioneel pad en bestandsnaam in. Jokertekens zijn toegestaan. Genereert standaard Add-Type alleen de assembly in het geheugen.

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

Hiermee geeft u het uitvoertype van de uitvoerassembly. Standaard is er geen uitvoertype opgegeven. Deze parameter is alleen geldig wanneer een uitvoerassembly is opgegeven in de opdracht. Zie De opsomming OutputAssemblyType voor meer informatie over de waarden.

De acceptabele waarden voor deze parameter zijn als volgt:

  • ConsoleApplication
  • Library
  • WindowsApplication

Belangrijk

Vanaf PowerShell 7.1 en ConsoleApplicationWindowsApplication worden niet ondersteund en PowerShell genereert een afsluitfout als beide zijn opgegeven als waarden voor de parameter OutputType .

Type:OutputAssemblyType
Aliases:OT
Accepted values:ConsoleApplication, Library, WindowsApplication
Position:Named
Default value:None
Accept pipeline input:False
Accept wildcard characters:False
-PassThru

Hiermee wordt een System.Runtime-object geretourneerd dat de typen vertegenwoordigt die zijn toegevoegd. Deze cmdlet genereert standaard geen uitvoer.

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

Hiermee geeft u het pad naar broncodebestanden of ASSEMBLY DLL-bestanden die de typen bevatten.

Als u broncodebestanden verzendt, Add-Type compileert u de code in de bestanden en maakt u een assembly in het geheugen van de typen. De bestandsextensie die is opgegeven in de waarde van Path bepaalt de compiler die Add-Type gebruikt.

Als u een assemblybestand verzendt, Add-Type worden de typen uit de assembly opgehaald. Als u een assembly in het geheugen of de globale assemblycache wilt opgeven, gebruikt u de parameter AssemblyName .

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

Hiermee geeft u de assembly's waarvan het type afhankelijk is. Add-Type Standaard verwijzingen System.dll en System.Management.Automation.dll. Naast de standaardassembly's die u opgeeft met behulp van deze parameter, wordt ook verwezen naar de standaardassembly's.

Vanaf PowerShell 6 bevat ReferencedAssemblies geen standaard .NET-assembly's. U moet er een specifieke verwijzing naar opnemen in de waarde die aan deze parameter wordt doorgegeven.

U kunt de parameters CompilerOptions en ReferencedAssemblies niet gebruiken in dezelfde opdracht.

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

Hiermee geeft u de broncode die de typedefinities bevat. Voer de broncode in een tekenreeks of hier-tekenreeks in of voer een variabele in die de broncode bevat. Zie about_Quoting_Rules voor meer informatie over hier-tekenreeksen.

Neem een naamruimtedeclaratie op in uw typedefinitie. Als u de declaratie van de naamruimte weglaat, heeft uw type mogelijk dezelfde naam als een ander type of de snelkoppeling voor een ander type, waardoor een onbedoelde overschrijving wordt veroorzaakt. Als u bijvoorbeeld een type Uitzondering definieert, mislukken scripts die uitzondering gebruiken als snelkoppeling voor System.Exception .

Type:String
Position:0
Default value:None
Accept pipeline input:False
Accept wildcard characters:False
-UsingNamespace

Hiermee geeft u andere naamruimten die vereist zijn voor de klasse. Dit is net als het C#-trefwoord. Using

Verwijst standaard Add-Type naar de systeemnaamruimte . Wanneer de parameter MemberDefinition wordt gebruikt, Add-Type verwijst deze standaard ook naar de naamruimte System.Runtime.InteropServices . Naast de standaardnaamruimten die u toevoegt met behulp van de parameter UsingNamespace , wordt ook verwezen naar de standaardnaamruimten.

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

Invoerwaarden

None

U kunt geen objecten naar de pijplijn Add-Typeverzenden.

Uitvoerwaarden

None or System.Type

Wanneer u de parameter PassThru gebruikt, Add-Type retourneert u een System.Type-object dat het nieuwe type vertegenwoordigt. Anders genereert deze cmdlet geen uitvoer.

Notities

De typen die u toevoegt, bestaan alleen in de huidige sessie. Als u de typen in alle sessies wilt gebruiken, voegt u deze toe aan uw PowerShell-profiel. Zie about_Profiles voor meer informatie over het profiel.

Typ namen en naamruimten moeten uniek zijn binnen een sessie. U kunt een type niet verwijderen of wijzigen. Als u de code voor een type moet wijzigen, moet u de naam wijzigen of een nieuwe PowerShell-sessie starten. Anders mislukt de opdracht.

In Windows PowerShell (versie 5.1 en lager) moet u gebruiken Add-Type voor alles wat nog niet is geladen. Dit geldt meestal voor assembly's die zijn gevonden in de Global Assembly Cache (GAC). In PowerShell 6 en hoger is er geen GAC, dus PowerShell installeert zijn eigen assembly's in $PSHome. Deze assembly's worden automatisch op aanvraag geladen, dus u hoeft ze niet te laden Add-Type . Het gebruik Add-Type is echter nog steeds toegestaan om toe te staan dat scripts impliciet compatibel zijn met elke versie van PowerShell.

Assembly's in de GAC kunnen worden geladen op typenaam, in plaats van op pad. Het laden van assembly's vanaf een willekeurig pad vereist, Add-Typeomdat deze assembly's niet automatisch kunnen worden geladen.