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 变量中的类型的静态方法进行调用。





另请参阅

概念

Add-Member
New-Object