我使用此代码将 .Net 程序集加载到PowerShell:
[System.Reflection.Assembly]::Load("System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089") | out-null
[System.Windows.Forms.MessageBox]::Show("Hello world")
我可以为程序集设置别名(例如:'System.Windows.Forms'='Forms'),这样在调用MessageBox.Show等静态方法时我就不必输入程序集的全名。 )?
答案 0 :(得分:12)
您可以将类型存储在变量中并使用变量
$forms = [System.Windows.Forms.MessageBox]
$forms::Show('Hello')
在这种情况下,您可以像这样加载程序集:
Add-Type –assembly system.windows.forms
答案 1 :(得分:5)
虽然你不能自己创建某种命名空间别名,但你可以使用以下技巧(取自Lee Holmes的PowerShell Cookbook):
$namespace = "System.Windows.Forms.{0}"
$form = New-Object ($namespace -f "Form")
但这只适用于New-Object
,因为它为类名带了一个字符串。您不能在方括号中使用带有类型名称的语法。
System
使它稍微缩短。
答案 2 :(得分:1)
使用Joey的答案,您可以使用此功能为程序集设置“别名”。它基本上将一个程序集分配给一个具有所需给定别名的函数。
function Global:Add_Assembly_Alias($STR_assembly, $alias) {
[string]$assembly = "$STR_assembly.{0}"
$ExecutionContext.InvokeCommand.InvokeScript(
$ExecutionContext.InvokeCommand.NewScriptBlock("
function Global:$alias(`$namespace) {
[string](`"$assembly`" -f `$namespace)
}
")
)
}
E.g。如果要将System.Windows.Forms分配给wforms,则将主函数称为
Add_Assembly_Alias System.Windows.Forms wforms
它会生成一个名为“wforms”的函数,其命名空间为参数,您可以使用它来添加新对象等。如果要添加例如文本框对象,则只需调用
$tb = new-object (wforms TextBox)
它并不多,但我认为这与你可以将程序集分配给类似别名的东西一样接近。不幸的是,我没有设法阻止这种形式的直接调用
[Windows.Forms.MessageBox]::Show("Hello World!")
但我希望这仍有帮助。
干杯, d
答案 3 :(得分:0)
您可以添加Powershell类型加速器(类型别名):
$accel = [PowerShell].Assembly.GetType("System.Management.Automation.TypeAccelerators")
$accel::add("mb","System.Windows.Forms.MessageBox")
[mb]::Show("Hello world")
使用PowerShell 5,您还可以导入名称空间:
using namespace System.Windows.Forms
[MessageBox]::Show("Hello world")