Powershell:列出.net组件的成员

时间:2014-10-10 10:28:30

标签: .net powershell dll reflection

我正在尝试构建一个脚本,它将为我提供.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组件的所有成员。

但我在这里得到一个空例外..任何提示?

2 个答案:

答案 0 :(得分:4)

您可以使用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()    

答案 1 :(得分:3)

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

我认为这是两个部分原因:

  1. 如果已加载程序集,则可能会导致空值响应
  2. LoadWithPartialName方法的语法不使用方括号,因此您需要过滤字符串中的字符串,或者不首先提供它们
  3. 您可以检查装配是否已加载以下内容:

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

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