Add-Type
将 Microsoft .NET 类添加到 PowerShell 会话。
语法
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>]
说明
cmdlet Add-Type
允许在 PowerShell 会话中定义 Microsoft .NET Core 类。 然后, New-Object
可以使用 cmdlet 实例化对象,并使用对象,就像使用任何 .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
在 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
代码。
Add
BasicTest 类的静态方法使用双冒号字符 (::
) 指定类的静态成员。 将添加整数并显示总和。
cmdlet New-Object
实例化 BasicTest 类的实例。 它将新对象保存在 变量中 $BasicTestObject
。
$BasicTestObject
Multiply
使用 方法。 整数相乘,并显示积。
示例 2:检查添加的类型
此示例使用 Get-Member
cmdlet 检查 和 New-Object
cmdlet 在示例 1 中创建的对象Add-Type
。
[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 对象。
Get-Member
Static 参数获取 BasicTest 类的静态属性和方法。 输出显示 Add
包含 方法。
Get-Member
cmdlet 获取存储在 变量中的 $BasicTestObject
对象的成员。
$BasicTestObject
是使用 New-Object
cmdlet 和 BasicTest 类创建的。 输出显示变量的值 $BasicTestObject
是 BasicTest 类的实例,并且它包含一个名为 的成员 Multiply
。
示例 3:从程序集添加类型
本示例将程序集中的 NJsonSchema.dll
类添加到当前会话。
Set-Location -Path $PSHOME
$AccType = Add-Type -AssemblyName *jsonschema* -PassThru
Set-Location
使用 Path 参数指定 $PSHOME
变量。 变量引用 DLL 文件所在的 PowerShell 安装目录。
变量 $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);
"@
$ShowWindowAsync = Add-Type -MemberDefinition $Signature -Name "Win32ShowWindowAsync" -Namespace Win32Functions -PassThru
# 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
关键字 (keyword) 已添加到标准签名。 有关详细信息,请参阅 ShowWindowAsync 函数。
变量 $ShowWindowAsync
存储由 Add-Type
PassThru 参数创建的对象。
cmdlet Add-Type
将 ShowWindowAsync
函数作为静态方法添加到 PowerShell 会话。 命令使用 MemberDefinition 参数指定变量中 $Signature
保存的方法定义。 该命令使用 Name 和 Namespace 参数来指定类的名称和命名空间。 PassThru 参数生成表示类型的 对象。
ShowWindowAsync
新的静态方法在命令中使用,以最小化和还原 PowerShell 控制台。 方法采用两个参数:窗口句柄和指定窗口显示方式的整数。
若要最小化 PowerShell 控制台, ShowWindowAsync
请使用 Get-Process
具有自动变量的 $PID
cmdlet 来获取托管当前 PowerShell 会话的进程。 然后,它使用当前进程的 MainWindowHandle 属性和 表示值的 值2
SW_MINIMIZE
。
若要还原窗口, ShowWindowAsync
请对窗口位置使用 值 4
,该值表示值 SW_RESTORE
。
若要最大化窗口,请使用 表示 SW_MAXIMIZE
的值3
。
参数
-AssemblyName
指定包含类型的程序集的名称。 Add-Type
从指定的程序集中获取类型。 基于程序集名称创建类型时,此参数是必需的。
输入程序集的完整名称或简单名称,也称为部分名称。 在程序集名称中允许使用通配符。 如果输入简单名称或部分名称, Add-Type
请将其解析为全名,然后使用全名加载程序集。
此参数不接受路径或文件名。 若要 (DLL) 文件输入程序集动态链接库的路径,请使用 Path 参数。
Type: | String[] |
Aliases: | AN |
Position: | Named |
Default value: | None |
Required: | True |
Accept pipeline input: | False |
Accept wildcard characters: | True |
-CompilerOptions
指定用于源代码编译器的选项。 这些选项无需修改即可发送到编译器。
此参数允许你指示编译器生成可执行文件、嵌入资源或设置命令行选项(如 /unsafe
选项)。
不能在同一命令中使用 CompilerOptions 和 ReferencedAssemblies 参数。
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 不要将任何字符解释为转义序列。
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
重要
从 PowerShell 7.1 开始, ConsoleApplication
不支持 和 WindowsApplication
,如果其中一个指定为 OutputType 参数的值,PowerShell 将引发终止错误。
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
将编译文件中的代码,并创建类型的内存中程序集。 Path 值中指定的文件扩展名确定使用的编译器Add-Type
。
如果提交程序集文件, Add-Type
请从程序集中获取类型。 若要指定内存中程序集或全局程序集缓存,请使用 AssemblyName 参数。
Type: | String[] |
Position: | 0 |
Default value: | None |
Required: | True |
Accept pipeline input: | False |
Accept wildcard characters: | False |
-ReferencedAssemblies
指定类型所依赖的程序集。 默认情况下, Add-Type
引用 System.dll
和 System.Management.Automation.dll
。 除了引用默认程序集之外,还将引用你通过使用此参数指定的程序集。
从 PowerShell 6 开始, ReferencedAssemblies 不包含默认的 .NET 程序集。 必须在传递给此参数的值中包含对它们的特定引用。
不能在同一命令中使用 CompilerOptions 和 ReferencedAssemblies 参数。
Type: | String[] |
Aliases: | RA |
Position: | Named |
Default value: | None |
Required: | False |
Accept pipeline input: | False |
Accept wildcard characters: | False |
-TypeDefinition
指定包含类型定义的源代码。 以字符串或 here-string 的形式输入源代码或输入一个包含源代码的变量。 有关 here-strings 的详细信息,请参阅 about_Quoting_Rules。
在类型定义中包括命名空间声明。 如果省略命名空间声明,则你的类型可能会与其他类型或其他类型的快捷方式同名,从而导致意外覆盖。 例如,如果定义名为 Exception 的类型,则使用 Exception 作为 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
引用 System 命名空间。 使用 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
无法将对象向下发送到管道 Add-Type
。
输出
None or System.Type
使用 PassThru 参数时, Add-Type
返回表示新类型的 System.Type 对象。 否则,此 cmdlet 不会生成任何输出。
备注
你添加的类型仅存在当前会话中。 若要在所有会话中使用类型,请将其添加到 PowerShell 配置文件。 有关配置文件的详细信息,请参阅 about_Profiles。
类型名称和命名空间在会话中必须是唯一的。 无法卸载或更改类型。 如果需要更改类型的代码,则必须更改名称或启动新的 PowerShell 会话。 否则,该命令将失败。
在 Windows PowerShell (5.1 及更低版本) 中,需要对尚未加载的任何内容使用Add-Type
。 这通常适用于全局程序集缓存 (GAC) 中找到的程序集。
在 PowerShell 6 及更高版本中,没有 GAC,因此 PowerShell 会在 中 $PSHome
安装自己的程序集。
这些程序集会根据请求自动加载,因此无需使用 Add-Type
来加载它们。 但是,仍允许使用 Add-Type
以允许脚本与任何 PowerShell 版本隐式兼容。
GAC 中的程序集可以按类型名称加载,而不是按路径加载。 从任意路径加载程序集需要 Add-Type
,因为无法自动加载这些程序集。