Note
Access to this page requires authorization. You can try signing in or changing directories.
Access to this page requires authorization. You can try changing directories.
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.