Add-Type
PowerShell セッションに Microsoft .NET クラスを追加します。
構文
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>]
説明
Add-Type
コマンドレットを使用すると、PowerShell セッションで Microsoft .NET Core クラスを定義できます。 その後、 New-Object
コマンドレットを使用してオブジェクトをインスタンス化し、.NET Core オブジェクトを使用するのと同じようにオブジェクトを使用できます。 Add-Type
コマンドを PowerShell プロファイルに追加すると、そのクラスはすべての PowerShell セッションで使用できます。
既存のアセンブリまたはソース コード ファイルを指定して型を指定することも、インラインで、または変数に保存されたソース コードを指定することもできます。 メソッドのみを指定し、クラスを定義して生成 Add-Type
することもできます。 Windows では、この機能を使用して、PowerShell でアンマネージ関数にプラットフォーム呼び出し (P/Invoke) 呼び出しを行うことができます。 ソース コードを指定 Add-Type
、指定したソース コードをコンパイルし、新しい .NET Core 型を含むメモリ内アセンブリを生成します。
Add-Type
のパラメーターを使用して、代替言語とコンパイラを指定できます。C# は既定のコンパイラ オプション、アセンブリの依存関係、クラス名前空間、型の名前、および結果のアセンブリです。
PowerShell 7 以降、同じ名前の型が既に存在する場合、 Add-Type
は型をコンパイルしません。 また、Add-Type
は、pwsh.dll
を含むフォルダーの下にあるref
フォルダー内のアセンブリを検索します。
例
例 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
と呼ばれる非静的メソッドがあります。
Add-Type
コマンドレットは、クラスをセッションに追加します。 インライン ソース コードを使用しているため、コマンドは TypeDefinition パラメーターを使用して、 $Source
変数にコードを指定します。
BasicTest クラスのAdd
静的メソッドは、二重コロン文字 (::
) を使用してクラスの静的メンバーを指定します。 整数が追加され、合計が表示されます。
New-Object
コマンドレットは、BasicTest クラスのインスタンスをインスタンス化します。 新しいオブジェクトを $BasicTestObject
変数に保存します。
$BasicTestObject
は、 Multiply
メソッドを使用します。 整数が乗算され、積が表示されます。
例 2: 追加された型を調べる
この例では、 Get-Member
コマンドレットを使用して、 Add-Type
および New-Object
コマンドレットが Example 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()
Get-Member
コマンドレットは、セッションに追加Add-Type
BasicTest クラスの型とメンバーを取得します。 Get-Member
コマンドは、System.Object クラスから派生した System.RuntimeType オブジェクトであることを示します。
Get-Member
Static パラメーターは、BasicTest クラスの静的プロパティとメソッドを取得します。 出力は、 Add
メソッドが含まれていることを示しています。
Get-Member
コマンドレットは、$BasicTestObject
変数に格納されているオブジェクトのメンバーを取得します。
$BasicTestObject
は、 New-Object
コマンドレットと BasicTest クラスを使用して作成されました。 出力により、 $BasicTestObject
変数の値が BasicTest クラスのインスタンスであり、 Multiply
というメンバーが含まれていることが示されます。
例 3: アセンブリから型を追加する
次の使用例は、 JsonSchema.NET.dll
アセンブリのクラスを現在のセッションに追加します。
Set-Location -Path $PSHOME
$AccType = Add-Type -AssemblyName *jsonschema* -PassThru
Set-Location
では、 Path パラメーターを使用して、 $PSHOME
変数を指定します。 変数は、DLL ファイルが配置されている PowerShell インストール ディレクトリを参照します。
$AccType
変数には、Add-Type
コマンドレットで作成されたオブジェクトが格納されます。 Add-Type
では、 AssemblyName パラメーターを使用してアセンブリの名前を指定します。 アスタリスク (*
) ワイルドカード文字を使用すると、名前やそのスペルが不明な場合でも、正しいアセンブリを取得できます。 PassThru パラメーターは、セッションに追加されるクラスを表すオブジェクトを生成します。
例 4: ネイティブ Windows API を呼び出す
この例では、PowerShell でネイティブ Windows API を呼び出す方法を示します。 Add-Type
では、プラットフォーム呼び出し (P/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
変数には、ShowWindowAsync
関数の C# シグネチャが格納されます。 結果のメソッドが PowerShell セッションで確実に表示されるように、 public
キーワードが標準署名に追加されました。 詳細については、「 ShowWindowAsync 関数」を参照してください。
$ShowWindowAsync
変数には、Add-Type
PassThru パラメーターによって作成されたオブジェクトが格納されます。
Add-Type
コマンドレットは、ShowWindowAsync
関数を静的メソッドとして PowerShell セッションに追加します。 このコマンドでは、 MemberDefinition パラメーターを使用して、 $Signature
変数に保存されるメソッド定義を指定します。 このコマンドでは、 Name パラメーターと Namespace パラメーターを使用して、クラスの名前と名前空間を指定します。 PassThru パラメーターは、型を表すオブジェクトを生成します。
新しい ShowWindowAsync
静的メソッドは、PowerShell コンソールを最小化および復元するためにコマンドで使用されます。 このメソッドは、ウィンドウ ハンドルと、ウィンドウの表示方法を指定する整数の 2 つのパラメーターを受け取ります。
PowerShell コンソールを最小限に抑えるために、ShowWindowAsync
は、$PID
自動変数と共に Get-Process
コマンドレットを使用して、現在の PowerShell セッションをホストしているプロセスを取得します。 次に、現在のプロセスの MainWindowHandle プロパティと、SW_MINIMIZE
値を表す 2
の値を使用します。
ウィンドウを復元するには、 ShowWindowAsync
ウィンドウの位置に 4
の値を使用します。これは、 SW_RESTORE
値を表します。
ウィンドウを最大化するには、SW_MAXIMIZE
を表す3
の値を使用します。
パラメーター
-AssemblyName
型を含むアセンブリの名前を指定します。 Add-Type
は、指定したアセンブリから型を受け取ります。 このパラメーターは、アセンブリ名に基づいて型を作成する場合に必要です。
アセンブリの完全名または単純名 (部分名とも呼ばれます) を入力します。 アセンブリ名ではワイルドカード文字を使用できます。 単純名または部分名を入力した場合、 Add-Type
は完全な名前に解決され、完全な名前を使用してアセンブリが読み込まれます。
Path または LiteralPath パラメーターを使用すると、読み込む予定のアセンブリが確実に読み込まれます。 AssemblyName パラメーターを使用すると、PowerShell は標準の .NET アセンブリ解決プロセスを使用してアセンブリ名を解決するように .NET に求めます。 .NET は最初にアプリケーション フォルダーを検索するため、 Add-Type
は現在のフォルダー内のバージョンではなく、 $PSHOME
からアセンブリを読み込む可能性があります。 詳細については、 Assembly の場所を参照してください。
.NET が名前の解決に失敗した場合、PowerShell は現在の場所を調べ、アセンブリを検索します。 AssemblyName パラメーターでワイルドカードを使用すると、.NET アセンブリ解決プロセスが失敗し、PowerShell が現在の場所を検索します。
型: | String[] |
Aliases: | AN |
配置: | Named |
規定値: | None |
必須: | True |
パイプライン入力を受け取る: | False |
ワイルドカード文字を受け取る: | True |
-CompilerOptions
ソース コード コンパイラのオプションを指定します。 これらのオプションは、リビジョンなしでコンパイラに送信されます。
このパラメーターを使用すると、実行可能ファイルの生成、リソースの埋め込み、 /unsafe
オプションなどのコマンド ライン オプションの設定をコンパイラに指示できます。
型: | String[] |
配置: | Named |
規定値: | None |
必須: | False |
パイプライン入力を受け取る: | False |
ワイルドカード文字を受け取る: | False |
-IgnoreWarnings
コンパイラの警告は無視します。 Add-Type
がコンパイラ警告をエラーとして処理しないようにするには、このパラメーターを使用します。
型: | SwitchParameter |
配置: | Named |
規定値: | False |
必須: | False |
パイプライン入力を受け取る: | False |
ワイルドカード文字を受け取る: | False |
-Language
ソース コードで使用される言語を指定します。 このパラメーターに使用できる値は CSharp
。
型: | Language |
指定可能な値: | CSharp |
配置: | Named |
規定値: | CSharp |
必須: | False |
パイプライン入力を受け取る: | False |
ワイルドカード文字を受け取る: | False |
-LiteralPath
型を含むソース コード ファイルまたはアセンブリ DLL ファイルへのパスを指定します。 Path とは異なり、LiteralPath パラメーターの値は、型指定されたとおりに使用されます。 ワイルドカードとして解釈される文字はありません。 パスにエスケープ文字が含まれている場合は、単一引用符で囲みます。 単一引用符は、エスケープ シーケンスとして文字を解釈しないように PowerShell に指示します。
Path または LiteralPath パラメーターを使用すると、読み込む予定のアセンブリが確実に読み込まれます。
型: | String[] |
Aliases: | PSPath, LP |
配置: | Named |
規定値: | None |
必須: | True |
パイプライン入力を受け取る: | False |
ワイルドカード文字を受け取る: | False |
-MemberDefinition
クラスの新しいプロパティまたはメソッドを指定します。 Add-Type
は、プロパティまたはメソッドをサポートするために必要なテンプレート コードを生成します。
Windows では、この機能を使用して、PowerShell でアンマネージ関数にプラットフォーム呼び出し (P/Invoke) 呼び出しを行うことができます。
型: | String[] |
配置: | 1 |
規定値: | None |
必須: | True |
パイプライン入力を受け取る: | False |
ワイルドカード文字を受け取る: | False |
-Name
作成するクラスの名前を指定します。 メンバー定義から型を生成する場合は、このパラメーターは必須です。
型名と名前空間はセッション内で一意である必要があります。 型をアンロードしたり、変更したりすることはできません。 型のコードを変更するには、名前を変更するか、新しい PowerShell セッションを開始する必要があります。 それ以外の場合、コマンドは失敗します。
型: | String |
配置: | 0 |
規定値: | None |
必須: | True |
パイプライン入力を受け取る: | False |
ワイルドカード文字を受け取る: | False |
-Namespace
型の名前空間を指定します。
このパラメーターがコマンドに含まれていない場合、型は Microsoft.PowerShell.Commands.AddType.AutoGeneratedTypes 名前空間に作成されます。 パラメーターが空の文字列値または $Null
の値を持つコマンドに含まれている場合、型はグローバル名前空間で生成されます。
型: | String |
Aliases: | NS |
配置: | Named |
規定値: | None |
必須: | False |
パイプライン入力を受け取る: | False |
ワイルドカード文字を受け取る: | False |
-OutputAssembly
その場所に指定した名前のアセンブリ DLL ファイルを生成します。 省略可能なパスとファイル名を入力します。 ワイルドカード文字を使用できます。 既定では、 Add-Type
はメモリ内でのみアセンブリを生成します。
型: | String |
Aliases: | OA |
配置: | Named |
規定値: | None |
必須: | False |
パイプライン入力を受け取る: | False |
ワイルドカード文字を受け取る: | True |
-OutputType
出力アセンブリの出力の種類を指定します。 既定では、出力の種類は指定されていません。 このパラメーターは、コマンドで出力アセンブリが指定されている場合にのみ有効です。 値の詳細については、「 OutputAssemblyType 列挙型を参照してください。
このパラメーターに使用できる値は次のとおりです。
ConsoleApplication
Library
WindowsApplication
重要
PowerShell 7.1 の時点では、 ConsoleApplication
と WindowsApplication
はサポートされておらず、 OutputType パラメーターの値として指定されている場合、PowerShell は終了エラーをスローします。
型: | OutputAssemblyType |
Aliases: | OT |
指定可能な値: | ConsoleApplication, Library, WindowsApplication |
配置: | Named |
規定値: | None |
必須: | False |
パイプライン入力を受け取る: | False |
ワイルドカード文字を受け取る: | False |
-PassThru
追加された型を表す System.Runtime オブジェクトを返します。 既定では、このコマンドレットは出力を生成しません。
型: | SwitchParameter |
配置: | Named |
規定値: | False |
必須: | False |
パイプライン入力を受け取る: | False |
ワイルドカード文字を受け取る: | False |
-Path
型を含むソース コード ファイルまたはアセンブリ DLL ファイルへのパスを指定します。
ソース コード ファイルを送信する場合、 Add-Type
はファイル内のコードをコンパイルし、型のメモリ内アセンブリを作成します。 Path の値で指定されたファイル拡張子によって、使用するコンパイラAdd-Type
決定されます。
Path または LiteralPath パラメーターを使用すると、読み込む予定のアセンブリが確実に読み込まれます。
型: | String[] |
配置: | 0 |
規定値: | None |
必須: | True |
パイプライン入力を受け取る: | False |
ワイルドカード文字を受け取る: | False |
-ReferencedAssemblies
型が依存しているアセンブリを指定します。 既定では、 Add-Type
は System.dll
と System.Management.Automation.dll
を参照します。 既定のアセンブリに加え、このパラメーターを使用して指定されたアセンブリも参照されます。
PowerShell 6 以降、 ReferencedAssemblies には既定の .NET アセンブリは含まれません。 このパラメーターに渡される値には、それらに対する特定の参照を含める必要があります。
型: | String[] |
Aliases: | RA |
配置: | Named |
規定値: | None |
必須: | False |
パイプライン入力を受け取る: | False |
ワイルドカード文字を受け取る: | False |
-TypeDefinition
型定義を含むソース コードを指定します。 文字列またはヒア文字列のソース コードを入力するか、ソース コードを含む変数を入力します。 here-strings の詳細については、 about_Quoting_Rulesを参照してください。
型定義に、名前空間宣言を含めます。 名前空間の宣言を省略すると、型が別の型または別の型のショートカットと同名となり、意図しない上書きを引き起こす場合があります。 たとえば、Exception という型を定義すると、System.Exception のショートカットとして Exception を使用するスクリプトは失敗します。
型: | String |
配置: | 0 |
規定値: | None |
必須: | True |
パイプライン入力を受け取る: | False |
ワイルドカード文字を受け取る: | False |
-UsingNamespace
クラスに必要な他の名前空間を指定します。 これは、C# キーワード ( Using
) とよく似ています。
既定では、 Add-Type
は System 名前空間を参照します。 MemberDefinition パラメーターを使用すると、Add-Type
は既定で System.Runtime.InteropServices 名前空間も参照します。 UsingNamespace パラメーターを使用して追加する名前空間は、既定の名前空間に加えて参照されます。
型: | String[] |
Aliases: | Using |
配置: | Named |
規定値: | System namespace |
必須: | False |
パイプライン入力を受け取る: | False |
ワイルドカード文字を受け取る: | False |
入力
None
このコマンドレットにオブジェクトをパイプすることはできません。
出力
None
既定では、このコマンドレットは出力を返しません。
PassThru パラメーターを使用すると、このコマンドレットは新しい型を表す System.Type オブジェクトを返します。
メモ
追加した型は、現在のセッションのみに存在します。 すべてのセッションで型を使用するには、PowerShell プロファイルに追加します。 プロファイルの詳細については、「 about_Profiles」を参照してください。
型名と名前空間は、セッション内で一意である必要があります。 型をアンロードしたり、変更したりすることはできません。 型のコードを変更する必要がある場合は、名前を変更するか、新しい PowerShell セッションを開始する必要があります。 それ以外の場合、コマンドは失敗します。
Windows PowerShell (バージョン 5.1 以降) では、まだ読み込まれていないものに Add-Type
を使用する必要があります。 最も一般的に、これはグローバル アセンブリ キャッシュ (GAC) にあるアセンブリに適用されます。
PowerShell 6 以降では GAC がないため、PowerShell は独自のアセンブリを $PSHOME
にインストールします。
これらのアセンブリは要求に応じて自動的に読み込まれるため、 Add-Type
を使用して読み込む必要はありません。 ただし、 Add-Type
を使用しても、スクリプトが任意のバージョンの PowerShell と暗黙的に互換性を持つことができるようになります。
GAC 内のアセンブリは、パスではなく型名で読み込むことができます。 任意のパスからアセンブリを読み込むには、 Add-Type
が必要です。これらのアセンブリを自動的に読み込むことはできません。
関連リンク
PowerShell