Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/powershell/11.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
.net PowerShell-为加载的程序集设置别名_.net_Powershell - Fatal编程技术网

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

.net PowerShell-为加载的程序集设置别名,.net,powershell,.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.W

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

虽然您本身无法创建某种名称空间别名,但可以使用以下技巧(摘自Lee Holmes的PowerShell Cookbook):

但这只适用于
新对象
,因为这需要一个字符串作为类名。不能将该语法与方括号中的类型名称一起使用

但是,您可以做的是省略
系统
部分,这意味着:

[Windows.Forms.MessageBox]::Show("Hello World!")

使其略短。

您可以将类型存储在变量中并使用变量

$forms = [System.Windows.Forms.MessageBox]
$forms::Show('Hello')
在这种情况下,可以按如下方式加载程序集:

Add-Type –assembly system.windows.forms
使用的答案,可以使用此函数为程序集设置“别名”。它基本上是将程序集分配给具有所需给定别名名称的函数

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)
            }
        ")
    )
}
例如,如果要将System.Windows.Forms分配给wforms,则可以将主函数调用为

Add_Assembly_Alias System.Windows.Forms wforms
它生成一个名为“wforms”的函数,并将名称空间作为参数,可用于添加新对象等。如果要添加例如textbox对象,则只需调用

$tb = new-object (wforms TextBox)
这并不多,但我认为这是您可以将程序集指定给类似于别名的对象的最接近的方法。不幸的是,我没有设法推动这个表单的直接调用

[Windows.Forms.MessageBox]::Show("Hello World!")
但我希望这仍然有帮助

干杯,
D

您可以添加Powershell类型加速器(类型别名):

更多详细信息,请参阅

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

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

我不知道这个系统被暗示了。谢谢@Kleinux:它用于引用类型,这就是为什么您可以编写
[datetime]
而不是
[system.datetime]
,但它不适用于加载程序集(也就是说,
添加类型-程序集窗口。表单
不起作用)。实际上,“系统”并不是隐含的——它只是搜索路径的一部分。引用“运行中的Windows PowerShell”:类型解析--当PowerShell解析类型名时,它首先检查类型名别名表;然后检查是否存在全名与指定字符串匹配的类型。最后,它用系统来预处理类型。并检查是否存在与新字符串匹配的类型。这意味着系统名称空间中的内容看起来可能有别名。
$accel = [PowerShell].Assembly.GetType("System.Management.Automation.TypeAccelerators")
$accel::add("mb","System.Windows.Forms.MessageBox")
[mb]::Show("Hello world")
using namespace System.Windows.Forms
[MessageBox]::Show("Hello world")