Add-Type

PowerShell 세션에 Microsoft .NET 클래스를 추가합니다.

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

cmdlet Add-Type 을 사용하면 PowerShell 세션에서 Microsoft .NET Core 클래스를 정의할 수 있습니다. 그런 다음 cmdlet을 사용하여 개체를 New-Object 인스턴스화하고 .NET Core 개체를 사용하는 것처럼 개체를 사용할 수 있습니다. PowerShell 프로필에 Add-Type 명령을 추가하면 모든 PowerShell 세션에서 클래스를 사용할 수 있습니다.

기존 어셈블리 또는 소스 코드 파일을 지정하여 형식을 지정하거나 소스 코드를 인라인으로 지정하거나 변수에 저장할 수 있습니다. 메서드만 지정하고 Add-Type 클래스를 정의하고 생성할 수도 있습니다. Windows에서는 이 기능을 사용하여 PowerShell에서 관리되지 않는 함수에 대한 플랫폼 호출(P/Invoke) 호출을 수행할 수 있습니다. 소스 코드를 Add-Type 지정하는 경우 지정된 소스 코드를 컴파일하고 새 .NET Core 형식을 포함하는 메모리 내 어셈블리를 생성합니다.

매개 변수 Add-Type 를 사용하여 대체 언어 및 컴파일러를 지정할 수 있습니다. C#은 기본, 컴파일러 옵션, 어셈블리 종속성, 클래스 네임스페이스, 형식의 이름 및 결과 어셈블리입니다.

PowerShell 7 Add-Type 부터 이름이 같은 형식이 이미 있는 경우 형식을 컴파일하지 않습니다. Add-Type 또한 포함하는 폴더 아래의 ref 폴더에서 어셈블리를 찾습니다pwsh.dll.

예제

예제 1: 세션에 .NET 형식 추가

다음은 변수에 저장된 소스 코드를 지정하여 BasicTest 클래스를 세션에 추가하는 예제입니다. BasicTest 클래스는 정수를 추가하고, 개체를 만들고, 정수를 곱하는 데 사용됩니다.

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

변수는 $Source 클래스의 소스 코드를 저장합니다. 형식에는 호출 Add 된 정적 메서드와 비정적 메서드가 있습니다 Multiply.

cmdlet은 Add-Type 세션에 클래스를 추가합니다. 이 명령은 인라인 소스 코드를 사용하므로 TypeDefinition 매개 변수를 사용하여 변수의 $Source 코드를 지정합니다.

BasicTest 클래스의 정적 메서드는 Add 이중 콜론 문자(::)를 사용하여 클래스의 정적 멤버를 지정합니다. 정수가 추가되고 합계가 표시됩니다.

cmdlet은 New-Object BasicTest 클래스의 인스턴스를 인스턴스화합니다. 새 개체를 변수에 $BasicTestObject 저장합니다.

$BasicTestObject 는 메서드를 Multiply 사용합니다. 정수가 곱하고 제품이 표시됩니다.

예제 2: 추가된 형식 검사

이 예제에서는 cmdlet을 Get-Member 사용하여 예제 1에서 만든 개체 Add-TypeNew-Object cmdlet을 검사합니다.

[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()

cmdlet은 Get-Member 세션에 추가된 BasicTest 클래스 Add-Type 의 형식과 멤버를 가져옵니다. 이 Get-Member 명령은 System.Object 클래스에서 파생된 System.RuntimeType 개체임을 표시합니다.

Static 매개 변수는Get-Member BasicTest 클래스의 정적 속성 및 메서드를 가져옵니다. 출력은 메서드가 Add 포함되어 있음을 보여줍니다.

cmdlet은 Get-Member 변수에 저장된 개체의 멤버를 $BasicTestObject 가져옵니다. $BasicTestObject는 BasicTest 클래스와 New-Object 함께 cmdlet을 사용하여 생성되었습니다. 출력은 변수 값 $BasicTestObject 이 BasicTest 클래스의 인스턴스이며 이 클래스에 호출Multiply된 멤버가 포함되어 있음을 나타냅니다.

예제 3: 어셈블리에서 형식 추가

다음은 어셈블리의 클래스를 JsonSchema.NET.dll 현재 세션에 추가하는 예제입니다.

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

Set-Location 에서는 Path 매개 변수를 사용하여 변수를 지정합니다 $PSHOME . 변수는 DLL 파일이 있는 PowerShell 설치 디렉터리를 참조합니다.

변수는 $AccType cmdlet을 사용하여 만든 개체를 Add-Type 저장합니다. Add-TypeAssemblyName 매개 변수를 사용하여 어셈블리의 이름을 지정합니다. 별표(*) 와일드카드 문자를 사용하면 이름이나 철자를 잘 모르는 경우에도 올바른 어셈블리를 가져올 수 있습니다. PassThru 매개 변수는 세션에 추가되는 클래스를 나타내는 개체를 생성합니다.

예제 4: 네이티브 Windows API 호출

이 예제에서는 PowerShell에서 네이티브 Windows API를 호출하는 방법을 보여 줍니다. Add-Type 는 P/Invoke(Platform Invoke) 메커니즘을 사용하여 PowerShell에서 함수를 User32.dll 호출합니다. 이 예제는 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)

변수는 $Signature 함수의 C# 서명을 저장합니다 ShowWindowAsync . 결과 메서드가 PowerShell 세션 public 에 표시되도록 하기 위해 키워드(keyword) 표준 서명에 추가되었습니다. 자세한 내용은 ShowWindowAsync 함수를 참조하세요.

변수는 $ShowWindowAsync PassThru 매개 변수로 만든 개체를 Add-Type저장합니다. cmdlet은 Add-Type 함수를 ShowWindowAsync PowerShell 세션에 정적 메서드로 추가합니다. 이 명령은 MemberDefinition 매개 변수를 사용하여 변수에 $Signature 저장된 메서드 정의를 지정합니다. 이 명령은 Name 및 Namespace 매개 변수를 사용하여 클래스의 이름 및 네임스페이스를 지정합니다. PassThru 매개 변수는 형식을 나타내는 개체를 생성합니다.

ShowWindowAsync 정적 메서드는 PowerShell 콘솔을 최소화하고 복원하는 명령에 사용됩니다. 이 메서드는 창 핸들과 창 표시 방법을 지정하는 정수라는 두 개의 매개 변수를 사용합니다.

PowerShell 콘솔 ShowWindowAsync 을 최소화하려면 자동 변수와 함께 $PID cmdlet을 사용하여 Get-Process 현재 PowerShell 세션을 호스팅하는 프로세스를 가져옵니다. 그런 다음 현재 프로세스의 MainWindowHandle 속성과 값을 나타내는 SW_MINIMIZE 값을 2사용합니다.

창을 ShowWindowAsync 복원하려면 값을 나타내는 SW_RESTORE 창 위치에 대한 값을 4 사용합니다.

창을 최대화하려면 해당 SW_MAXIMIZE값을 3 사용합니다.

매개 변수

-AssemblyName

해당 유형을 포함하는 어셈블리 이름을 지정합니다. Add-Type 는 지정된 어셈블리에서 형식을 가져옵니다. 이 매개 변수는 어셈블리 이름을 기반으로 형식을 만들 때 필요합니다.

어셈블리의 전체 또는 단순 이름(부분 이름이라고도 함)을 입력합니다. 어셈블리 이름에는 wild카드 문자가 허용됩니다. 단순 또는 부분 이름을 입력하는 경우 전체 이름으로 Add-Type 확인한 다음 전체 이름을 사용하여 어셈블리를 로드합니다.

Path 또는 LiteralPath 매개 변수를 사용하면 로드하려는 어셈블리를 로드할 수 있습니다. AssemblyName 매개 변수를 사용하는 경우 PowerShell은 .NET에 표준 .NET 어셈블리 확인 프로세스를 사용하여 어셈블리 이름을 확인하도록 요청합니다. .NET은 애플리케이션 폴더를 먼저 Add-Type 검색하므로 현재 폴더의 버전 대신 어셈블리 $PSHOME 를 로드할 수 있습니다. 자세한 내용은 어셈블리 위치를 참조 하세요.

.NET에서 이름을 확인하지 못하면 PowerShell은 현재 위치를 찾아 어셈블리를 찾습니다. AssemblyName 매개 변수에서 wild카드s를 사용하면 .NET 어셈블리 확인 프로세스가 실패하여 PowerShell이 현재 위치를 확인합니다.

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

-CompilerOptions

소스 코드 컴파일러에 대한 옵션을 지정합니다. 이러한 옵션은 수정 없이 컴파일러로 전송됩니다.

이 매개 변수를 사용하면 컴파일러가 실행 파일을 생성하거나, 리소스를 포함하거나, 옵션과 같은 /unsafe 명령줄 옵션을 설정하도록 지시할 수 있습니다.

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

-IgnoreWarnings

컴파일러 경고를 무시합니다. 컴파일러 경고를 오류로 처리하지 않도록 Add-Type 하려면 이 매개 변수를 사용합니다.

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

-Language

소스 코드에 사용되는 언어를 지정합니다. 이 매개 변수에 허용되는 값은 .입니다 CSharp.

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

-LiteralPath

형식을 포함하는 소스 코드 파일 또는 어셈블리 DLL 파일의 경로를 지정합니다. Path와 달리 LiteralPath 매개 변수의 값은 입력된 대로 정확하게 사용됩니다. 어떤 문자도 야생으로 해석되지 카드. 경로에 이스케이프 문자가 포함된 경우 작은따옴표로 묶습니다. 작은따옴표는 PowerShell에 문자를 이스케이프 시퀀스로 해석하지 않도록 지시합니다.

Path 또는 LiteralPath 매개 변수를 사용하면 로드하려는 어셈블리를 로드할 수 있습니다.

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

-MemberDefinition

클래스에 대한 새 속성 또는 메서드를 지정합니다. Add-Type 는 속성 또는 메서드를 지원하는 데 필요한 템플릿 코드를 생성합니다.

Windows에서는 이 기능을 사용하여 PowerShell에서 관리되지 않는 함수에 대한 플랫폼 호출(P/Invoke) 호출을 수행할 수 있습니다.

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

-Name

만들 클래스의 이름을 지정합니다. 멤버 정의에서 유형을 생성하는 경우 이 매개 변수는 필수입니다.

유형 이름 및 네임스페이스는 세션 내부에서 고유해야 합니다. 형식을 언로드하거나 변경할 수 없습니다. 형식의 코드를 변경하려면 이름을 변경하거나 새 PowerShell 세션을 시작해야 합니다. 그렇지 않으면 명령이 실패합니다.

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

-Namespace

형식의 네임스페이스를 지정합니다.

이 매개 변수가 명령에 포함되지 않은 경우 형식은 Microsoft.PowerShell.Commands.AddType.AutoGeneratedTypes 네임스페이스에 만들어집니다. 매개 변수가 빈 문자열 값 또는 값 $Null이 있는 명령에 포함된 경우 형식은 전역 네임스페이스에 생성됩니다.

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

-OutputAssembly

위치에 지정된 이름을 사용하여 어셈블리에 대한 DLL 파일을 생성합니다. 선택적 경로 및 파일 이름을 입력합니다. 와일드카드 문자를 사용할 수 있습니다. 기본적으로 Add-Type 메모리에만 어셈블리를 생성합니다.

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

-OutputType

출력 어셈블리의 출력 형식을 지정합니다. 기본적으로 출력 형식은 지정되지 않습니다. 이 매개 변수는 명령에서 출력 어셈블리를 지정한 경우에만 사용할 수 있습니다. 값에 대한 자세한 내용은 OutputAssemblyType 열거형을 참조 하세요.

이 매개 변수에 허용되는 값은 다음과 같습니다.

  • ConsoleApplication
  • Library
  • WindowsApplication

Important

PowerShell 7.1 ConsoleApplicationWindowsApplication 을 기준으로 지원되지 않으며 OutputType 매개 변수 값으로 지정된 경우 PowerShell에서 종료 오류를 throw합니다.

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

추가된 형식을 나타내는 System.Runtime 개체를 반환합니다. 기본적으로 이 cmdlet은 출력을 생성하지 않습니다.

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

-Path

형식을 포함하는 소스 코드 파일 또는 어셈블리 DLL 파일의 경로를 지정합니다.

소스 코드 파일을 제출하는 경우 파일 Add-Type 의 코드를 컴파일하고 형식의 메모리 내 어셈블리를 만듭니다. 경로에 지정된 파일 확장명은 사용하는 컴파일러 Add-Type 를 결정합니다.

Path 또는 LiteralPath 매개 변수를 사용하면 로드하려는 어셈블리를 로드할 수 있습니다.

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

-ReferencedAssemblies

형식이 의존하는 어셈블리를 지정합니다. 기본적으로 Add-Type 참조 및 System.Management.Automation.dll.System.dll 이 매개 변수를 사용하여 지정하는 어셈블리는 기본 어셈블리에 추가하여 참조됩니다.

PowerShell 6 부터 ReferencedAssemblies 에는 기본 .NET 어셈블리가 포함되지 않습니다. 이 매개 변수에 전달된 값에 특정 참조를 포함해야 합니다.

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

-TypeDefinition

형식 정의를 포함하는 소스 코드를 지정합니다. 문자열 또는 여기 문자열에 소스 코드를 입력하거나 소스 코드가 포함된 변수를 입력합니다. 여기 문자열에 대한 자세한 내용은 about_Quoting_Rules 참조하세요.

형식 정의에 네임스페이스 선언을 포함합니다. 네임스페이스 선언을 생략하면 형식의 이름이 다른 형식이나 다른 형식의 바로 가기와 같아 의도하지 않은 덮어쓰기가 발생할 수 있습니다. 예를 들어 예외라는 형식을 정의하는 경우 System.Exception의 바로 가기로 예외를 사용하는 스크립트는 실패합니다.

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

-UsingNamespace

클래스에 필요한 다른 네임스페이스를 지정합니다. 이것은 C# 키워드(keyword) Using비슷합니다.

기본적으로 Add-Type 시스템 네임스페이스를 참조합니다. MemberDefinition 매개 변수를 사용하는 Add-Type 경우 기본적으로 System.Runtime.InteropServices 네임스페이스도 참조합니다. UsingNamespace 매개 변수를 사용하여 추가하는 네임스페이스는 기본 네임스페이스 외에도 참조됩니다.

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

입력

None

개체를 이 cmdlet으로 파이프할 수 없습니다.

출력

None

기본적으로 이 cmdlet은 출력을 반환하지 않습니다.

Type

PassThru 매개 변수를 사용하는 경우 이 cmdlet은 새 형식을 나타내는 System.Type 개체를 반환합니다.

참고

추가하는 형식은 현재 세션에만 존재합니다. 모든 세션에서 형식을 사용하려면 PowerShell 프로필에 추가합니다. 프로필에 대한 자세한 내용은 about_Profiles 참조하세요.

형식 이름 및 네임스페이스는 세션 내에서 고유해야 합니다. 형식을 언로드하거나 변경할 수 없습니다. 형식의 코드를 변경해야 하는 경우 이름을 변경하거나 새 PowerShell 세션을 시작해야 합니다. 그렇지 않으면 명령이 실패합니다.

Windows PowerShell(버전 5.1 이하)에서는 아직 로드되지 않은 모든 항목에 사용해야 Add-Type 합니다. 가장 일반적으로 GAC(전역 어셈블리 캐시)에 있는 어셈블리에 적용됩니다. PowerShell 6 이상에는 GAC가 없으므로 PowerShell은 자체 어셈블리를 설치 $PSHOME합니다. 이러한 어셈블리는 요청에 따라 자동으로 로드되므로 로드하는 데 사용할 Add-Type 필요가 없습니다. 그러나 스크립트가 모든 버전의 PowerShell과 암시적으로 호환되도록 허용하려면 계속 사용할 Add-Type 수 있습니다.

GAC의 어셈블리는 경로가 아닌 형식 이름으로 로드할 수 있습니다. 임의 경로에서 어셈블리를 로드하려면 해당 어셈블리를 자동으로 로드할 수 없기 때문에 필요합니다 Add-Type.