]
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
cmdlet 允许在 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
查找包含
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
cmdlet 将类添加到会话中。 因为它使用的是内联源代码,所以该命令使用
TypeDefinition
参数来指定
$Source
变量中的代码。
BasicTest
类的
Add
静态方法使用双冒号字符 (
::
) 来指定该类的静态成员。 将整数相加并显示总和。
New-Object
cmdlet 实例化
BasicTest
类的实例。 它将新对象保存在
$BasicTestObject
变量中。
$BasicTestObject
使用
Multiply
方法。 将整数相乘并显示乘积。
示例 2:检查添加的类型
此示例使用
Get-Member
cmdlet 检查
Add-Type
和
New-Object
cmdlet 在
示例 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
cmdlet 获取
Add-Type
添加到会话的
BasicTest
类的类型和成员。
Get-Member
命令表明它是一个派生自
System.Object
类的
System.RuntimeType
对象。
Get-Member
Static
参数获取 BasicTest
类的
静态属性和方法。 该输出显示包含了
Add
方法。
Get-Member
cmdlet 获取存储在
$BasicTestObject
变量中的对象的成员。
$BasicTestObject
是通过配合使用
New-Object
cmdlet 与
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
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
变量存储 PassThru
Add-Type
参数创建的对象。
Add-Type
cmdlet 将
ShowWindowAsync
函数作为静态方法添加到 PowerShell 会话。 该命令使用
MemberDefinition
参数来指定保存在
$Signature
变量中的方法定义。 该命令使用
Name
和
Namespace
参数来指定类的名称和命名空间。
PassThru
参数生成一个表示类型的对象。
新的
ShowWindowAsync
静态方法用于最小化和还原 PowerShell 控制台的命令中。 该方法采用两个参数:窗口句柄和指定如何显示窗口的整数。
为了最小化 PowerShell 控制台,
ShowWindowAsync
结合使用
Get-Process
cmdlet 与
$PID
自动变量,以获取托管当前 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
当前文件夹中加载程序集而不是版本。 有关详细信息,请参阅
程序集位置
。
如果 .NET 无法解析名称,PowerShell 将在当前位置查找程序集。 在 AssemblyName
参数中使用通配符
时,.NET 程序集解析过程失败,导致 PowerShell 在当前位置查找。
类型:
String
[
]
别名:AN
Position:Named
默认值:None
必需:True
接受管道输入:False
接受通配符:True
-CompilerOptions
指定用于源代码编译器的选项。 这些选项无需修改即可发送到编译器。
此参数使你可以指示编译器生成可执行文件、嵌入资源,或设置命令行选项,如
/unsafe
选项。
类型:
String
[
]
Position:Named
默认值:None
必需:False
接受管道输入:False
接受通配符:False
-IgnoreWarnings
忽略编译器警告。 使用此参数防止
Add-Type
将编译器警告作为错误进行处理。
类型:
SwitchParameter
Position:Named
默认值:False
必需:False
接受管道输入:False
接受通配符:False
-Language
指定在源代码中使用的语言。 此参数
CSharp
的可接受值为 .
类型:
Language
接受的值:CSharp
Position:Named
默认值:CSharp
必需:False
接受管道输入:False
接受通配符:False
-LiteralPath
指定包含类型的源代码文件或程序集 DLL 文件的路径。 与
Path
不同,
LiteralPath
参数的值严格按照所键入的形式使用。 不会将任何字符解释为通配符。 如果路径包括转义符,请将其括在单引号中。 单引号告知 PowerShell 不要将任何字符解释为转义序列。
使用 Path
或
LiteralPath
参数可确保加载要加载的程序集。
类型:
String
[
]
别名:PSPath, LP
Position:Named
默认值:None
必需:True
接受管道输入:False
接受通配符:False
-MemberDefinition
指定类的新属性或方法。
Add-Type
生成支持属性或方法所需的模板代码。
在 Windows 上,可以使用此功能对 PowerShell 中的未托管函数进行“平台调用”(P/Invoke) 调用。
类型:
String
[
]
Position:1
默认值:None
必需:True
接受管道输入:False
接受通配符:False
-Name
指定要创建的类的名称。 当从成员定义生成类型时,此参数是必需的。
类型名称和命名空间在一个会话中必须是唯一的。 不可以卸载或更改类型。
要更改类型的代码,必须更改其名称或启动新的 PowerShell 会话。
否则,该命令将失败。
类型:
String
Position:0
默认值:None
必需:True
接受管道输入:False
接受通配符:False
-Namespace
指定类型的命名空间。
如果命令中未包括此参数,则将在
Microsoft.PowerShell.Commands.AddType.AutoGeneratedTypes
命名空间中创建类型。 如果在含有空字符串值或
$Null
值的命令中包括此参数,则将在全局命名空间中生成类型。
类型:
String
别名:NS
Position:Named
默认值:None
必需:False
接受管道输入:False
接受通配符:False
-OutputAssembly
在该位置中为具有指定名称的程序集生成 DLL 文件。 输入可选路径和文件名。 允许使用通配符。 默认情况下,
Add-Type
仅在内存中生成程序集。
类型:
String
别名:OA
Position:Named
默认值:None
必需:False
接受管道输入:False
接受通配符:True
-OutputType
指定输出程序集的输出类型。 默认情况下,不指定输出类型。 仅当命令中指定了输出程序集时,此参数才有效。 有关这些值的详细信息,请参阅
OutputAssemblyType 枚举
。
此参数的可接受值如下所示:
ConsoleApplication
Library
WindowsApplication
自 PowerShell 7.1 起,不支持
ConsoleApplication
和
WindowsApplication
,如果将两者中的任何一个指定为
OutputType
参数的值,则 PowerShell 将引发终止错误。
指定包含类型的源代码文件或程序集 DLL 文件的路径。
如果提交源代码文件,则
Add-Type
将编译这些文件中的代码并创建这些类型的内存中程序集。 在
Path
的值中指定的文件扩展名将确定
Add-Type
使用的编译器。
使用 Path
或
LiteralPath
参数可确保加载要加载的程序集。
类型:
String
[
]
Position:0
默认值:None
必需:True
接受管道输入:False
接受通配符:False
-ReferencedAssemblies
指定类型所依赖的程序集。 默认情况下,
Add-Type
引用
System.dll
和
System.Management.Automation.dll
。 除了引用默认程序集之外,还将引用你通过使用此参数指定的程序集。
从 PowerShell 6 开始,
ReferencedAssemblies
不包含默认的 .NET 程序集。 必须在传递给此参数的值中包含对它们的特定引用。
类型:
String
[
]
别名:RA
Position:Named
默认值:None
必需:False
接受管道输入:False
接受通配符:False
-TypeDefinition
指定包含类型定义的源代码。 以字符串或 here-string 的形式输入源代码或输入一个包含源代码的变量。 有关 here-string 的详细信息,请参阅
about_Quoting_Rules
。
在类型定义中包括命名空间声明。 如果省略命名空间声明,则你的类型可能会与其他类型或其他类型的快捷方式同名,从而导致意外覆盖。 例如,如果你定义一个名为
Exception
的类型,则将
Exception
用作
System.Exception
的快捷方式的脚本将失败。
类型:
String
Position:0
默认值:None
必需:True
接受管道输入:False
接受通配符:False
-UsingNamespace
指定类所需的其他命名空间。 这非常类似于 C# 关键字
Using
。
默认情况下,
Add-Type
引用
System
命名空间。 当使用
MemberDefinition
参数时,
Add-Type
默认情况下还引用
System.Runtime.InteropServices
命名空间。 除了引用默认命名空间之外,还会引用你通过使用
UsingNamespace
参数添加的命名空间。
类型:
String
[
]
别名:Using
Position:Named
默认值:System namespace
必需:False
接受管道输入:False
接受通配符:False
不能通过管道将对象传递给此 cmdlet。
默认情况下,此 cmdlet 不返回任何输出。
使用
PassThru
参数时,此 cmdlet 返回表示新类型的
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
,因为这些程序集无法自动加载。
about_Profiles
about_Quoting_Rules
Add-Member
New-Object
OutputAssemblyType
平台调用 (P/Invoke)
Where-Object
即将发布:在整个 2024 年,我们将逐步淘汰作为内容反馈机制的“GitHub 问题”,并将其取代为新的反馈系统。 有关详细信息,请参阅:
https://aka.ms/ContentUserFeedback
。
提交和查看相关反馈