.NET types

PowerShell Team

In response to the recent Days till Xmas post, applepwc asked the question 
   >  where can I find more “.NET types”?I mean is there a list of “.NET type”  available in monad?

Excellent question but there are a number of aspects to it so let’s break it down:

.NET is a developer platform.  That platform contains a number of libraries that developers can use to develope their code.  Reference information for the classes that ship with the .NET platform are available at http://msdn.microsoft.com/library/default.asp?url=/library/en-us/cpref/html/frlrfsystemdatetimememberstopic.asp .

Other developers take that platform and produce their own .NET types and ship them as assemblies (DLLs) or included in their executables.  Each team will provide they own documentation for their types.  Monad makes this information avilable as part of its SDK.

Then there is the question: which of these types are available to Monad.  The answer is that Monad provides access to any public .NET type which is loaded in process.  The following sequence tells you what assemblies you have loaded in your current process (appdomain actually but we don’t need to go there now).

MSH> [appdomain]::currentdomain.getassemblies() |ft fullname

mscorlib, Version=, Culture=neutral, PublicKeyToken=b77a5…
System.Management.Automation.ConsoleHost, Version=1.0.490.0, Cul…
System, Version=, Culture=neutral, PublicKeyToken=b77a5c5…
System.Management.Automation, Version=1.0.490.0, Culture=neutral…
System.Management.Automation.ConsoleHost.resources, Version=1.0….
System.Configuration.Install, Version=, Culture=neutral, …
System.Management.Automation.Commands.Management, Version=1.0.49…
System.Management.Automation.Security, Version=1.0.490.0, Cultur…
System.Management.Automation.Commands.Utility, Version=1.0.490.0…
System.Management, Version=, Culture=neutral, PublicKeyTo…
System.DirectoryServices, Version=, Culture=neutral, Publ…
System.Data, Version=, Culture=neutral, PublicKeyToken=b7…
System.Xml, Version=, Culture=neutral, PublicKeyToken=b77…
System.Management.Automation.resources, Version=1.0.490.0, Cultu…
System.Management.Automation.Security.resources, Version=1.0.490…
System.Windows.Forms, Version=, Culture=neutral, PublicKe…
System.Drawing, Version=, Culture=neutral, PublicKeyToken…
System.Management.Automation.Commands.Utility.resources, Version…
System.Management.Automation.Commands.Management.resources, Vers…

This call returns an assembly object.  This object has a method GetExportedTypes() which gets all the public types (as opposed to private types which you don’t have access to) for that assemblies.  Thus if you wanted to get all the types available in process you would do the following: 

MSH> [appdomain]::currentdomain.getassemblies() |foreach {$_.getexpo

IsPublic IsSerial Name                                     BaseType
——– ——– —-                                     ——–
True     True     Object
True     False    ICloneable
True     False    IEnumerable
True     False    ICollection
True     False    IList
True     True     Array                                    Syste…

I use this quite a bit actually.  I create a function Match-Type to find a set of .Net Types:

function Match-Type ($Name)
{  [Appdomain]::CurrentDomain.GetAssemblies() |
       foreach {$_.GetExportedTypes()} |
          where {$_.FullName -match $Name}

MSH>  Match-Type mshhost |ft FullName


This is a good point to take a tangent.  In an earlier post, I pointe dou that some .NET types can parse strings and how wonderful that was.  You might reasonably ask yourself the question: Which types support the Parse() method.  Here is a function that helps address that:

function Match-Method ($Name)
{  [Appdomain]::CurrentDomain.GetAssemblies() |
     foreach {$_.GetExportedTypes()} |
      foreach {
        $Type = $_
        if ($Type.GetMethods() | where {$_.Name -match $Name}) {
MSH> match-Method Parse

IsPublic IsSerial Name                                     BaseType
——– ——– —-                                     ——–
True     True     Enum                                     Syste…
True     True     DateTime                                 Syste…
True     True     Boolean                                  Syste…
True     True     Byte                                     Syste…
True     True     Char                                     Syste…

The last issue is, how do I load types into my process if they aren’t already there.  Lee Holmes has a great blog entry on that at: http://www.leeholmes.com/blog/HowDoIEasilyLoadAssembliesWhenLoadWithPartialNameHasBeenDeprecated.aspx

I hope that this was useful.


Jeffrey P. Snover
Monad Architect

[Edit: Monad has now been renamed to Windows PowerShell. This script or discussion may require slight adjustments before it applies directly to newer builds.]