Delen via


Add-Type

Voegt een Microsoft .NET-klasse toe 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 op dezelfde manier gebruiken als elk .NET Core-object. Als u een Add-Type opdracht toevoegt aan uw PowerShell-profiel, 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 of opgeslagen in een variabele opgeven. U kunt zelfs alleen een methode opgeven en Add-Type de klasse definiëren en genereren. In Windows kunt u deze functie gebruiken om Platform Invoke (P/Invoke) aanroepen te maken naar niet-beheerde 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 van Add-Type gebruiken om een alternatieve taal en compiler op te geven. C# is de standaardinstelling, compileropties, assembly-afhankelijkheden, de klassenaamruimte, de namen van het type en de resulterende assembly.

Vanaf PowerShell 7 Add-Type wordt een type niet 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 aan de sessie toegevoegd door de 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)

Met $Source de variabele wordt de broncode voor de klasse opgeslagen. Het type heeft een statische methode met de naam Add en een niet-statische methode met de naam Multiply.

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

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

Met New-Object de cmdlet wordt een exemplaar 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 cmdlets en New-Object 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 op van de BasicTest-klasse die Add-Type zijn toegevoegd aan de sessie. 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. De uitvoer laat zien 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 variabele een exemplaar van de klasse BasicTest is en dat deze een lid bevat met de $BasicTestObject naam Multiply.

Voorbeeld 3: Typen uit een assembly toevoegen

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 PowerShell-installatiemap waarin het DLL-bestand zich bevindt.

Met de $AccType 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 krijgen, zelfs als u niet zeker bent van de naam of de spelling. De parameter PassThru genereert objecten 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 maakt gebruik van het mechanisme Platform Invoke (P/Invoke) om een functie aan te roepen vanuit User32.dll PowerShell. Dit voorbeeld werkt alleen op computers met het Windows-besturingssysteem.

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

De $Signature variabele slaat de C#-handtekening van de functie op ShowWindowAsync . 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.

Met $ShowWindowAsync de variabele wordt het object opgeslagen dat is gemaakt door de Add-Type parameter PassThru. De Add-Type cmdlet voegt de ShowWindowAsync functie toe aan de PowerShell-sessie als een statische methode. De opdracht gebruikt de parameter MemberDefinition om de methodedefinitie op te geven die is opgeslagen in de $Signature variabele. De opdracht gebruikt de parameters Naam en Naamruimte om een naam en naamruimte voor de klasse op te geven. De parameter PassThru genereert een object 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 gebruikt twee parameters: de venstergreep en een geheel getal dat aangeeft hoe het venster wordt weergegeven.

Om de PowerShell-console te 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 gebruikt en een waarde van 2, die de SW_MINIMIZE waarde vertegenwoordigt.

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

Als u het venster wilt maximaliseren, gebruikt u de waarde van 3 die staat voor 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 van een assembly in, ook wel de gedeeltelijke naam genoemd. 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 vervolgens de volledige naam gebruikt om de assembly te laden.

Als u de parameters Path of LiteralPath gebruikt, zorgt u ervoor dat u de assembly laadt die u wilt laden. Wanneer u de parameter AssemblyName gebruikt, vraagt PowerShell .NET om de assemblynaam om te zetten met behulp van het standaard .NET-assemblyoplossingsproces. Omdat .NET eerst in de toepassingsmap zoekt, Add-Type laadt mogelijk een assembly uit $PSHOME in plaats van de versie in de huidige map. Zie Assembly-locatie voor meer informatie.

Als .NET de naam niet kan oplossen, zoekt PowerShell vervolgens op de huidige locatie naar de assembly. Wanneer u jokertekens gebruikt in de parameter AssemblyName , mislukt het .NET-assemblyoplossingsproces, waardoor PowerShell op de huidige locatie kijkt.

Type:String[]
Aliases:AN
Position:Named
Default value:None
Required:True
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 de opdracht geven om een uitvoerbaar bestand te genereren, resources in te sluiten of opdrachtregelopties in te stellen, zoals de /unsafe optie.

Type:String[]
Position:Named
Default value:None
Required:False
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
Required: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
Required:False
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. Geen tekens worden geïnterpreteerd als jokertekens. Als het pad escape-tekens bevat, plaatst u het tussen enkele aanhalingstekens. Enkele aanhalingstekens geven PowerShell aan dat geen tekens als escape-reeksen worden geïnterpreteerd.

Als u de parameters Path of LiteralPath gebruikt, wordt gegarandeerd dat u de assembly laadt die u wilt laden.

Type:String[]
Aliases:PSPath, LP
Position:Named
Default value:None
Required:True
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 Platform Invoke (P/Invoke) aanroepen uit te voeren naar niet-beheerde functies in PowerShell.

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

-Name

Hiermee geeft u de naam van de klasse te maken. Deze parameter is vereist bij het genereren van een type op basis van een liddefinitie.

De typenaam en naamruimte moeten uniek zijn binnen een sessie. U kunt een type niet uit het geheugen halen 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
Required:True
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 van $Null, wordt het type gegenereerd in de globale naamruimte.

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

-OutputAssembly

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

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

-OutputType

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

De acceptabele waarden voor deze parameter zijn als volgt:

  • ConsoleApplication
  • Library
  • WindowsApplication

Belangrijk

Vanaf PowerShell 7.1 ConsoleApplication , en WindowsApplication worden niet ondersteund en PowerShell genereert een afsluitfout als een van beide zijn opgegeven als waarden voor de OutputType-parameter .

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

Retourneert een System.Runtime-object dat de typen vertegenwoordigt die zijn toegevoegd. Met deze cmdlet wordt standaard geen uitvoer gegenereerd.

Type:SwitchParameter
Position:Named
Default value:False
Required: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 Pad , bepaalt de compiler die Add-Type wordt gebruikt.

Als u de parameters Path of LiteralPath gebruikt, wordt gegarandeerd dat u de assembly laadt die u wilt laden.

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

-ReferencedAssemblies

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

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

Type:String[]
Aliases:RA
Position:Named
Default value:None
Required:False
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 here-tekenreeks in of voer een variabele in die de broncode bevat. Zie about_Quoting_Rules voor meer informatie over here-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 er onbedoeld wordt overschreven. Als u bijvoorbeeld een type definieert met de naam Uitzondering, mislukken scripts die Uitzondering gebruiken als de snelkoppeling voor System.Exception .

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

-UsingNamespace

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

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

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

Invoerwaarden

None

U kunt geen objecten doorsnijden naar deze cmdlet.

Uitvoerwaarden

None

Deze cmdlet retourneert standaard geen uitvoer.

Type

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

Notities

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

Typenamen en naamruimten moeten uniek zijn binnen een sessie. U kunt een type niet uit het geheugen halen 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.

In Windows PowerShell (versie 5.1 en lager) moet u gebruiken Add-Type voor alles wat nog niet is geladen. Dit is meestal van toepassing op assembly's die worden 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, zodat u ze niet hoeft te gebruiken Add-Type om ze te laden. Het gebruik Add-Type van 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. Voor het laden van assembly's vanaf een willekeurig pad is vereist Add-Type, omdat deze assembly's niet automatisch kunnen worden geladen.