Add-Type

Lägger till en Microsoft .NET-klass i en PowerShell-session.

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

Med Add-Type cmdleten kan du definiera en Microsoft .NET Core-klass i din PowerShell-session. Du kan sedan instansiera objekt med hjälp av cmdleten New-Object och använda objekten på samma sätt som med alla .NET Core-objekt. Om du lägger till ett Add-Type kommando i din PowerShell-profil är klassen tillgänglig i alla PowerShell-sessioner.

Du kan ange typen genom att ange en befintlig sammansättning eller källkodsfiler, eller så kan du ange källkoden infogad eller sparad i en variabel. Du kan till och med bara ange en metod och Add-Type definiera och generera klassen. I Windows kan du använda den här funktionen för att göra P/Invoke-anrop (Platform Invoke) till ohanterade funktioner i PowerShell. Om du anger källkod Add-Type kompilerar du den angivna källkoden och genererar en minnesintern sammansättning som innehåller de nya .NET Core-typerna.

Du kan använda parametrarna Add-Type för för att ange ett alternativt språk och kompilator, C# är standard, kompilatoralternativ, sammansättningsberoenden, klassnamnområdet, namnen på typen och den resulterande sammansättningen.

Från och med PowerShell 7 Add-Type kompilerar inte en typ om det redan finns en typ med samma namn. Add-Type Söker också efter sammansättningar i en ref mapp under mappen som innehåller pwsh.dll.

Exempel

Exempel 1: Lägg till en .NET-typ i en session

Det här exemplet lägger till klassen BasicTest i sessionen genom att ange källkod som lagras i en variabel. Klassen BasicTest används för att lägga till heltal, skapa ett objekt och multiplicera heltal.

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

Variabeln $Source lagrar källkoden för klassen. Typen har en statisk metod som heter Add och en icke-statisk metod med namnet Multiply.

Cmdleten Add-Type lägger till klassen i sessionen. Eftersom det använder infogad källkod använder kommandot parametern TypeDefinition för att ange koden i variabeln $Source .

Den Add statiska metoden för klassen BasicTest använder dubbelkolontecken (::) för att ange en statisk medlem i klassen. Heltalen läggs till och summan visas.

Cmdleten New-Object instansierar en instans av klassen BasicTest . Det sparar det nya objektet i variabeln $BasicTestObject .

$BasicTestObjectMultiply använder metoden. Heltalen multipliceras och produkten visas.

Exempel 2: Undersök en tillagd typ

I det här exemplet används cmdleten Get-Member för att undersöka de objekt som Add-Type cmdletarna och New-Object skapade i exempel 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()

Cmdleten Get-Member hämtar typen och medlemmarna i klassen BasicTest som Add-Type har lagts till i sessionen. Kommandot Get-Member visar att det är ett System.RuntimeType-objekt som härleds från klassen System.Object .

Parametern Get-MemberStatic hämtar statiska egenskaper och metoder för klassen BasicTest . Utdata visar att Add metoden ingår.

Cmdleten Get-Member hämtar medlemmarna i objektet som lagras i variabeln $BasicTestObject . $BasicTestObject skapades med hjälp av cmdleten New-Objectmed klassen BasicTest . Utdata visar att värdet för variabeln $BasicTestObject är en instans av klassen BasicTest och att den innehåller en medlem med namnet Multiply.

Exempel 3: Lägga till typer från en sammansättning

I det här exemplet läggs klasserna från NJsonSchema.dll sammansättningen till den aktuella sessionen.

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

Set-Location använder parametern Path för att ange variabeln $PSHOME . Variabeln refererar till PowerShell-installationskatalogen där DLL-filen finns.

Variabeln $AccType lagrar ett objekt som skapats med cmdleten Add-Type . Add-Type använder parametern AssemblyName för att ange namnet på sammansättningen. Med jokertecknet asterisk (*) kan du få rätt sammansättning även om du inte är säker på namnet eller stavningen. Parametern PassThru genererar objekt som representerar de klasser som läggs till i sessionen.

Exempel 4: Anropa interna Windows-API:er

Det här exemplet visar hur du anropar interna Windows-API:er i PowerShell. Add-Type använder mekanismen Platform Invoke (P/Invoke) för att anropa en funktion från User32.dll PowerShell. Det här exemplet fungerar bara på datorer som kör Windows-operativsystemet.

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

Variabeln $Signature lagrar funktionens C#-signatur ShowWindowAsync . För att säkerställa att den resulterande metoden visas i en PowerShell-session lades nyckelordet public till i standardsignaturen. Mer information finns i Funktionen ShowWindowAsync .

Variabeln $ShowWindowAsync lagrar objektet som skapats av parametern Add-TypePassThru . Cmdleten Add-TypeShowWindowAsync lägger till funktionen i PowerShell-sessionen som en statisk metod. Kommandot använder parametern MemberDefinition för att ange den metoddefinition som sparats i variabeln $Signature . Kommandot använder parametrarna Namn och Namnområde för att ange ett namn och namnområde för klassen. Parametern PassThru genererar ett objekt som representerar typerna.

Den nya ShowWindowAsync statiska metoden används i kommandona för att minimera och återställa PowerShell-konsolen. Metoden tar två parametrar: fönsterhandtaget och ett heltal som anger hur fönstret visas.

För att minimera PowerShell-konsolen ShowWindowAsync använder du cmdleten Get-Process med den $PID automatiska variabeln för att hämta den process som är värd för den aktuella PowerShell-sessionen. Sedan använder den egenskapen MainWindowHandle för den aktuella processen och värdet 2, som representerar SW_MINIMIZE värdet.

För att återställa fönstret ShowWindowAsync använder du värdet 4 för för fönsterpositionen SW_RESTORE , som representerar värdet.

Om du vill maximera fönstret använder du värdet 3 för som representerar SW_MAXIMIZE.

Parametrar

-AssemblyName

Anger namnet på en sammansättning som innehåller typerna. Add-Type tar typerna från den angivna sammansättningen. Den här parametern krävs när du skapar typer baserat på ett sammansättningsnamn.

Ange det fullständiga eller enkla namnet, även kallat partiellt namn, för en sammansättning. Jokertecken tillåts i sammansättningsnamnet. Om du anger ett enkelt eller partiellt namn Add-Type löser du det till det fullständiga namnet och använder sedan det fullständiga namnet för att läsa in sammansättningen.

Om du använder parametrarna Path eller LiteralPath ser du till att du läser in den sammansättning som du avsåg att läsa in. När du använder parametern AssemblyName ber PowerShell .NET att matcha sammansättningsnamnet med hjälp av standardlösningsprocessen för .NET-sammansättning. Eftersom .NET söker i programmappen först Add-Type kan en sammansättning läsas in från $PSHOME i stället för versionen i den aktuella mappen. Mer information finns i Sammansättningsplats.

Om .NET inte kan matcha namnet letar PowerShell efter sammansättningen på den aktuella platsen. När du använder jokertecken i parametern AssemblyName misslyckas .NET-sammansättningsmatchningsprocessen, vilket gör att PowerShell söker på den aktuella platsen.

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

-CompilerOptions

Anger alternativen för källkodskompilatorn. Dessa alternativ skickas till kompilatorn utan revision.

Med den här parametern kan du dirigera kompilatorn att generera en körbar fil, bädda in resurser eller ange kommandoradsalternativ, till exempel alternativet /unsafe .

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

-IgnoreWarnings

Ignorerar kompilatorvarningar. Använd den här parametern för att förhindra Add-Type att kompilatorvarningar hanteras som fel.

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

-Language

Anger det språk som används i källkoden. Det acceptabla värdet för den här parametern är CSharp.

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

-LiteralPath

Anger sökvägen till källkodsfiler eller sammansättnings-DLL-filer som innehåller typerna. Till skillnad från Path används värdet för parametern LiteralPath precis som det skrivs. Inga tecken tolkas som jokertecken. Om sökvägen innehåller escape-tecken omger du den med enkla citattecken. Enkla citattecken gör att PowerShell inte tolkar några tecken som escape-sekvenser.

Om du använder parametrarna Path eller LiteralPath ser du till att du läser in den sammansättning som du avsåg att läsa in.

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

-MemberDefinition

Anger nya egenskaper eller metoder för klassen. Add-Type genererar den mallkod som krävs för att stödja egenskaperna eller metoderna.

I Windows kan du använda den här funktionen för att göra P/Invoke-anrop (Platform Invoke) till ohanterade funktioner i PowerShell.

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

-Name

Anger namnet på den klass som ska skapas. Den här parametern krävs när du genererar en typ från en medlemsdefinition.

Typnamnet och namnområdet måste vara unika i en session. Du kan inte ta bort en typ eller ändra den. Om du vill ändra koden för en typ måste du ändra namnet eller starta en ny PowerShell-session. Annars misslyckas kommandot.

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

-Namespace

Anger ett namnområde för typen.

Om den här parametern inte ingår i kommandot skapas typen i namnområdet Microsoft.PowerShell.Commands.AddType.AutoGeneratedTypes . Om parametern ingår i kommandot med ett tomt strängvärde eller ett värde av $Nullgenereras typen i det globala namnområdet.

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

-OutputAssembly

Genererar en DLL-fil för sammansättningen med det angivna namnet på platsen. Ange en valfri sökväg och filnamn. Jokertecken tillåts. Som standard Add-Type genererar sammansättningen endast i minnet.

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

-OutputType

Anger utdatatypen för utdatasammansättningen. Som standard anges ingen utdatatyp. Den här parametern är endast giltig när en utdatasammansättning anges i kommandot . Mer information om värdena finns i OutputAssemblyType Enumeration.

Godkända värden för den här parametern är följande:

  • ConsoleApplication
  • Library
  • WindowsApplication

Viktigt!

Från och med PowerShell 7.1 ConsoleApplication , och WindowsApplication stöds inte och PowerShell genererar ett avslutande fel om någon av dem anges som värden för OutputType-parametern .

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

Returnerar ett System.Runtime-objekt som representerar de typer som har lagts till. Som standard genererar den här cmdleten inga utdata.

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

-Path

Anger sökvägen till källkodsfiler eller sammansättnings-DLL-filer som innehåller typerna.

Om du skickar källkodsfiler Add-Type kompilerar du koden i filerna och skapar en minnesintern sammansättning av typerna. Filtillägget som anges i värdet för Path avgör vilken kompilator som Add-Type använder.

Om du använder parametrarna Path eller LiteralPath ser du till att du läser in den sammansättning som du avsåg att läsa in.

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

-ReferencedAssemblies

Anger de sammansättningar som typen är beroende av. Som standard Add-Type referenser System.dll och System.Management.Automation.dll. De sammansättningar som du anger med hjälp av den här parametern refereras utöver standardsammansättningarna.

Från och med PowerShell 6 innehåller ReferencedAssemblies inte standardsammansättningarna för .NET. Du måste inkludera en specifik referens till dem i värdet som skickas till den här parametern.

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

-TypeDefinition

Anger källkoden som innehåller typdefinitionerna. Ange källkoden i en sträng eller här-sträng, eller ange en variabel som innehåller källkoden. Mer information om här-strängar finns i about_Quoting_Rules.

Inkludera en namnområdesdeklaration i din typdefinition. Om du utelämnar namnområdesdeklarationen kan din typ ha samma namn som en annan typ eller genvägen för en annan typ, vilket orsakar en oavsiktlig överskrivning. Om du till exempel definierar en typ med namnet Undantag misslyckas skript som använder Undantag som genväg för System.Exception .

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

-UsingNamespace

Anger andra namnområden som krävs för klassen. Det här liknar nyckelordet C# , Using.

Som standard Add-Type refererar till systemnamnområdet . När parametern MemberDefinition används Add-Type refererar även namnområdet System.Runtime.InteropServices som standard. De namnområden som du lägger till med hjälp av parametern UsingNamespace refereras utöver standardnamnrymderna.

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

Indata

None

Du kan inte skicka objekt till den här cmdleten.

Utdata

None

Som standard returnerar den här cmdleten inga utdata.

Type

När du använder parametern PassThru returnerar den här cmdleten ett System.Type-objekt som representerar den nya typen.

Kommentarer

De typer som du lägger till finns bara i den aktuella sessionen. Om du vill använda typerna i alla sessioner lägger du till dem i din PowerShell-profil. Mer information om profilen finns i about_Profiles.

Typnamn och namnområden måste vara unika i en session. Du kan inte ta bort en typ eller ändra den. Om du behöver ändra koden för en typ måste du ändra namnet eller starta en ny PowerShell-session. Annars misslyckas kommandot.

I Windows PowerShell (version 5.1 och senare) måste du använda Add-Type för allt som inte redan har lästs in. Oftast gäller detta för sammansättningar som finns i den globala sammansättningscachen (GAC). I PowerShell 6 och senare finns det ingen GAC, så PowerShell installerar sina egna sammansättningar i $PSHOME. Dessa sammansättningar läses in automatiskt vid begäran, så du behöver inte använda Add-Type dem för att läsa in dem. Det är dock fortfarande tillåtet att använda Add-Type för att tillåta att skript är implicit kompatibla med alla versioner av PowerShell.

Sammansättningar i GAC kan läsas in efter typnamn i stället för sökväg. Inläsning av sammansättningar från en godtycklig sökväg kräver Add-Type, eftersom dessa sammansättningar inte kan läsas in automatiskt.