【问题标题】:Powershell: list members of a .net componentPowershell:列出.net组件的成员
【发布时间】:2014-10-10 10:28:29
【问题描述】:

我正在尝试构建一个脚本,该脚本将为我提供来自 .net 组件的 dll 方法列表。

这是我到目前为止所做的:

Param([String]$path)
if($path.StartsWith("["))
{
$asm = [Reflection.Assembly]::LoadWithPartialName($path)
$asm.GetTypes() | select Name, Namespace | sort Namespace | ft -groupby Namespace
}
else
{
$asm = [Reflection.Assembly]::LoadFile($path)
$asm.GetTypes() | select Name, Namespace | sort Namespace | ft -groupby Namespace
}

所以基本上脚本的第二部分(在提供 dll 的路径时)工作得非常好;

运行 '.\GetDllMethods.ps1 -path "C:\Program Files (x86)\WinSCP\WinSCPnet.dll"' 将为我提供 WinSCP dll 的所有成员。

我想用脚本的第一部分实现的是通过提供 .net 组件的名称来获得相同的结果:

.\GetDllMethods.ps1 -path "[System.IO.StreamWriter]"

获取StreamWriter组件的所有成员。

但是我在这里得到一个空异常..有什么提示吗?

【问题讨论】:

    标签: .net powershell dll reflection


    【解决方案1】:

    您可以使用 powershell cmdlet get-member

    PS>[system.net.webclient]|get-member  -MemberType method                                                                              
    
    
       TypeName : System.RuntimeType                                                                                
    
    Name                           MemberType Definition                                                            
    ----                           ---------- ----------                                                            
    AsType                         Method     type AsType()                                                         
    Clone                          Method     System.Object Clone(), System.Object ICloneable.Clone()               
    

    ...

    我们可以看到有一个GetMethods方法,所以试试:

    [system.net.webclient].GetMethods()    
    

    【讨论】:

    • 好吧,我没注意有一个 GetMethods 方法。这让我的工作有点轻松。感谢您的帮助。
    • 虽然 "[System.IO.StreamWriter].GetMethods() | select Name | sort-object name | get-unique -asstring" 将起作用,但我无法将其转移到参数化脚本中行“[$assembly].GetMethods() | 选择名称 | 排序对象名称 | 获取唯一 -asstring”。如何从存储在字符串中的名称调用程序集的 get 方法?
    • 我会用这个:$class="system.net.webclient" ; $o=new-object $class ; $o |get-member -MemberType method
    • 它适用于您使用“System.Net.WebClient”的示例,但它似乎并不通用,因为尝试使用其他一些 .net 组件,例如 System.Data.DataTable(许多示例)将引发错误......即使命令“[System.Data.DataTable].GetMethods()”会带来结果。
    【解决方案2】:

    虽然其他答案在技术上是正确的,但他们没有回答您关于脚本第一部分为什么不起作用的问题。

    我认为这是两方面的原因:

    1. 如果程序集已经加载,它可能会导致空值响应
    2. Lo​​adWithPartialName 方法的语法不使用方括号,因此您需要从字符串中过滤掉它们,或者一开始就不提供它们

    您可以检查程序集是否已加载以下内容:

    [Reflection.Assembly]::GetAssembly('assemblyName')
    

    如果程序集未加载/未找到,请将其包装在 try-catch 中以处理错误。

    【讨论】:

    • 感谢您在程序集未加载时提示空值。
    • 虽然 "[System.IO.StreamWriter].GetMethods() | select Name | sort-object name | get-unique -asstring" 将起作用,但我无法将其转移到参数化脚本中行“[$assembly].GetMethods() | 选择名称 | 排序对象名称 | 获取唯一 -asstring”。如何从存储在字符串中的名称调用程序集的 get 方法?
    • 我认为你需要这样做:$asm = [System.IO.StreamWriter],然后是 $asm.GetMethods()
    • 如果我事先知道程序集的名称('System.IO.StreamWriter' 是一个例子),那就可以了,但是如何动态地做到这一点;我希望能够将程序集的名称作为参数发送以获取方法。
    猜你喜欢
    • 2021-07-13
    • 1970-01-01
    • 2014-07-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多