PowerShell - 为加载的程序集设置别名

时间:2010-03-27 12:10:54

标签: .net powershell

我使用此代码将 .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等静态方法时我就不必输入程序集的全名。 )?

4 个答案:

答案 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")

可以找到更多详细信息herehere

使用PowerShell 5,您还可以导入名称空间:

using namespace System.Windows.Forms
[MessageBox]::Show("Hello world")