Add-Type
将Microsoft .NET 类添加到 PowerShell 会话。
语法
FromSource (默认值)
Add-Type
[-TypeDefinition] <String>
[-CodeDomProvider <CodeDomProvider>]
[-CompilerParameters <CompilerParameters>]
[-Language <Language>]
[-ReferencedAssemblies <String[]>]
[-OutputAssembly <String>]
[-OutputType <OutputAssemblyType>]
[-PassThru]
[-IgnoreWarnings]
[<CommonParameters>]
FromMember
Add-Type
[-Name] <String>
[-MemberDefinition] <String[]>
[-CodeDomProvider <CodeDomProvider>]
[-CompilerParameters <CompilerParameters>]
[-Namespace <String>]
[-UsingNamespace <String[]>]
[-Language <Language>]
[-ReferencedAssemblies <String[]>]
[-OutputAssembly <String>]
[-OutputType <OutputAssemblyType>]
[-PassThru]
[-IgnoreWarnings]
[<CommonParameters>]
FromPath
Add-Type
[-Path] <String[]>
[-CompilerParameters <CompilerParameters>]
[-ReferencedAssemblies <String[]>]
[-OutputAssembly <String>]
[-OutputType <OutputAssemblyType>]
[-PassThru]
[-IgnoreWarnings]
[<CommonParameters>]
FromLiteralPath
Add-Type
-LiteralPath <String[]>
[-CompilerParameters <CompilerParameters>]
[-ReferencedAssemblies <String[]>]
[-OutputAssembly <String>]
[-OutputType <OutputAssemblyType>]
[-PassThru]
[-IgnoreWarnings]
[<CommonParameters>]
FromAssemblyName
Add-Type
-AssemblyName <String[]>
[-PassThru]
[-IgnoreWarnings]
[<CommonParameters>]
说明
Add-Type
cmdlet 允许在 PowerShell 会话中定义Microsoft .NET Framework 类。
然后,可以使用 New-Object
cmdlet 实例化对象,并使用对象,就像使用任何 .NET Framework 对象一样。 如果将 Add-Type
命令添加到 PowerShell 配置文件,该类在所有 PowerShell 会话中均可用。
可以通过指定现有程序集或源代码文件来指定类型,也可以指定内联源代码或保存在变量中。 甚至可以仅指定一个方法和 Add-Type
定义和生成类。 在 Windows 上,可以使用此功能对 PowerShell 中的非托管函数进行平台调用(P/Invoke)。 如果指定源代码,Add-Type
编译指定的源代码并生成包含新 .NET Framework 类型的内存中程序集。
可以使用 Add-Type
的参数指定备用语言和编译器,C# 是默认的编译器选项、程序集依赖项、类命名空间、类型的名称和生成的程序集。
示例
示例 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
cmdlet 将类添加到会话中。 由于使用的是内联源代码,因此该命令使用 TypeDefinition 参数来指定 $Source
变量中的代码。
Add
类的 静态方法使用双冒号字符(::
)来指定类的静态成员。 将添加整数并显示总和。
New-Object
cmdlet 实例化 BasicTest 类的实例。 它将新对象保存在 $BasicTestObject
变量中。
$BasicTestObject
使用 Multiply
方法。 整数是相乘的,并显示产品。
示例 2:检查添加的类型
此示例使用 Get-Member
cmdlet 检查在 Add-Type
中创建的 New-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()
Get-Member
cmdlet 获取 添加到会话的 Add-Type
类的类型和成员。
Get-Member
Static 参数获取 BasicTest 类的静态属性和方法。 输出显示包含 Add
方法。
Get-Member
cmdlet 获取存储在 $BasicTestObject
变量中的对象的成员。
$BasicTestObject
是通过将 New-Object
cmdlet 与 BasicTest 类配合使用创建的。 输出显示 $BasicTestObject
变量的值是 BasicTest 类的实例,并且它包含名为 Multiply
的成员。
示例 3:从程序集中添加类型
此示例将 Accessibility.dll
程序集中的类添加到当前会话。
$AccType = Add-Type -AssemblyName "accessib*" -PassThru
$AccType
变量存储使用 Add-Type
cmdlet 创建的对象。
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
cmdlet 将 ShowWindowAsync
函数作为静态方法添加到 PowerShell 会话。 该命令使用 MemberDefinition 参数指定保存在 $Signature
变量中的方法定义。 该命令使用 名称 和 命名空间 参数来指定类的名称和命名空间。
PassThru 参数生成表示类型的对象。
新的 ShowWindowAsync
静态方法用于命令中,以最小化和还原 PowerShell 控制台。 该方法采用两个参数:窗口句柄和一个指定窗口显示方式的整数。
为了最大程度地减少 PowerShell 控制台,ShowWindowAsync
使用具有 Get-Process
自动变量的 $PID
cmdlet 来获取托管当前 PowerShell 会话的进程。 然后,它使用当前进程的 MainWindowHandle 属性和表示 2
值的 SW_MINIMIZE
值。
若要还原窗口,ShowWindowAsync
对表示 4
值的窗口位置使用 SW_RESTORE
值。
若要最大化窗口,请使用表示 3
SW_MAXIMIZE
的值。
示例 5:从 Visual Basic 文件添加类型
此示例使用 Add-Type
cmdlet 将 VBFromFile 类添加到当前会话 Hello.vb
文件中定义的类。 命令输出中显示了 Hello.vb
文件的文本。
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
Hello, World
Add-Type
使用 Path 参数来指定源文件,Hello.vb
并添加文件中定义的类型。
SayHello
函数作为 VBFromFile 类的静态方法调用。
示例 6:添加具有 JScript.NET 的类
此示例使用 JScript.NET 在 PowerShell 会话中创建一个新类,FRectangle。
Add-Type @'
class FRectangle {
var Length : double;
var Height : double;
function Perimeter() : double {
return (Length + Height) * 2; }
function Area() : double {
return Length * Height; } }
'@ -Language JScript
$rect = [FRectangle]::new()
$rect
Length Height
------ ------
0 0
示例 7:添加 F# 编译器
此示例演示如何使用 Add-Type
cmdlet 将 F# 代码编译器添加到 PowerShell 会话。 若要在 PowerShell 中运行此示例,必须使用 F# 语言安装 FSharp.Compiler.CodeDom.dll
。
Add-Type -Path "FSharp.Compiler.CodeDom.dll"
$Provider = New-Object Microsoft.FSharp.Compiler.CodeDom.FSharpCodeProvider
$FSharpCode = @"
let rec loop n =if n <= 0 then () else beginprint_endline (string_of_int n);loop (n-1)end
"@
$FSharpType = Add-Type -TypeDefinition $FSharpCode -CodeDomProvider $Provider -PassThru |
Where-Object { $_.IsPublic }
$FSharpType::loop(4)
4
3
2
1
Add-Type
使用 Path 参数指定程序集并获取程序集中的类型。
New-Object
创建 F# 代码提供程序的实例,并将结果保存在 $Provider
变量中。
$FSharpCode
变量保存用于定义 循环 方法的 F# 代码。
$FSharpType
变量存储保存 Add-Type
中定义的公共类型的 $FSharpCode
cmdlet 的结果。
TypeDefinition 参数指定定义类型的源代码。
CodeDomProvider 参数指定源代码编译器。
PassThru 参数指示 Add-Type
返回表示类型的 Runtime 对象。
对象将管道向下发送到 Where-Object
cmdlet,该 cmdlet 仅返回公共类型。 使用 Where-Object
cmdlet 是因为 F# 提供程序生成非公共类型以支持生成的公共类型。
循环方法作为存储在 $FSharpType
变量中的类型的静态方法调用。
参数
-AssemblyName
指定包含类型的程序集的名称。
Add-Type
从指定的程序集中获取类型。 创建基于程序集名称的类型时,此参数是必需的。
输入程序集的完整名称或简单名称(也称为部分名称)。 程序集名称中允许使用通配符。 如果输入简单名称或部分名称,Add-Type
将其解析为全名,然后使用全名加载程序集。
使用 Path 或 LiteralPath 参数可确保加载要加载的程序集。 使用 AssemblyName 参数时,PowerShell 要求 .NET 使用标准 .NET 程序集解析过程解析程序集名称。 由于 .NET 首先搜索应用程序文件夹,因此 Add-Type
可能会从 $PSHOME
而不是当前文件夹中的版本加载程序集。 有关详细信息,请参阅 程序集位置。
如果 .NET 无法解析名称,PowerShell 将在当前位置查找程序集。 在 AssemblyName 参数中使用通配符时,.NET 程序集解析过程失败,导致 PowerShell 在当前位置查找。
参数属性
类型: | String[] |
默认值: | None |
支持通配符: | True |
不显示: | False |
别名: | 一 |
参数集
FromAssemblyName
Position: | Named |
必需: | True |
来自管道的值: | False |
来自管道的值(按属性名称): | False |
来自剩余参数的值: | False |
-CodeDomProvider
指定代码生成器或编译器。
Add-Type
使用指定的编译器编译源代码。 默认值为 C# 编译器。 如果使用的是无法使用 Language 参数指定的语言,请使用此参数。 指定的 CodeDomProvider 必须能够从源代码生成程序集。
参数属性
类型: | CodeDomProvider |
默认值: | C# compiler |
支持通配符: | False |
不显示: | False |
别名: | 提供者 |
参数集
FromSource
Position: | Named |
必需: | False |
来自管道的值: | False |
来自管道的值(按属性名称): | False |
来自剩余参数的值: | False |
FromMember
Position: | Named |
必需: | False |
来自管道的值: | False |
来自管道的值(按属性名称): | False |
来自剩余参数的值: | False |
-CompilerParameters
指定源代码编译器的选项。 这些选项将发送到编译器而不进行修订。
此参数允许你指示编译器生成可执行文件、嵌入资源或设置命令行选项,例如 /unsafe
选项。 此参数实现 CompilerParameters 类,System.CodeDom.Compiler.CompilerParameters。
不能在同一命令中使用 CompilerParameters 和 ReferencedAssemblies 参数。
参数属性
类型: | CompilerParameters |
默认值: | None |
支持通配符: | False |
不显示: | False |
别名: | CP |
参数集
FromSource
Position: | Named |
必需: | False |
来自管道的值: | False |
来自管道的值(按属性名称): | False |
来自剩余参数的值: | False |
FromMember
Position: | Named |
必需: | False |
来自管道的值: | False |
来自管道的值(按属性名称): | False |
来自剩余参数的值: | False |
FromPath
Position: | Named |
必需: | False |
来自管道的值: | False |
来自管道的值(按属性名称): | False |
来自剩余参数的值: | False |
FromLiteralPath
Position: | Named |
必需: | False |
来自管道的值: | False |
来自管道的值(按属性名称): | False |
来自剩余参数的值: | False |
-IgnoreWarnings
忽略编译器警告。 使用此参数可防止 Add-Type
将编译器警告作为错误进行处理。
参数属性
类型: | SwitchParameter |
默认值: | False |
支持通配符: | False |
不显示: | False |
参数集
(All)
Position: | Named |
必需: | False |
来自管道的值: | False |
来自管道的值(按属性名称): | False |
来自剩余参数的值: | False |
-Language
指定源代码中使用的语言。
Add-Type
cmdlet 使用此参数的值来选择相应的 CodeDomProvider。 CSharp 是默认值。 此参数的可接受值如下所示:
CSharp
CSharpVersion2
CSharpVersion3
JScript
VisualBasic
参数属性
类型: | Language |
默认值: | CSharp |
接受的值: | CSharp, CSharpVersion2, CSharpVersion3, JScript, VisualBasic |
支持通配符: | False |
不显示: | False |
参数集
FromSource
Position: | Named |
必需: | False |
来自管道的值: | False |
来自管道的值(按属性名称): | False |
来自剩余参数的值: | False |
FromMember
Position: | Named |
必需: | False |
来自管道的值: | False |
来自管道的值(按属性名称): | False |
来自剩余参数的值: | False |
-LiteralPath
指定包含类型的源代码文件或程序集 DLL 文件的路径。 与 Path不同,LiteralPath 参数的值按输入原样使用。 不会将任何字符解释为通配符。 如果路径包含转义字符,请将它括在单引号中。 单引号告知 PowerShell 不要将任何字符解释为转义序列。
使用 Path 或 LiteralPath 参数可确保加载要加载的程序集。
参数属性
类型: | String[] |
默认值: | None |
支持通配符: | False |
不显示: | False |
别名: | PSPath |
参数集
FromLiteralPath
Position: | Named |
必需: | True |
来自管道的值: | False |
来自管道的值(按属性名称): | False |
来自剩余参数的值: | False |
-MemberDefinition
指定类的新属性或方法。
Add-Type
生成支持属性或方法所需的模板代码。
在 Windows 上,可以使用此功能对 PowerShell 中的非托管函数进行平台调用(P/Invoke)。
参数属性
类型: | String[] |
默认值: | None |
支持通配符: | False |
不显示: | False |
参数集
FromMember
Position: | 1 |
必需: | True |
来自管道的值: | False |
来自管道的值(按属性名称): | False |
来自剩余参数的值: | False |
-Name
指定要创建的类的名称。 从成员定义生成类型时,此参数是必需的。
类型名称和命名空间在会话中必须是唯一的。 无法卸载类型或更改它。 若要更改类型的代码,必须更改名称或启动新的 PowerShell 会话。 否则,命令将失败。
参数属性
类型: | String |
默认值: | None |
支持通配符: | False |
不显示: | False |
参数集
FromMember
Position: | 0 |
必需: | True |
来自管道的值: | False |
来自管道的值(按属性名称): | False |
来自剩余参数的值: | False |
-Namespace
默认情况下,此命令在 Microsoft.PowerShell.Commands.AddType.AutoGeneratedTypes 命名空间中创建类型。 使用此参数时,类型是在指定的命名空间中创建的。 如果值为空字符串,则会在全局命名空间中创建该类型。
参数属性
类型: | String |
默认值: | None |
支持通配符: | False |
不显示: | False |
别名: | NS |
参数集
FromMember
Position: | Named |
必需: | False |
来自管道的值: | False |
来自管道的值(按属性名称): | False |
来自剩余参数的值: | False |
-OutputAssembly
为位置中具有指定名称的程序集生成 DLL 文件。 输入可选路径和文件名。 允许使用通配符。 默认情况下,Add-Type
仅在内存中生成程序集。 如果将程序集输出到文件中,则应包含 PassThru 参数,以便从新创建的程序集返回类型。
参数属性
类型: | String |
默认值: | None |
支持通配符: | True |
不显示: | False |
别名: | OA |
参数集
FromSource
Position: | Named |
必需: | False |
来自管道的值: | False |
来自管道的值(按属性名称): | False |
来自剩余参数的值: | False |
FromMember
Position: | Named |
必需: | False |
来自管道的值: | False |
来自管道的值(按属性名称): | False |
来自剩余参数的值: | False |
FromPath
Position: | Named |
必需: | False |
来自管道的值: | False |
来自管道的值(按属性名称): | False |
来自剩余参数的值: | False |
FromLiteralPath
Position: | Named |
必需: | False |
来自管道的值: | False |
来自管道的值(按属性名称): | False |
来自剩余参数的值: | False |
-OutputType
指定输出程序集的输出类型。 默认情况下,未指定任何输出类型。 仅当命令中指定输出程序集时,此参数才有效。 有关这些值的详细信息,请参阅 OutputAssemblyType 枚举。
此参数的可接受值如下所示:
ConsoleApplication
Library
WindowsApplication
参数属性
类型: | OutputAssemblyType |
默认值: | None |
接受的值: | ConsoleApplication, Library, WindowsApplication |
支持通配符: | False |
不显示: | False |
别名: | OT |
参数集
FromSource
Position: | Named |
必需: | False |
来自管道的值: | False |
来自管道的值(按属性名称): | False |
来自剩余参数的值: | False |
FromMember
Position: | Named |
必需: | False |
来自管道的值: | False |
来自管道的值(按属性名称): | False |
来自剩余参数的值: | False |
FromPath
Position: | Named |
必需: | False |
来自管道的值: | False |
来自管道的值(按属性名称): | False |
来自剩余参数的值: | False |
FromLiteralPath
Position: | Named |
必需: | False |
来自管道的值: | False |
来自管道的值(按属性名称): | False |
来自剩余参数的值: | False |
-PassThru
返回一个 System.Runtime 对象,该对象代表所添加的类型。 默认情况下,此 cmdlet 不会生成任何输出。 如果使用 OutputAssembly 创建 DLL 文件,并且想要从新创建的程序集返回类型,请使用此参数。
参数属性
类型: | SwitchParameter |
默认值: | False |
支持通配符: | False |
不显示: | False |
参数集
(All)
Position: | Named |
必需: | False |
来自管道的值: | False |
来自管道的值(按属性名称): | False |
来自剩余参数的值: | False |
-Path
指定包含类型的源代码文件或程序集 DLL 文件的路径。
如果提交源代码文件,Add-Type
编译文件中的代码,并创建类型的内存中程序集。
Path 的值中指定的文件扩展名决定了 Add-Type
使用的编译器。
如果提交程序集文件,Add-Type
从程序集中获取类型。 若要指定内存中程序集或全局程序集缓存,请使用 AssemblyName 参数。
参数属性
类型: | String[] |
默认值: | None |
支持通配符: | False |
不显示: | False |
参数集
FromPath
Position: | 0 |
必需: | True |
来自管道的值: | False |
来自管道的值(按属性名称): | False |
来自剩余参数的值: | False |
-ReferencedAssemblies
指定类型所依赖的程序集。 默认情况下,Add-Type
引用 System.dll
和 System.Management.Automation.dll
。 除了默认程序集之外,还引用了使用此参数指定的程序集。
不能在同一命令中使用 CompilerParameters 和 ReferencedAssemblies 参数。
参数属性
类型: | String[] |
默认值: | None |
支持通配符: | False |
不显示: | False |
别名: | RA |
参数集
FromSource
Position: | Named |
必需: | False |
来自管道的值: | False |
来自管道的值(按属性名称): | False |
来自剩余参数的值: | False |
FromMember
Position: | Named |
必需: | False |
来自管道的值: | False |
来自管道的值(按属性名称): | False |
来自剩余参数的值: | False |
FromPath
Position: | Named |
必需: | False |
来自管道的值: | False |
来自管道的值(按属性名称): | False |
来自剩余参数的值: | False |
FromLiteralPath
Position: | Named |
必需: | False |
来自管道的值: | False |
来自管道的值(按属性名称): | False |
来自剩余参数的值: | False |
-TypeDefinition
指定包含类型定义的源代码。 在字符串或此处字符串中输入源代码,或输入包含源代码的变量。 有关 here-string 的详细信息,请参阅 about_Quoting_Rules。
在类型定义中包含命名空间声明。 如果省略命名空间声明,则类型可能具有与另一种类型相同的名称或另一种类型的快捷方式,从而导致意外覆盖。 例如,如果定义名为 “异常”的类型,则使用 异常 作为 System.Exception 快捷方式的脚本将失败。
参数属性
类型: | String |
默认值: | None |
支持通配符: | False |
不显示: | False |
参数集
FromSource
Position: | 0 |
必需: | True |
来自管道的值: | False |
来自管道的值(按属性名称): | False |
来自剩余参数的值: | False |
-UsingNamespace
指定类所需的其他命名空间。 这与 C# 关键字非常类似,Using
。
默认情况下,Add-Type
引用 系统 命名空间。 使用 MemberDefinition 参数时,Add-Type
默认还会引用 System.Runtime.InteropServices 命名空间。 除了默认命名空间之外,还引用了使用 UsingNamespace 参数添加的命名空间。
参数属性
类型: | String[] |
默认值: | System namespace |
支持通配符: | False |
不显示: | False |
别名: | Using |
参数集
FromMember
Position: | Named |
必需: | False |
来自管道的值: | False |
来自管道的值(按属性名称): | False |
来自剩余参数的值: | False |
CommonParameters
此 cmdlet 支持通用参数:-Debug、-ErrorAction、-ErrorVariable、-InformationAction、-InformationVariable、-OutBuffer、-OutVariable、-PipelineVariable、-ProgressAction、-Verbose、-WarningAction 和 -WarningVariable。 有关详细信息,请参阅 about_CommonParameters。
输入
None
不能用管道将对象传送到此 cmdlet。
输出
None
默认情况下,此 cmdlet 不返回任何输出。
Type
使用 PassThru 参数时,此 cmdlet 返回表示新类型的 System.Type 对象。
备注
添加的类型仅存在于当前会话中。 若要在所有会话中使用类型,请将它们添加到 PowerShell 配置文件。 有关配置文件的详细信息,请参阅 about_Profiles。
类型名称和命名空间在会话中必须是唯一的。 无法卸载类型或更改它。 如果需要更改类型的代码,则必须更改名称或启动新的 PowerShell 会话。 否则,命令将失败。
某些语言(如 IronPython 和 J#)的 CodeDomProvider 类不会生成输出。 因此,用这些语言编写的类型不能与 Add-Type
一起使用。
此 cmdlet 基于 Microsoft .NET Framework CodeDomProvider 类。