Add-Type
向 Windows PowerShell 会话中添加 Microsoft .NET Framework 类型(一种类)。
语法
Add-Type -AssemblyName <string[]> [-IgnoreWarnings] [-PassThru] [<CommonParameters>]
Add-Type [-Name] <string> [-MemberDefinition] <string[]> [-CodeDomProvider <CodeDomProvider>] [-CompilerParameters <CompilerParameters>] [-语言 {<CSharp> | <CSharpVersion3> | <VisualBasic> | <JScript>}] [-命名空间 <string>] [-OutputAssembly <string>] [-OutputType <OutputAssemblyType>] [-ReferencedAssemblies <string[]>] [-UsingNamespace <string[]>] [-IgnoreWarnings] [-PassThru] [<CommonParameters>]
Add-Type [-Path] <string[]> [-CompilerParameters <CompilerParameters>] [-OutputAssembly <string>] [-OutputType <OutputAssemblyType>] [-ReferencedAssemblies <string[]>] [-IgnoreWarnings] [-PassThru] [<CommonParameters>]
Add-Type [-TypeDefinition] <string> [-CodeDomProvider <CodeDomProvider>] [-CompilerParameters <CompilerParameters>] [-语言 {<CSharp> | <CSharpVersion3> | <VisualBasic> | <JScript>}] [-OutputAssembly <string>] [-OutputType <OutputAssemblyType>] [-ReferencedAssemblies <string[]>] [-IgnoreWarnings] [-PassThru] [<CommonParameters>]
说明
使用 Add-Type cmdlet,可以在 Windows PowerShell 会话中定义 .NET Framework 类。然后可将对象实例化(通过使用 New-Object cmdlet)并使用这些对象,就像使用任何 .NET Framework 对象一样。如果将 Add-Type 命令添加到 Windows PowerShell 配置文件中,则在所有 Windows PowerShell 会话中都可使用该类。
可通过指定现有的程序集或源代码文件来指定类型,也可通过内联方式指定源代码或将源代码保存在变量中。甚至可以仅指定一种方法,此时,Add-Type 便可以定义并生成该类。可使用该功能来执行 Platform Invoke (P/Invoke) 以调用 Windows PowerShell 中的非托管函数。如果指定源代码,Add-Type 将编译所指定的源代码并生成包含新 .NET Framework 类型的内存中程序集。
可使用 Add-Type 的参数来指定替代语言、编译器(默认为 CSharp)、编译器选项、程序集依赖关系、类命名空间,以及该类型和所获得的程序集的名称。
参数
-AssemblyName <string[]>
指定包括相应类型的程序集的名称。Add-Type 从所指定的程序集中获取相应类型。在基于程序集名称创建类型时需要此参数。
输入程序集的全称或简称(也称为“部分名称”)。在程序集名称中允许使用通配符。如果输入简称(即部分名称),Add-Type 会将其解析为全称,然后使用全称来加载程序集。
此参数不接受路径或文件名。若要输入程序集动态链接库 (DLL) 文件的路径,请使用 Path 参数。
是否为必需? |
true |
位置? |
named |
默认值 |
|
是否接受管道输入? |
false |
是否接受通配符? |
true |
-CodeDomProvider <CodeDomProvider>
指定代码生成器或编译器。Add-Type 使用指定的编译器来编译源代码。默认为 CSharp 编译器。如果无法通过 Language 参数来指定所使用的语言,请使用此参数。所指定的 CodeDomProvider 必须可基于源代码生成程序集。
是否为必需? |
false |
位置? |
named |
默认值 |
CSharp 编译器 |
是否接受管道输入? |
false |
是否接受通配符? |
false |
-CompilerParameters <CompilerParameters>
指定用于源代码编译器的选项。这些选项未经修改就发送至编译器。
使用此参数,可以指示编译器生成可执行文件、嵌入资源或设置命令行选项,如“/unsafe”选项。此参数可实现 CompilerParameters 类 (System.CodeDom.Compiler.CompilerParameters)。
是否为必需? |
false |
位置? |
named |
默认值 |
|
是否接受管道输入? |
false |
是否接受通配符? |
false |
-IgnoreWarnings
忽略编译器警告。使用此参数可阻止 Add-Type 将编译器警告作为错误处理。
是否为必需? |
false |
位置? |
named |
默认值 |
False |
是否接受管道输入? |
false |
是否接受通配符? |
false |
-语言 <Language>
指定在源代码中使用的语言。Add-Type 使用该语言来选择正确的代码编译器。
有效值为:“CSharp”、“CSharpVersion3”、“VisualBasic”和“JScript”。默认值为“CSharp”。
是否为必需? |
false |
位置? |
named |
默认值 |
CSharp |
是否接受管道输入? |
false |
是否接受通配符? |
false |
-MemberDefinition <string[]>
指定类的新属性或方法。Add-Type 可生成支持属性或方法所需的模板代码。
可使用该功能来执行 Platform Invoke (P/Invoke) 以调用 Windows PowerShell 中的非托管函数。有关详细信息,请参阅示例。
是否为必需? |
true |
位置? |
2 |
默认值 |
|
是否接受管道输入? |
false |
是否接受通配符? |
false |
-Name <string>
指定要创建的类的名称。基于成员定义生成类型时需要此参数。
类型名称和命名空间在一个会话中必须是唯一的。无法对类型进行卸载或更改。如果需要更改类型的代码,则必须更改名称或启动新的 Windows PowerShell 会话。否则,命令将失败。
是否为必需? |
true |
位置? |
1 |
默认值 |
|
是否接受管道输入? |
false |
是否接受通配符? |
false |
-命名空间 <string>
指定类型的命名空间。
如果命令中没有包括此参数,则在 Microsoft.PowerShell.Commands.AddType.AutoGeneratedTypes 命名空间中创建该类型。如果在含有空字符串值或 $null 值的命令中包括此参数,则在全局命名空间中生成该类型。
是否为必需? |
false |
位置? |
named |
默认值 |
Microsoft.PowerShell.Commands.AddType.AutoGeneratedTypes |
是否接受管道输入? |
false |
是否接受通配符? |
false |
-OutputAssembly <string>
在该位置为具有指定名称的程序集生成 DLL 文件。输入路径(可选)和文件名。允许使用通配符。默认情况下,Add-Type 仅在内存中生成程序集。
是否为必需? |
false |
位置? |
named |
默认值 |
|
是否接受管道输入? |
false |
是否接受通配符? |
true |
-OutputType <OutputAssemblyType>
指定输出程序集的输出类型。有效值为 Library、ConsoleApplication 和 WindowsApplication。
默认情况下,将不指定输出类型。
仅当该命令中指定了输出程序集时,此参数才有效。
是否为必需? |
false |
位置? |
named |
默认值 |
无 |
是否接受管道输入? |
false |
是否接受通配符? |
false |
-PassThru
返回表示添加的类型的 System.Runtime 对象。默认情况下,此 cmdlet 将不产生任何输出。
是否为必需? |
false |
位置? |
named |
默认值 |
|
是否接受管道输入? |
false |
是否接受通配符? |
false |
-Path <string[]>
指定包含相应类型的源代码文件或程序集 DLL 文件的路径。
如果提交源代码文件,则 Add-Type 会编译这些文件中的代码并在内存中创建相应类型的程序集。在 Path 值中所指定的文件扩展名确定 Add-Type 使用的编译器。
如果提交程序集文件,Add-Type 将从该程序集中获取相应类型。若要指定内存中程序集或全局程序集缓存,请使用 AssemblyName 参数。
是否为必需? |
true |
位置? |
1 |
默认值 |
|
是否接受管道输入? |
false |
是否接受通配符? |
false |
-ReferencedAssemblies <string[]>
指定类型所依赖的程序集。默认情况下,Add-Type 引用 System.dll 和 System.Management.Automation.dll。除默认程序集以外,还会引用使用此参数指定的程序集。
是否为必需? |
false |
位置? |
named |
默认值 |
|
是否接受管道输入? |
false |
是否接受通配符? |
false |
-TypeDefinition <string>
指定包含类型定义的源代码。输入字符串或 here-string 格式的源代码,或输入包含源代码的变量。有关 here-string 的详细信息,请参阅 about_Quoting_Rules。
在类型定义中需包括命名空间声明。如果省略命名空间声明,您的类型可能会与其他类型或其他类型的快捷方式同名,从而导致意外覆盖。例如,如果定义的类型名为“Exception”,则使用“Exception”作为 System.Exception 的快捷方式的脚本将失败。
是否为必需? |
true |
位置? |
1 |
默认值 |
|
是否接受管道输入? |
false |
是否接受通配符? |
false |
-UsingNamespace <string[]>
指定类所需的其他命名空间。这与 C# 中的 Using 关键字很相似。
默认情况下,Add-Type 引用 System 命名空间。在使用 MemberDefinition 参数时,Add-Type 默认情况下还引用 System.Runtime.InteropServices 命名空间。除默认命名空间以外,还会引用使用 UsingNamespace 参数添加的命名空间。
是否为必需? |
false |
位置? |
named |
默认值 |
|
是否接受管道输入? |
false |
是否接受通配符? |
false |
<CommonParameters>
此 cmdlet 支持通用参数:-Verbose、-Debug、-ErrorAction、-ErrorVariable、-OutBuffer 和 -OutVariable。有关详细信息,请参阅 about_Commonparameters.
输入和输出
输入类型是指可通过管道传递给 cmdlet 的对象的类型。返回类型是指 Cmdlet 所返回对象的类型。
输入 |
无 不能通过管道将对象传递到 Add-Type。 |
输出 |
“无”或 System.RuntimeType 如果使用 PassThru 参数,则 Add-Type 返回表示新类型的 System.RuntimeType 对象。否则,此 cmdlet 将不产生任何输出。 |
说明
添加的类型仅存在于当前会话中。要在所有会话中使用这些类型,请将其添加到 Windows PowerShell 配置文件中。有关配置文件的详细信息,请参阅 about_Profiles。
类型名称(和命名空间)在一个会话中必须是唯一的。无法对类型进行卸载或更改。如果需要更改类型的代码,则必须更改名称或启动新的 Windows PowerShell 会话。否则,命令将失败。
某些语言的 CodeDomProvider 类(如 IronPython 和 JSharp)不会生成输出。因此,使用这些语言编写的类型将无法与 Add-Type 一起使用。
此 cmdlet 基于 CodeDomProvider 类。有关该类的详细信息,请参阅 Microsoft .NET Framework SDK。
示例 1
C:\PS>$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);
}
}
"@
C:\PS> Add-Type -TypeDefinition $source
C:\PS> [BasicTest]::Add(4, 3)
C:\PS> $basicTestObject = New-Object BasicTest
C:\PS> $basicTestObject.Multiply(5, 2)
说明
-----------
这些命令通过指定存储在变量中的源代码,将 BasicTest 类添加到会话中。该类型具有一个名为 Add 的静态方法和一个名为 Multiply 的非静态方法。
第一条命令在 $source 变量中存储该类的源代码。
第二条命令使用 Add-Type cmdlet 将该类添加到会话中。由于它使用的是内联源代码,所以该命令使用 TypeDefinition 参数来指定 $source 变量中的代码。
其余命令使用新类。
第三条命令调用 BasicTest 类的 Add 的静态方法。它使用双冒号字符 (::) 来指定类的静态成员。
第四条命令使用 New-Object cmdlet 来实例化 BasicTest 类的实例。它将新对象保存在 $basicTestObject 变量中。
第五条命令使用 $basicTestObject 的 Multiply 方法。
示例 2
C:\PS>[BasicTest] | get-member
C:\PS> [BasicTest] | get-member -static
C:\PS> $basicTestObject | get-member
C:\PS> [BasicTest] | get-member
TypeName: System.RuntimeType
Name MemberType Definition
---- ---------- ----------
Clone Method System.Object Clone()
Equals Method System.Boolean Equals
FindInterfaces Method System.Type[] FindInt
...
C:\PS> [BasicTest] | get-member -static
TypeName: BasicTest
Name MemberType Definition
---- ---------- ----------
Add Method static System.Int32 Add(Int32 a, Int32 b)
Equals Method static System.Boolean Equals(Object objA,
ReferenceEquals Method static System.Boolean ReferenceEquals(Obj
C:\PS> $basicTestObject | get-member
TypeName: BasicTest
Name MemberType Definition
---- ---------- ----------
Equals Method System.Boolean Equals(Object obj)
GetHashCode Method System.Int32 GetHashCode()
GetType Method System.Type GetType()
Multiply Method System.Int32 Multiply(Int32 a, Int32 b)
ToString Method System.String ToString()
说明
-----------
这些命令使用 Get-Member cmdlet 来检查 Add-Type 和 New-Object cmdlet 在上一个示例中创建的对象。
第一条命令使用 Get-Member cmdlet 来获取 Add-Type 添加到会话中的 BasicTest 类的类型和成员。Get-Member 命令表明它是从 System.Object 类派生的 System.RuntimeType 对象。
第二条命令使用 Get-Member 的 Static 参数来获取 BasicTest 类的静态属性和方法。输出显示已包含了 Add 方法。
第三条命令使用 Get-Member 来获取 $BasicTestObject 变量中存储的对象成员。这是使用具有 $BasicType 类的 New-Object cmdlet 创建的对象实例。
输出内容表明 $basicTestObject 变量的值是 BasicTest 类的实例,并且它包括名为 Multiply 的成员。
示例 3
C:\PS>$accType = add-type -assemblyname accessib* -passthru
说明
-----------
该命令将类从 Accessibility 程序集添加到当前会话中。此命令使用 AssemblyName 参数来指定程序集的名称。甚至在您不能确定程序集名称或其拼写时,可以使用通配符来获取正确的程序集。
该命令使用 PassThru 参数来生成可表示已添加到会话中的类的对象,并在 $accType 变量中保存这些对象。
示例 4
C:\PS>add-type -path c:\ps-test\Hello.vb
[VBFromFile]::SayHello(", World")
# From Hello.vb
Public Class VBFromFile
Public Shared Function SayHello(sourceName As String) As String
Dim myValue As String = "Hello"
return myValue + sourceName
End Function
End Class
C:\PS> [VBFromFile]::SayHello(", World")
Hello, World
说明
-----------
该示例使用 Add-Type cmdlet 来向当前会话中添加在 Hello.vb 文件中定义的 VBFromFile 类。在该命令的输出中会显示 Hello.vb 文件的文本。
第一条命令使用 Add-Type cmdlet 将 Hello.vb 文件中定义的类型添加到当前会话中。该命令使用 path 参数来指定源文件。
第二条命令将 SayHello 函数作为 VBFromFile 类的静态方法进行调用。
示例 5
C:\PS>$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 Windows PowerShell console
$showWindowAsync::ShowWindowAsync((Get-Process -id $pid).MainWindowHandle, 2)
# Restore it
$showWindowAsync::ShowWindowAsync((Get-Process -id $pid).MainWindowHandle, 4)
说明
-----------
此示例中的命令演示了如何在 Windows PowerShell 中调用本机的 Windows API。Add-Type 使用 Platform Invoke (P/Invoke) 机制来从 Windows PowerShell 调用 User32.dll 中的函数。
第一条命令在 $signature 变量中存储 ShowWindowAsync 函数的 C# 签名。(有关详细信息,请参阅 MSDN Library 中的“ShowWindowAsync 函数”,网址为 https://go.microsoft.com/fwlink/?LinkId=143643。)要确保所得到的方法在 Windows PowerShell 会话中可见,请将“public”关键字添加到标准签名中。
第二条命令使用 Add-Type cmdlet 将 ShowWindowAsync 函数作为 Add-Type 创建的类的静态方法添加到 Windows PowerShell 会话中。该命令使用 MemberDefinition 参数来指定保存在 $signature 变量中的方法定义。
该命令使用 Name 和 Namespace 参数来指定类的名称和命名空间。它使用 PassThru 参数来生成表示类型的对象,并将该对象保存在 $showWindowAsync 变量中。
第三条和第四条命令使用新的 ShowWindowAsync 静态方法。该方法采用两个参数:窗口句柄和指定如何显示窗口的整数。
第三个命令调用 ShowWindowAsync。它使用具有 $pid 自动变量的 Get-Process cmdlet 来获取承载当前 Windows PowerShell 会话的进程。然后使用当前进程的 MainWindowHandle 属性和值“2”(表示 SW_MINIMIZE 值)。
为了还原窗口,第四条命令使用窗口位置的值“4”,它表示 SW_RESTORE 值。(SW_MAXIMIZE 是 3。)
示例 6
C:\PS>Add-Type -MemberDefinition $jsMethod -Name "PrintInfo" -Language JScript
说明
-----------
此命令使用 Add-Type cmdlet 将方法从内联 JScript 代码添加到 Windows PowerShell 会话中。它使用 MemberDefinition 参数来提交存储在 $jsMethod 变量中的源代码。它使用 Name 变量来指定 Add-Type 为该方法创建的类的名称,使用 Language 参数来指定 JScript 语言。
示例 7
C:\PS>Add-Type -Path FSharp.Compiler.CodeDom.dll
C:\PS> Add-Type -Path FSharp.Compiler.CodeDom.dll
C:\PS> $provider = New-Object Microsoft.FSharp.Compiler.CodeDom.FSharpCodeProvider
C:\PS> $fSharpCode = @"
let rec loop n =
if n <= 0 then () else begin
print_endline (string_of_int n);
loop (n-1)
end
"@
C:\PS> $fsharpType = Add-Type -TypeDefinition $fSharpCode -CodeDomProvider $provider -PassThru | where { $_.IsPublic }
C:\PS> $fsharpType::loop(4)
4
3
2
1
说明
-----------
此示例演示了如何使用 Add-Type cmdlet 将 FSharp 代码编译器添加到 Windows PowerShell 会话中。要在 Windows PowerShell 中运行此示例,必须具有使用 FSharp 语言安装的 FSharp.Compiler.CodeDom.dll。
示例中的第一条命令使用具有 Path 参数的 Add-Type cmdlet 来指定程序集。Add-Type 可获取程序集中的类型。
第二条命令使用 New-Object cmdlet 来创建 FSharp 代码提供程序的实例,并将结果保存在 $provider 变量中。
第三个命令保存 FSharp 代码,该代码在 $FSharpCode 变量中定义了 Loop 方法。
第四条命令使用 Add-Type cmdlet 将 $fSharpCode 中定义的公共类型保存在 $fSharpType 变量中。TypeDefinition 参数指定用于定义类型的源代码。CodeDomProvider 参数指定源代码编译器。
PassThru 参数指示 Add-Type 返回表示类型的 Runtime 对象,管道运算符 (|) 将 Runtime 对象发送到仅返回公共类型的 Where-Object cmdlet。由于 FSharp 提供程序生成非公共类型以支持所得到的公共类型,所以需使用 Where-Object 筛选器。
第五条命令将 Loop 方法作为存储在 $fSharpType 变量中的类型的静态方法进行调用。