Getting MSDN help urls for .NET BCL types and Members

 Often when playing with .Net objects in Monad, I need to use MSDN class library reference to learn how to use a particular type and its members. Now, I have my bookmarks and favorite search engine but I always thought it would be cool if get-member cmdlet could provide me a help link/reference to go to. Thanks to the way MSDN organizes the class library content this seems possible.  MSDN uses the .Net namespace to organize the content. So https://msdn2.microsoft.com/library/System.Diagnostics.Process.aspx  refers to the page providing information on the Process Type while https://msdn2.microsoft.com/library/System.Diagnostics.Process.Start.aspx refers to the page providing information on the Start method.

Using monad's Extended Type System (ETS) features and the way MSDN orgranizes the information I can achieve what  I want.  The get-member cmdlet outputs an object of Type System.Management.Automation.Commands.MemberDefinition. I will extend this type by adding a ScriptProperty called HelpLink via types.mshxml.  The following is the xml snippet that I add to my types.mshxml. The ScriptBlock basically constructs a url string based on the type name and name of the member being accessed. You will have to restart msh to get the changes in.

<Type>
<Name>System.Management.Automation.Commands.MemberDefinition</Name>
<Members>
<ScriptProperty>
<Name>HelpLink</Name>
<GetScriptBlock> "https://msdn2.microsoft.com/library/" + $this.typename +"." +$this.name+".aspx"</GetScriptBlock>
</ScriptProperty>
</Members>
</Type>

 This is what the get-member output looks like before adding the extension.

MSH> $a = ps msh

MSH > $a | get-member -membertype method -name Start | format-list

TypeName : System.Diagnostics.Process
Name : Start
MemberType : Method
Definition : System.Boolean Start()

This is what the get-member output looks like after the extension.

MSH C:\> $a | get-member -membertype method -name Start | format-list

HelpLink : https://msdn2.microsoft.com/library/System.Diagnostics.Process.Start.aspx
TypeName : System.Diagnostics.Process
Name : Start
MemberType : Method
Definition : System.Boolean Start()

I can now navigate to the exact help link directly from monad whenever needed :-). This seems to work ok for types in the base class library, but will not work for COM objects or the adapted objects or any custom types you might have.

-Abhishek Agrawal

Comments

  • Anonymous
    December 30, 2005
    I have thought creating a similar function which will retrieve MSDN2 link(but not through modifying command member definition). But will MSDN2 always have the same naming scheme later on? That was what I have been afraid of... but not that it matters much :)
  • Anonymous
    December 30, 2005
    You could also register a ScriptMethod MSDN in a TYPES.MSHXML file to show the documentation in a viewer:

    <Type>
    <Name>System.Object</Name>
    <Members>
    <ScriptMethod>
    <Name>MSDN</Name>
    <Script>
    if ($global:MSDNViewer -eq $null)
    { $global:MSDNViewer = new-object -ComObject InternetExplorer.Application
    }
    $global:MSDNViewer.Navigate2("http://msdn2.microsoft.com/library/" + $this.GetType().FullName + ".ASPX")
    $global:MSDNViewer.Visible = $TRUE
    </Script>
    </ScriptMethod>
    </Members>
    </Type>


    Then you could do something like:
    [Appdomain]::CurrentDomain.MSDN()

    Jeffrey P. Snover [MSFT]
  • Anonymous
    December 30, 2005
    Now if only MSDN would provide a way for vendors to register base URLs for strong-named assemblies, this could be extended to non-MS types...
  • Anonymous
    December 31, 2005
    > Now if only MSDN would provide a way for vendors to register base
    > URLs for strong-named assemblies, this could be extended to
    > non-MS types

    Right. In lieu of that happening, the scriptMethod could do a one time load of some metadata which mapped REGEXs against the full typename to URL-maker strings (think: $URLMAKER -f $this.GetType().FullName ) where $URLMAKER for MSDN would be:
    "http://msdn2.microsoft.com/library/{0}.ASPX"

    Jeffrey P. Snover [MSFT]
  • Anonymous
    December 31, 2005
    Yup.. and if there were some standard web service contract for retrieving the information, we wouldn't need to launch in a browser -- we could merely format the information as appropriate to the display.