<?xml version="1.0" encoding="UTF-8" ?>
<?xml-stylesheet type="text/xsl" href="http://davesexton.com/blog/utility/FeedStylesheets/rss.xsl" media="screen"?><rss version="2.0" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:slash="http://purl.org/rss/1.0/modules/slash/" xmlns:wfw="http://wellformedweb.org/CommentAPI/"><channel><title>Dave Sexton's Blog</title><link>http://davesexton.com/blog/blogs/default.aspx</link><description>on software development using C# and the Microsoft .NET Framework</description><dc:language>en-US</dc:language><generator>CommunityServer 2.1 SP2 (Build: 61129.2)</generator><item><title>Code Contracts for Visual Studio Pro</title><link>http://davesexton.com/blog/blogs/blog/archive/2012/01/12/code-contracts-for-visual-studio-pro.aspx</link><pubDate>Thu, 12 Jan 2012 05:19:27 GMT</pubDate><guid isPermaLink="false">5b5c6d2b-d071-4bf8-ac28-4f9cd768b39b:599</guid><dc:creator>Dave Sexton</dc:creator><slash:comments>0</slash:comments><description>&lt;p&gt;If you decided long ago that you weren’t going to bother trying Code Contracts because you didn’t have Visual Studio Premium edition or higher and thus couldn’t take advantage of static checking, then your wait is finally over.&lt;/p&gt;  &lt;p&gt;Code Contracts 1.4.41228.0 was recently released, along with some great news: The Code Contracts static checker is now available for all editions of Visual Studio (excluding &lt;em&gt;Express&lt;/em&gt;).&lt;/p&gt;  &lt;p&gt;On a sad note, it seems as though &lt;a href="http://social.msdn.microsoft.com/Forums/en-US/codecontracts/thread/8e525066-c0d8-4dd3-a7b8-f9ffdc81a51c" target="_blank"&gt;Code Contracts will remain in DevLabs&lt;/a&gt; through the next Visual Studio cycle.&lt;/p&gt;  &lt;p&gt;But to end on a brighter note, apparently the team is still trying to make it an official product.&lt;/p&gt;  &lt;p&gt;From the forum announcements section: &lt;/p&gt;  &lt;blockquote&gt;   &lt;p&gt;&lt;em&gt;We are trying to make the case for Code Contracts to be included in Visual Studio as an official product. Please send us your feedback as soon as possible, especially if you have any details about how exactly it has helped your development process.&lt;/em&gt;&lt;/p&gt; &lt;/blockquote&gt;  &lt;p&gt;So start using it and send them all of your success stories!&lt;/p&gt;  &lt;p&gt;Here are some links to get you started: &lt;/p&gt; &lt;strong&gt;Editor Extensions (Optional)&lt;/strong&gt;  &lt;br /&gt;&lt;a title="http://visualstudiogallery.msdn.microsoft.com/85f0aa38-a8a8-4811-8b86-e7f0b8d8c71b/" href="http://visualstudiogallery.msdn.microsoft.com/85f0aa38-a8a8-4811-8b86-e7f0b8d8c71b/"&gt;http://visualstudiogallery.msdn.microsoft.com/85f0aa38-a8a8-4811-8b86-e7f0b8d8c71b/&lt;/a&gt;  &lt;p&gt;&lt;strong&gt;Portal&lt;/strong&gt;    &lt;br /&gt;&lt;a title="http://msdn.microsoft.com/en-us/devlabs/dd491992.aspx" href="http://msdn.microsoft.com/en-us/devlabs/dd491992.aspx"&gt;http://msdn.microsoft.com/en-us/devlabs/dd491992.aspx&lt;/a&gt;&lt;/p&gt;  &lt;p&gt;&lt;strong&gt;Research Site&lt;/strong&gt;    &lt;br /&gt;&lt;a title="http://research.microsoft.com/en-us/projects/contracts/" href="http://research.microsoft.com/en-us/projects/contracts/"&gt;http://research.microsoft.com/en-us/projects/contracts/&lt;/a&gt;&lt;/p&gt;  &lt;p&gt;&lt;strong&gt;Release Notes&lt;/strong&gt;    &lt;br /&gt;&lt;a title="http://research.microsoft.com/en-us/projects/contracts/releasenotes.aspx" href="http://research.microsoft.com/en-us/projects/contracts/releasenotes.aspx"&gt;http://research.microsoft.com/en-us/projects/contracts/releasenotes.aspx&lt;/a&gt;&lt;/p&gt;  &lt;p&gt;&lt;strong&gt;Forum&lt;/strong&gt;    &lt;br /&gt;&lt;a title="http://social.msdn.microsoft.com/Forums/en-US/codecontracts/threads" href="http://social.msdn.microsoft.com/Forums/en-US/codecontracts/threads"&gt;http://social.msdn.microsoft.com/Forums/en-US/codecontracts/threads&lt;/a&gt;&lt;/p&gt;&lt;img src="http://davesexton.com/blog/aggbug.aspx?PostID=599" width="1" height="1"&gt;</description><category domain="http://davesexton.com/blog/blogs/blog/archive/tags/Code+Contracts/default.aspx">Code Contracts</category></item><item><title>Resources for Learning Rx</title><link>http://davesexton.com/blog/blogs/blog/archive/2011/11/12/resources-for-learning-rx.aspx</link><pubDate>Sat, 12 Nov 2011 18:51:00 GMT</pubDate><guid isPermaLink="false">5b5c6d2b-d071-4bf8-ac28-4f9cd768b39b:594</guid><dc:creator>Dave Sexton</dc:creator><slash:comments>0</slash:comments><description>&lt;p&gt;Start by bookmarking the Rx hub on MSDN:&lt;br&gt;&amp;nbsp; &lt;br&gt;&lt;a href="http://msdn.microsoft.com/en-us/data/gg577609"&gt;http://msdn.microsoft.com/en-us/data/gg577609&lt;/a&gt;&lt;/p&gt;  &lt;p&gt;Especially the beginners guide and the .NET Resources and Community pages, which together provide several links to official videos, blog posts and articles, all of which are worth reviewing.    &lt;br&gt;&amp;nbsp; &lt;br&gt;&lt;a href="http://msdn.microsoft.com/en-us/data/gg577611"&gt;http://msdn.microsoft.com/en-us/data/gg577611&lt;/a&gt;     &lt;br&gt;&lt;a href="http://msdn.microsoft.com/en-us/data/gg577612"&gt;http://msdn.microsoft.com/en-us/data/gg577612&lt;/a&gt;&lt;/p&gt;  &lt;p&gt;Next, bookmark the Rx forum.&amp;nbsp; This is the official place to search for answers and to ask new questions:&lt;/p&gt;  &lt;p&gt;&lt;strong&gt;Rx Forum&lt;/strong&gt;     &lt;br&gt;&lt;a title="http://social.msdn.microsoft.com/Forums/en-US/rx/threads" href="http://social.msdn.microsoft.com/Forums/en-US/rx/threads"&gt;http://social.msdn.microsoft.com/Forums/en-US/rx/threads&lt;/a&gt;&lt;/p&gt;  &lt;p&gt;Depending upon your current level of knowledge with Rx, you may want to continue by going through the official hands-on labs.&amp;nbsp; They are a bit out-dated although differences between the labs and the latest Rx class library should be minimal.&amp;nbsp; When you do come across differences, a quick search on the Rx forum will show you what changes need to be made.&lt;/p&gt;  &lt;p&gt;&lt;strong&gt;Hands-On Labs&lt;/strong&gt;     &lt;br&gt;&lt;a href="http://go.microsoft.com/fwlink/?LinkId=208528"&gt;http://go.microsoft.com/fwlink/?LinkId=208528&lt;/a&gt;     &lt;br&gt;&amp;nbsp; &lt;br&gt;For further reading, I recommend starting off with the official conceptual documentation:     &lt;br&gt;&amp;nbsp; &lt;br&gt;&lt;a href="http://msdn.microsoft.com/en-us/library/hh242985(v=VS.103).aspx"&gt;http://msdn.microsoft.com/en-us/library/hh242985(v=VS.103).aspx&lt;/a&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;br&gt;&amp;nbsp; &lt;br&gt;followed by the recommended design guidelines.&amp;nbsp; This document is a bit outdated, although where there may be differences between the examples and the latest Rx class library, the purpose and reasons for the guidelines still apply.&lt;/p&gt;  &lt;p&gt;&lt;strong&gt;Recommended Design Guidelines&lt;/strong&gt;     &lt;br&gt;&lt;a href="http://go.microsoft.com/fwlink/?LinkID=205219"&gt;http://go.microsoft.com/fwlink/?LinkID=205219&lt;/a&gt;     &lt;br&gt;    &lt;br&gt;After that there's plenty of community resources to choose from.&amp;nbsp; A new book has been written about Rx recently:     &lt;br&gt;&amp;nbsp; &lt;br&gt;&lt;a href="http://social.msdn.microsoft.com/Forums/en-US/rx/thread/813e56db-e410-4f35-8f72-1be34b08ce8a"&gt;http://social.msdn.microsoft.com/Forums/en-US/rx/thread/813e56db-e410-4f35-8f72-1be34b08ce8a&lt;/a&gt;     &lt;br&gt;&amp;nbsp; &lt;br&gt;And here's a list of blogs and open source projects that may interest you:     &lt;br&gt;&amp;nbsp; &lt;br&gt;&lt;a href="http://social.msdn.microsoft.com/Forums/en-US/rx/thread/2cbd3b1c-d535-46ba-a9cf-3cd576a8e7c2"&gt;http://social.msdn.microsoft.com/Forums/en-US/rx/thread/2cbd3b1c-d535-46ba-a9cf-3cd576a8e7c2&lt;/a&gt; &lt;/p&gt;  &lt;p&gt;As for open source projects, I’m particularly fond of &lt;a title="Extensions for Reactive Extensions (Rxx)" href="http://rxx.codeplex.com" target="_blank"&gt;Rxx&lt;/a&gt;, and not just because I’m the co-founder and author along with &lt;a title="James Mile's Blog" href="http://enumeratethis.com" target="_blank"&gt;James Miles&lt;/a&gt;.&amp;nbsp; ;)&lt;/p&gt;&lt;img src="http://davesexton.com/blog/aggbug.aspx?PostID=594" width="1" height="1"&gt;</description><category domain="http://davesexton.com/blog/blogs/blog/archive/tags/.NET/default.aspx">.NET</category><category domain="http://davesexton.com/blog/blogs/blog/archive/tags/Rxx/default.aspx">Rxx</category><category domain="http://davesexton.com/blog/blogs/blog/archive/tags/Rx/default.aspx">Rx</category></item><item><title>Rxx 1.2 Released</title><link>http://davesexton.com/blog/blogs/blog/archive/2011/11/09/rxx-1-2-released.aspx</link><pubDate>Wed, 09 Nov 2011 15:01:00 GMT</pubDate><guid isPermaLink="false">5b5c6d2b-d071-4bf8-ac28-4f9cd768b39b:593</guid><dc:creator>Dave Sexton</dc:creator><slash:comments>0</slash:comments><description>&lt;p&gt;If you’re not familiar with the Rxx project yet, it's something I’ve been working on for several months now along with &lt;a title="James Miles's Blog" href="http://enumeratethis.com/" target="_blank"&gt;James Miles&lt;/a&gt;.&lt;/p&gt;  &lt;p&gt;Rxx is a library of unofficial reactive LINQ extensions supplementary to Microsoft's &lt;a title="Reactive Extensions for .NET (Rx)" href="http://msdn.microsoft.com/en-us/data/gg577609" target="_blank"&gt;Reactive Extensions for .NET&lt;/a&gt; (Rx).&amp;nbsp; Rxx is developed entirely in C# and targets the .NET Framework 4.0, Silverlight 4.0 and Windows Phone 7 (WP7).&lt;/p&gt;  &lt;p&gt;&lt;em&gt;Why should you use Rx and Rxx?&lt;/em&gt;&lt;/p&gt;  &lt;p&gt;Well, if you’re doing any kind of programming that involves asynchrony or concurrency, such as what is commonly found in UI layers, business layers, data access layers, middle tier services – basically everywhere, then you’ll definitely find Rx to be very useful.&amp;nbsp; Rxx adds a whole bunch of useful features on top of Rx and the .NET Framework Class Library (FCL), making it quite easy to introduce common patterns of asynchrony into any .NET program through the use of &lt;a title="IObservable of T interface" href="http://msdn.microsoft.com/en-us/library/dd990377.aspx" target="_blank"&gt;IObservable&amp;lt;T&amp;gt;&lt;/a&gt; and LINQ.&lt;/p&gt;  &lt;p&gt;Rxx provides the following features.&amp;nbsp; See the &lt;a title="Rxx Documentation" href="http://rxx.codeplex.com/documentation"&gt;Documentation&lt;/a&gt; for details.&lt;/p&gt;  &lt;ol&gt;   &lt;li&gt;Many &lt;font face="Courier New"&gt;IObservable&amp;lt;T&amp;gt;&lt;/font&gt; extension methods and &lt;font face="Courier New"&gt;IEnumerable&amp;lt;T&amp;gt;&lt;/font&gt; extension methods. &lt;/li&gt;    &lt;li&gt;Many useful types such as &lt;font face="Courier New"&gt;CommandSubject&lt;/font&gt;, &lt;font face="Courier New"&gt;ListSubject&lt;/font&gt;, &lt;font face="Courier New"&gt;DictionarySubject&lt;/font&gt;, &lt;font face="Courier New"&gt;ViewModel&lt;/font&gt;, &lt;font face="Courier New"&gt;ObservableDynamicObject&lt;/font&gt;, &lt;font face="Courier New"&gt;Either&amp;lt;TLeft, TRight&amp;gt;&lt;/font&gt;, &lt;font face="Courier New"&gt;Maybe&amp;lt;T&amp;gt;&lt;/font&gt; and others. &lt;/li&gt;    &lt;li&gt;Various interactive labs that illustrate the runtime behavior of the extensions in Rxx.&amp;nbsp; Individual labs' source code included. &lt;/li&gt; &lt;/ol&gt;  &lt;p&gt;The latest release of Rxx is now available:&lt;/p&gt;  &lt;ul&gt;   &lt;li&gt;CodePlex      &lt;br&gt;&lt;a href="http://rxx.codeplex.com/releases/view/69545"&gt;http://rxx.codeplex.com/releases/view/69545&lt;/a&gt; &lt;/li&gt;    &lt;li&gt;NuGet      &lt;br&gt;&lt;a href="http://nuget.org/List/Packages/Rxx"&gt;http://nuget.org/List/Packages/Rxx&lt;/a&gt;       &lt;br&gt;&lt;a href="http://nuget.org/List/Packages/Rxx_Experimental"&gt;http://nuget.org/List/Packages/Rxx_Experimental&lt;/a&gt; &lt;/li&gt; &lt;/ul&gt;  &lt;p&gt;New features for Rxx 1.2 include:&lt;/p&gt;  &lt;ol&gt;   &lt;li&gt;Compatible with Microsoft's Ix Experimental library. &lt;/li&gt;    &lt;li&gt;UI extensions for WPF and Silverlight, including &lt;font face="Courier New"&gt;AnonymousCommand&lt;/font&gt;, &lt;font face="Courier New"&gt;CommandSubject&lt;/font&gt;, a &lt;font face="Courier New"&gt;Subscription&lt;/font&gt; XAML markup extension for binding UI elements to observables, &lt;font face="Courier New"&gt;EventSubscription&lt;/font&gt; trigger and a reactive view model infrastructure.&amp;nbsp; (Download the labs application for examples.) &lt;/li&gt;    &lt;li&gt;N-ary &lt;font face="Courier New"&gt;Zip&lt;/font&gt; and &lt;font face="Courier New"&gt;CombineLatest&lt;/font&gt; combinators. &lt;/li&gt;    &lt;li&gt;Several parser updates, including new operators, non-greedy (lazy) quantifiers and major performance and memory improvements, such as avoiding stack overflows due to recursion in quantifiers. &lt;/li&gt;    &lt;li&gt;Cursor types and extensions (Rx and Ix). &lt;/li&gt;    &lt;li&gt;&lt;font face="Courier New"&gt;ListSubject&lt;/font&gt; and &lt;font face="Courier New"&gt;DictionarySubject&lt;/font&gt;. &lt;/li&gt;    &lt;li&gt;&lt;font face="Courier New"&gt;Consume&lt;/font&gt; extensions that generalize the producer/consumer pattern over observables. &lt;/li&gt;    &lt;li&gt;&lt;font face="Courier New"&gt;ApplicationSettingsBase&lt;/font&gt; extensions. &lt;/li&gt;    &lt;li&gt;&lt;font face="Courier New"&gt;ObservableSyndication&lt;/font&gt; for RSS 2.0 and Atom 1.0. &lt;/li&gt;    &lt;li&gt;&lt;font face="Courier New"&gt;ObservableFile&lt;/font&gt; and additional &lt;font face="Courier New"&gt;ObservableDirectory&lt;/font&gt; extensions. &lt;/li&gt;    &lt;li&gt;&lt;font face="Courier New"&gt;Stream&lt;/font&gt;, &lt;font face="Courier New"&gt;FileStream&lt;/font&gt; and &lt;font face="Courier New"&gt;TextReader&lt;/font&gt; extensions. &lt;/li&gt; &lt;/ol&gt;  &lt;p&gt;More details can be found in the latest release notes: &lt;a href="http://rxx.codeplex.com/wikipage?title=Release%20Notes"&gt;http://rxx.codeplex.com/wikipage?title=Release%20Notes&lt;/a&gt; &lt;/p&gt;  &lt;p&gt;We’d really appreciate your feedback.&amp;nbsp; Please let us know about your experiences with Rxx by &lt;a href="http://rxx.codeplex.com/discussions" target="_blank"&gt;starting a new discussion&lt;/a&gt; or &lt;a href="http://rxx.codeplex.com/workitem/list/advanced" target="_blank"&gt;submitting an issue&lt;/a&gt;.&amp;nbsp; Thanks!&lt;/p&gt;&lt;img src="http://davesexton.com/blog/aggbug.aspx?PostID=593" width="1" height="1"&gt;</description><category domain="http://davesexton.com/blog/blogs/blog/archive/tags/.NET/default.aspx">.NET</category><category domain="http://davesexton.com/blog/blogs/blog/archive/tags/CodePlex/default.aspx">CodePlex</category><category domain="http://davesexton.com/blog/blogs/blog/archive/tags/Open+Source/default.aspx">Open Source</category><category domain="http://davesexton.com/blog/blogs/blog/archive/tags/Rxx/default.aspx">Rxx</category><category domain="http://davesexton.com/blog/blogs/blog/archive/tags/Rx/default.aspx">Rx</category></item><item><title>Sandcastle with Code Contracts</title><link>http://davesexton.com/blog/blogs/blog/archive/2009/09/13/sandcastle-with-code-contracts.aspx</link><pubDate>Sun, 13 Sep 2009 19:19:39 GMT</pubDate><guid isPermaLink="false">5b5c6d2b-d071-4bf8-ac28-4f9cd768b39b:534</guid><dc:creator>Dave Sexton</dc:creator><slash:comments>1</slash:comments><description>&lt;p&gt;Microsoft Dev Labs has released a new version of &lt;a title="Microsoft DevLab - Code Contracts" href="http://msdn.microsoft.com/en-us/devlabs/dd491992.aspx" target="_blank"&gt;Code Contracts&lt;/a&gt;.&amp;nbsp; (For more information about Code Contracts in the .NET Framework 4.0, see &lt;a title=".NET Framework 4.0 - Code Contracts" href="http://msdn.microsoft.com/en-us/library/system.diagnostics.contracts(VS.100).aspx" target="_blank"&gt;System.Diagnostics.Contracts&lt;/a&gt; and &lt;a title="CLR Inside Out - Code Contracts" href="http://msdn.microsoft.com/en-us/magazine/ee236408.aspx" target="_blank"&gt;this article&lt;/a&gt;).&amp;nbsp; If you haven't yet, I highly recommend installing the latest Code Contracts release.&amp;nbsp; If you're using Visual Studio 2008 then you'll also get a shiny new tab in your project's &lt;strong&gt;Properties&lt;/strong&gt; window.&lt;/p&gt; &lt;p&gt;&lt;img style="margin:0px;" border="0" alt="Shiny New Properties Tab" src="http://davesexton.com/Images/Blog/Sandcastle_B76F/image.png" width="131" height="148"&gt; &lt;/p&gt; &lt;p&gt;&lt;strong&gt;Figure 1: &lt;/strong&gt;Code Contracts tab in Visual Studio 2008 project Properties window&lt;/p&gt; &lt;p&gt;Along with the latest features is a new tool that adds documentation for Code Contracts to an assembly's XML documentation file.&amp;nbsp; The latest release also includes a &lt;a title="Sandcastle on CodePlex" href="http://sandcastle.codeplex.com" target="_blank"&gt;Sandcastle&lt;/a&gt; patch that allows the &lt;strong&gt;vs2005&lt;/strong&gt; style to include the code contract documentation within an expandable &lt;strong&gt;Contracts&lt;/strong&gt; section, as shown in the following screenshot.&lt;/p&gt; &lt;p&gt;&lt;img style="margin:0px;" border="0" alt="image" src="http://davesexton.com/Images/Blog/Sandcastle_B76F/image_3.png" width="371" height="544"&gt;   &lt;/p&gt; &lt;p&gt;&lt;strong&gt;Figure 2: &lt;/strong&gt;Example Sandcastle output with Contracts section&lt;/p&gt; &lt;p&gt;The following blog post describes how you can patch Sandcastle so that it uses Code Contracts in XML documentation files.&amp;nbsp; The author chose to use &lt;a title="DocProject on CodePlex" href="http://docproject.codeplex.com" target="_blank"&gt;DocProject&lt;/a&gt; to automate the build process, but I suspect that it will work with or without any automation tools for Sandcastle.&lt;/p&gt; &lt;p&gt;&lt;a title="http://www.leading-edge-dev.de/?p=447" href="http://www.leading-edge-dev.de/?p=447"&gt;http://www.leading-edge-dev.de/?p=447&lt;/a&gt;&amp;nbsp;&lt;/p&gt; &lt;p&gt;Note that I've tested this procedure with success in Visual Studio 2008 standard edition.&lt;/p&gt; &lt;p&gt;Just don't forget to create a new &lt;em&gt;DocProject&lt;/em&gt; or &lt;em&gt;DocSite &lt;/em&gt;project after applying the Sandcastle patch.&amp;nbsp; You can use the &lt;strong&gt;Import Topics and Settings&lt;/strong&gt; step in the &lt;a title="Configuring Projects with the New Project Wizard" href="http://docproject.codeplex.com/Wiki/View.aspx?title=Configuring%20Projects%20with%20the%20New%20Project%20Wizard" target="_blank"&gt;New Project Wizard&lt;/a&gt; to copy over the important stuff from an existing project if you'd like.&lt;/p&gt; &lt;p&gt;-- &lt;/p&gt; &lt;p&gt;On a side note, I think this also about ruins my &lt;a title="ContractN on CodePlex" href="http://davesexton.com/blog/blogs/blog/archive/2008/03/10/contractn-on-codeplex.aspx" target="_blank"&gt;ContractN&lt;/a&gt; project ;).&amp;nbsp; I've abandoned it anyway, so I'll be doing the honorable thing and will close down &lt;a href="http://contractn.codeplex.com" target="_blank"&gt;the ContractN project on CodePlex&lt;/a&gt; at some point (to help keep CodePlex clean - just doin' my part).&amp;nbsp; I'll continue to host the code on my blog in case anybody's interested in learning how to use &lt;a title="System.ContextBoundObject - .NET Framework BCL" href="http://msdn.microsoft.com/en-us/library/system.contextboundobject.aspx" target="_blank"&gt;Context-Bound Objects&lt;/a&gt;, in some form or another.&lt;/p&gt;&lt;img src="http://davesexton.com/blog/aggbug.aspx?PostID=534" width="1" height="1"&gt;</description><category domain="http://davesexton.com/blog/blogs/blog/archive/tags/.NET/default.aspx">.NET</category><category domain="http://davesexton.com/blog/blogs/blog/archive/tags/Sandcastle/default.aspx">Sandcastle</category><category domain="http://davesexton.com/blog/blogs/blog/archive/tags/DocProject/default.aspx">DocProject</category><category domain="http://davesexton.com/blog/blogs/blog/archive/tags/documentation/default.aspx">documentation</category><category domain="http://davesexton.com/blog/blogs/blog/archive/tags/Visual+Studio+2008/default.aspx">Visual Studio 2008</category><category domain="http://davesexton.com/blog/blogs/blog/archive/tags/ContractN/default.aspx">ContractN</category></item><item><title>MAML Editor: Progress II</title><link>http://davesexton.com/blog/blogs/blog/archive/2008/07/08/maml-editor-progress-ii.aspx</link><pubDate>Tue, 08 Jul 2008 13:52:02 GMT</pubDate><guid isPermaLink="false">5b5c6d2b-d071-4bf8-ac28-4f9cd768b39b:502</guid><dc:creator>Dave Sexton</dc:creator><slash:comments>11</slash:comments><description>&lt;p&gt;In a &lt;a href="http://davesexton.com/blog/blogs/blog/archive/2008/06/03/maml-editor.aspx"&gt;previous blog post&lt;/a&gt; I discussed my work on a WYSIWYG editor for authoring MAML topics, either inside or outside of &lt;a title="DocProject on CodePlex" href="http://www.codeplex.com/DocProject"&gt;DocProject&lt;/a&gt;.&amp;nbsp; This post is simply another quick update on my progress.&lt;/p&gt; &lt;h4&gt;Preview Release Timeline&lt;/h4&gt; &lt;p&gt;A few weeks ago I started a new job and they put me on a project with a tight deadline so I haven't had much time to do anything else.&amp;nbsp; Last weekend I was still too busy to do much with the editor (even on July 4th) so I missed my most recent target date: yesterday.&lt;/p&gt; &lt;p&gt;I'll probably have time to work on the editor each night this week though so I should be able to put a working preview out there soon.&amp;nbsp; Last night I was able to almost complete key input behavior processing, which I had actually planned to work on after the preview.&amp;nbsp; I was also able to complete a few controls; e.g., the alert control now has a drop down list in the header with icon-text pairs as list items (shown in the screenshot below).&amp;nbsp; It was so easy to implement too compared to having to owner draw items in WinForms apps - WPF is really cool.&amp;nbsp; The next control I'm going to write is for MAML linking, which should be fun :)&lt;/p&gt; &lt;h4&gt;Progress&lt;/h4&gt; &lt;p&gt;I still have to add the command buttons but I've been deferring that because it should be pretty easy to do with limited functionality for the initial release (e.g., the editor's not schema based yet so all buttons will always be enabled.)&amp;nbsp; Although, I'll probably only add a small subset of commands initially, which will save time. &lt;p&gt;One thing that I may do for the preview though is to add the ability to insert custom command buttons through a dialog and have them associated with custom MAML markup. Once the markup is inserted, it can be parsed as if it was being loaded from a MAML file using the existing factory/parser infrastructure - that should fill in the gap nicely for MAML elements that I won't be providing support for in the initial release.&amp;nbsp; (Note that this is entirely conceptual - I don't know if it'll actually be worth the effort for the preview release.) &lt;p&gt;The other major feature that the editor is currently lacking is the ability to parse the physical flow back into MAML for save operations (it currently saves as XAML, for testing purposes).&amp;nbsp; I don't see this being a difficult process though since every element in the document is currently tagged with a parser context object, which provides direct access to the particular parser that can transform the element into MAML, in much the same way that it parses MAML into elements when a topic is loaded.&amp;nbsp; (Load functionality works fine :) &lt;p&gt;Originally I was hoping to avoid having to parse the physical flow by simply saving the in-memory LINQ to XML document (this was working for a short while during development), however I discovered later that the only change event that gets raised is the FlowDocument's &lt;strong&gt;TextChanged&lt;/strong&gt; event (IIRC), making it difficult to track the relationship between changes in the flow and the underlying &lt;strong&gt;XDocument &lt;/strong&gt;structure.&amp;nbsp; Although, I do see an opportunity to implement change tracking like this in the future due to my &lt;em&gt;parser context &lt;/em&gt;and &lt;em&gt;parser input behavior &lt;/em&gt;designs, but for the sake of time I'll probably defer it until a subsequent beta release. &lt;h4&gt;Screen Capture&lt;/h4&gt; &lt;p&gt;The following is an updated image of the same MAML topic being edited as in my last post.&amp;nbsp; It might not look like much has changed, but functionally speaking, it's now actually becoming a useful app (barring the missing save functionality :). &lt;p&gt;This time all of the styles that you see are loaded dynamically from XAML style sheets (currently embedded resources, but eventually loose XAML as well) and, although it's not obvious from the image, the editor actually behaves much more like you'd expect from a schema-based editor.&amp;nbsp; For example, pressing the &lt;strong&gt;Delete &lt;/strong&gt;key at the end of the MAML &lt;strong&gt;Introduction &lt;/strong&gt;will no longer cause the first &lt;strong&gt;section&lt;/strong&gt;'s header to move up into the introduction's paragraph.&amp;nbsp; This behavior is controlled by each individual MAML element - they define their own key press behavior using a custom preview &amp;amp; bubble approach, just like real WPF controls, but they also inherit some default behavior that restricts the flow a bit. &lt;p&gt;I've also started using WPF annotations for debugging (not visible in the image below) and I also plan to use them to display a delete button near the currently selected block element.&amp;nbsp; So to delete an entire section from the editor you would click anywhere inside the section and the delete button will appear, perhaps floating at the top-right corner of the element.&amp;nbsp; That's the way I think it should work for all block elements, such as the MAML introduction, section, procedure, alert table and code block shown in the image below. &lt;p&gt;(&lt;strong&gt;Note: &lt;/strong&gt;The document shown below was actually loaded from a real MAML topic file.&amp;nbsp; The red squiggles are real-time spell checking errors provided by WPF and each element's styles were applied dynamically using XAML style sheets.) &lt;p&gt;&lt;img style="margin:0px;" height="612" alt="image" src="http://davesexton.com/Images/Blog/MAMLEditorProgressII_7EE1/image.png" width="700" border="0"&gt;&lt;/p&gt;&lt;img src="http://davesexton.com/blog/aggbug.aspx?PostID=502" width="1" height="1"&gt;</description><category domain="http://davesexton.com/blog/blogs/blog/archive/tags/Sandcastle/default.aspx">Sandcastle</category><category domain="http://davesexton.com/blog/blogs/blog/archive/tags/DocProject/default.aspx">DocProject</category><category domain="http://davesexton.com/blog/blogs/blog/archive/tags/Betas/default.aspx">Betas</category><category domain="http://davesexton.com/blog/blogs/blog/archive/tags/MAML/default.aspx">MAML</category></item><item><title>DocProject 2008: Custom Visual Studio Project System</title><link>http://davesexton.com/blog/blogs/blog/archive/2008/06/19/docproject-2008-custom-visual-studio-project-system.aspx</link><pubDate>Thu, 19 Jun 2008 09:11:13 GMT</pubDate><guid isPermaLink="false">5b5c6d2b-d071-4bf8-ac28-4f9cd768b39b:489</guid><dc:creator>Dave Sexton</dc:creator><slash:comments>1</slash:comments><description>&lt;p&gt;For the last couple of weeks I've been testing a new VS package for &lt;a title="DocProject on CodePlex" href="http://www.codeplex.com/DocProject"&gt;DocProject&lt;/a&gt; 2008.&amp;nbsp; You can read more about my plans &lt;a href="http://davesexton.com/blog/blogs/blog/archive/2008/05/03/docproject-roadmap-part-ii.aspx"&gt;here&lt;/a&gt;.&lt;/p&gt; &lt;p&gt;More recently I've been working on a new project system that integrates into Visual Studio 2008 but the current implementation only provides a single template, &lt;strong&gt;.docproj&lt;/strong&gt;, which has very limited functionality at the moment.&amp;nbsp; I'm considering whether I shouldn't bother creating a custom project system if I can't do what I want since the current implementation (zipped templates copied to a folder during installation) provides seamless integration into VS already and won't require me to invest any more development time in this area.&lt;/p&gt; &lt;p&gt;However, I'd really like to have a custom project system that &lt;em&gt;inherits&lt;/em&gt; from the project system that VS provides for the C# and VB.NET class library/web application templates since it will provide the following advantages to DocProject: &lt;/p&gt; &lt;ol&gt; &lt;li&gt;Inherit all of the functionality provided by &lt;strong&gt;.csproj&lt;/strong&gt; and &lt;strong&gt;.vbproj&lt;/strong&gt;, including full support for the class library and web application project sub types.&amp;nbsp; (I'm considering using &lt;strong&gt;.csdoc&lt;/strong&gt; and &lt;strong&gt;.vbdoc&lt;/strong&gt; as the new file extensions.)&lt;/li&gt; &lt;li&gt;I have lots of tested automation code that works against the &lt;strong&gt;VSProject&lt;/strong&gt; system already (provided by &lt;strong&gt;EnvDTE&lt;/strong&gt;).&amp;nbsp; It could be reused with only minimal changes, if any at all.&amp;nbsp; This will mean that I'll be able to deploy the next release much sooner and with minimal impact to DocProject's existing codebase.&lt;/li&gt; &lt;li&gt;I could get rid of the &lt;strong&gt;DocProject Properties &lt;/strong&gt;command and tool window and instead integrate the property grid into the typical &lt;strong&gt;Properties &lt;/strong&gt;window by adding a new tab named, &lt;strong&gt;DocProject&lt;/strong&gt;.&lt;/li&gt; &lt;li&gt;Use custom &lt;strong&gt;MSBuild&lt;/strong&gt; properties to store project options instead of using the automation &lt;strong&gt;Globals&lt;/strong&gt; collection, which stores all custom data as attributes on a &lt;strong&gt;UserProperties&lt;/strong&gt; element.&amp;nbsp; Using actual &lt;strong&gt;MSBuild&lt;/strong&gt; properties provides the obvious advantage of being able to easily set project settings for command-line builds and also has the advantage of being able to make certain properties dependent on the active solution configuration.&amp;nbsp; (The latter point has been a feature that I've been considering for a while but I've felt that it's not worth the effort to implement if I have to roll my own solution via automation code, so it's been deferred until DocProject 2008.)&lt;/li&gt; &lt;li&gt;Create special project folders that have a different appearance and provide custom behavior when double-clicked; like the &lt;strong&gt;Properties&lt;/strong&gt; folder for example.&amp;nbsp; In &lt;em&gt;DocProjects &lt;/em&gt;and &lt;em&gt;DocSites&lt;/em&gt;, the &lt;strong&gt;Help &lt;/strong&gt;folder would probably be a good candidate for a different appearance.&amp;nbsp; The &lt;strong&gt;Comments&lt;/strong&gt;, &lt;strong&gt;Settings &lt;/strong&gt;and &lt;strong&gt;Topics &lt;/strong&gt;folders could probably have a different appearance and behavior.&lt;/li&gt;&lt;/ol&gt; &lt;p&gt;I've posted &lt;a href="http://forums.msdn.microsoft.com/en-US/vsx/thread/f363c682-4792-4af7-b7ed-cc5e628214c2/"&gt;a few questions&lt;/a&gt; to the VSX forum in the hopes that someone could give me some pointers as to how I can accomplish my goal of implementing a &lt;strong&gt;partially &lt;/strong&gt;custom project system in Visual Studio 2008; i.e., a system that inherits from the &lt;strong&gt;VSProject &lt;/strong&gt;system that can be automated through the &lt;strong&gt;EnvDTE &lt;/strong&gt;library.&amp;nbsp; If anyone can answer my questions I'd really appreciate it so that I can make a decision about whether a custom project system is worth the effort for the next Beta release.&amp;nbsp; Thanks :)&lt;/p&gt;&lt;img src="http://davesexton.com/blog/aggbug.aspx?PostID=489" width="1" height="1"&gt;</description><category domain="http://davesexton.com/blog/blogs/blog/archive/tags/DocProject/default.aspx">DocProject</category></item><item><title>DocProject 1.11.0 RC - Second Update</title><link>http://davesexton.com/blog/blogs/blog/archive/2008/06/16/docproject-1-11-0-rc-second-update.aspx</link><pubDate>Mon, 16 Jun 2008 05:25:05 GMT</pubDate><guid isPermaLink="false">5b5c6d2b-d071-4bf8-ac28-4f9cd768b39b:487</guid><dc:creator>Dave Sexton</dc:creator><slash:comments>0</slash:comments><description>&lt;p&gt;Another update was just released for &lt;a href="http://www.codeplex.com/DocProject/Release/ProjectReleases.aspx?ReleaseId=10744"&gt;DocProject 1.11.0 RC&lt;/a&gt;.&amp;nbsp; This update replaces the existing installer on the &lt;em&gt;Releases&lt;/em&gt; page that was deployed for &lt;a href="http://davesexton.com/blog/blogs/blog/archive/2008/06/13/docproject-1-11-0-rc-updated.aspx"&gt;the first update&lt;/a&gt;.&lt;/p&gt; &lt;p&gt;For anyone that had previously downloaded DocProject 1.11.0 RC or the first update, you can download it again if you're experiencing the problem that was fixed by this update.&lt;/p&gt; &lt;p&gt;&lt;strong&gt;Note: &lt;/strong&gt;Make sure to manually uninstall any existing version of DocProject before installing the new version since the version number was not incremented.&amp;nbsp; Use the &lt;strong&gt;Add or Remove Programs&lt;/strong&gt; dialog in &lt;strong&gt;Control Panel&lt;/strong&gt;.&lt;/p&gt; &lt;h5&gt;Update&lt;/h5&gt; &lt;p&gt;This time I've fixed a single bug in the XML documentation editor whereby modifying comments in &lt;em&gt;Source&lt;/em&gt; mode and then saving the changes would write &amp;lt;&lt;strong&gt;see &lt;/strong&gt;/&amp;gt; elements as &amp;lt;&lt;strong&gt;doc:see &lt;/strong&gt;/&amp;gt; elements instead, which of course Sandcastle ignores because the tags are in an unknown XML namespace.&amp;nbsp; A similar thing happens to other in-line XML documentation elements too.&lt;/p&gt; &lt;p&gt;I've tried testing a few different scenarios after fixing this issue and I can't seem to break the XML documentation editor anymore, but please keep the feedback coming if anyone can find some more stuff for me to fix.&lt;/p&gt;&lt;img src="http://davesexton.com/blog/aggbug.aspx?PostID=487" width="1" height="1"&gt;</description><category domain="http://davesexton.com/blog/blogs/blog/archive/tags/Sandcastle/default.aspx">Sandcastle</category><category domain="http://davesexton.com/blog/blogs/blog/archive/tags/DocProject/default.aspx">DocProject</category></item><item><title>DocProject 1.11.0 RC Updated</title><link>http://davesexton.com/blog/blogs/blog/archive/2008/06/13/docproject-1-11-0-rc-updated.aspx</link><pubDate>Sat, 14 Jun 2008 01:57:27 GMT</pubDate><guid isPermaLink="false">5b5c6d2b-d071-4bf8-ac28-4f9cd768b39b:486</guid><dc:creator>Dave Sexton</dc:creator><slash:comments>4</slash:comments><description>&lt;p&gt;An update was just released for &lt;a href="http://www.codeplex.com/DocProject/Release/ProjectReleases.aspx?ReleaseId=10744"&gt;DocProject 1.11.0 RC&lt;/a&gt;.&amp;nbsp; It replaces the existing installer on the &lt;em&gt;Releases&lt;/em&gt; page.&lt;/p&gt; &lt;p&gt;For anyone that had previously downloaded DocProject 1.11.0 RC you can download it again if you've experienced any of the following bugs.&lt;/p&gt; &lt;p&gt;&lt;strong&gt;Note: &lt;/strong&gt;Make sure to manually uninstall an existing version of DocProject before installing the new version since the version number was not incremented.&amp;nbsp; Use the &lt;strong&gt;Add or Remove Programs&lt;/strong&gt; dialog in &lt;strong&gt;Control Panel&lt;/strong&gt;.&lt;/p&gt; &lt;h5&gt;Issue 1&lt;/h5&gt; &lt;p&gt;Missing root Namespaces node in Topic Explorer.&lt;/p&gt; &lt;p&gt;&lt;strong&gt;Cause&lt;/strong&gt;&lt;/p&gt; &lt;p&gt;Documenting only one namespace.&lt;/p&gt; &lt;p&gt;&lt;strong&gt;Fix&lt;/strong&gt;&lt;/p&gt; &lt;p&gt;The &lt;strong&gt;TopicManager&lt;/strong&gt; class was only creating the root node if the topic had more than one namespace, but since this behavior is invalid it was removed.&lt;/p&gt; &lt;h5&gt;Issue 2&lt;/h5&gt; &lt;p&gt;Installing for &lt;strong&gt;Everyone&lt;/strong&gt; and both VS 2005 and 2008 did not work properly; the Add-In would not appear in VS.&lt;/p&gt; &lt;p&gt;&lt;strong&gt;Cause&lt;/strong&gt;&lt;/p&gt; &lt;p&gt;The custom action that copies the &lt;strong&gt;.AddIn&lt;/strong&gt; files to the target directories is responsible for updating their content so that they're compatible with the target version of VS.&amp;nbsp; Since the target directory for both VS 2005 and 2008 is the same when installing for &lt;strong&gt;Everyone&lt;/strong&gt;, one copy of the .AddIn file would replace the other, and even that didn't get updated properly.&lt;/p&gt; &lt;p&gt;&lt;strong&gt;Fix&lt;/strong&gt;&lt;/p&gt; &lt;p&gt;Since there's already two separate .AddIn files for each version of VS the version number was hard-coded so that it doesn't have to be updated during the installation.&amp;nbsp; To fix the problem of one file replacing another, the names of the target .AddIn files now include the 4-digit year of the version of VS to which they apply.&lt;/p&gt; &lt;h5&gt;Issue 3&lt;/h5&gt; &lt;p&gt;&lt;strong&gt;Topic Editor &lt;/strong&gt;does not handle XML documentation tags properly.&amp;nbsp; The end tag is always moved to the end of the section, causing the element to wrap all of the content from where it's defined to the end of the section.&lt;/p&gt; &lt;p&gt;&lt;strong&gt;Cause&lt;/strong&gt;&lt;/p&gt; &lt;p&gt;The &lt;strong&gt;HtmlToXmlConverter&lt;/strong&gt; class provides a mechanism by which tag names can be replaced but it only applies to the start tag of an element and not its end tag.&amp;nbsp; This issue was introduced when the &lt;strong&gt;HtmlEditor &lt;/strong&gt;control library was updated for the &lt;a href="http://davesexton.com/blog/blogs/blog/archive/2008/04/20/doctomaml-1-0-beta-is-now-available.aspx"&gt;DocToMaml 1.0 Beta&lt;/a&gt; program.&lt;/p&gt; &lt;p&gt;The reason why tag replacement is required in the &lt;strong&gt;Topic Editor&lt;/strong&gt; is that a &lt;em&gt;doc &lt;/em&gt;prefix is automatically associated with tag names that are registered in DocProject's configuration file since they are not valid HTML elements; the HtmlEditor control will only support an HTML element or an element that is associated with an XML namespace.&amp;nbsp; This allows styles to be applied, such as those in the &lt;strong&gt;TopicDesigner.css&lt;/strong&gt; file and causes the control to treat the elements more like XML instead of HTML; e.g., unknown tag names are not automatically changed to upper case.&amp;nbsp; When converting HTML back into XML the &lt;em&gt;doc &lt;/em&gt;prefix must be removed, hence the requirement for the tag replacement mechanism of the &lt;strong&gt;HtmlToXmlConverter&lt;/strong&gt; class.&lt;/p&gt; &lt;p&gt;&lt;strong&gt;Fix&lt;/strong&gt;&lt;/p&gt; &lt;p&gt;Tag name replacement now works on both the start and end tags so that the parser can properly close the element at the position where the end tag is found in the source XML.&lt;/p&gt;&lt;img src="http://davesexton.com/blog/aggbug.aspx?PostID=486" width="1" height="1"&gt;</description><category domain="http://davesexton.com/blog/blogs/blog/archive/tags/Sandcastle/default.aspx">Sandcastle</category><category domain="http://davesexton.com/blog/blogs/blog/archive/tags/DocProject/default.aspx">DocProject</category></item><item><title>DocProject 1.11.0 RC Is Now Available</title><link>http://davesexton.com/blog/blogs/blog/archive/2008/06/08/docproject-1-11-0-rc-is-now-available.aspx</link><pubDate>Mon, 09 Jun 2008 04:02:44 GMT</pubDate><guid isPermaLink="false">5b5c6d2b-d071-4bf8-ac28-4f9cd768b39b:484</guid><dc:creator>Dave Sexton</dc:creator><slash:comments>2</slash:comments><description>&lt;p&gt;&lt;a href="https://www.codeplex.com/Release/ProjectReleases.aspx?ProjectName=DocProject&amp;amp;ReleaseId=10744"&gt;DocProject 1.11.0 Release Candidate&lt;/a&gt; is now available on CodePlex.&amp;nbsp; It supports the &lt;b&gt;Sandcastle May 2008 Release&lt;/b&gt; and contains many bug fixes and new features, most of which are listed below.&lt;/p&gt; &lt;li&gt;Full support for both &lt;b&gt;Visual Studio 2005&lt;/b&gt; and &lt;b&gt;Visual Studio 2008&lt;/b&gt; using a single installer.  &lt;li&gt;Conceptual topics created in &lt;b&gt;Topic Exporer&lt;/b&gt; are now saved with friendly file names and an &lt;b&gt;.aml&lt;/b&gt; extension. A dependent companion file (&lt;b&gt;.cmp&lt;/b&gt;) for storing metadata is created as well.  &lt;li&gt;The topic import feature has been improved and now supports the inclusion of raw HTML topics in &lt;b&gt;Topic Exporer&lt;/b&gt;. Legacy MAML topics (those with an &lt;b&gt;.xml&lt;/b&gt; extension) are automatically imported into the new format and, if possible, a friendly name is chosen automatically.  &lt;li&gt;An optional &lt;b&gt;Import Topics and Settings&lt;/b&gt; wizard step has been added to the &lt;b&gt;New Project Wizard&lt;/b&gt;. It allows for a single &lt;i&gt;DocProject&lt;/i&gt; or &lt;i&gt;DocSite&lt;/i&gt; file to be specified from which topics and settings will be imported into the new project automatically.  &lt;li&gt;Wildcard characters, including directory recursion (**\ - but only on the most nested directory) is now supported in various dialogs, including &lt;b&gt;External sources&lt;/b&gt;.  &lt;li&gt;The &lt;b&gt;External sources&lt;/b&gt; dialog is now available in the last step of the &lt;b&gt;New Project Wizard&lt;/b&gt;.  &lt;li&gt;Automatic checkout of source-controlled project items occurs whenever a project option or dialog must write to a file in the project.  &lt;li&gt;&lt;a href="http://www.codeplex.com/DocProject/Wiki/View.aspx?title=ResolveExternalLinksComponent&amp;amp;referringTitle=Home"&gt;ResolveExternalLinksComponent&lt;/a&gt; now works for conceptual builds and is automatically added to the conceptual configuration files when new &lt;i&gt;DocProjects&lt;/i&gt; and &lt;i&gt;DocSites&lt;/i&gt; are created. (The standalone release will also be updated.)  &lt;li&gt;&lt;b&gt;Open in Visual Studio&lt;/b&gt; toolbar button added to the &lt;a href="http://www.codeplex.com/DocProject/Wiki/View.aspx?title=DocProject%20External%20UI&amp;amp;referringTitle=Home"&gt;DocProject External UI&lt;/a&gt;.  &lt;li&gt;New &lt;b&gt;Topic Explorer&lt;/b&gt; context menu commands: &lt;b&gt;Copy as reference link&lt;/b&gt;, &lt;b&gt;Copy as conceptual link&lt;/b&gt; and &lt;b&gt;Copy as topic identifier&lt;/b&gt;.  &lt;li&gt;New &lt;b&gt;Topic Properties&lt;/b&gt; window that provides a user interface (UI) for editing conceptual topic metadata, such as Help 2.x &lt;i&gt;DocSet&lt;/i&gt; attributes, index keywords and the topic's display title. This window is reachable by right-mouse clicking a conceptual topic in &lt;b&gt;Topic Explorer&lt;/b&gt; and selecting &lt;b&gt;Properties&lt;/b&gt; in the context menu.  &lt;li&gt;New &lt;i&gt;Help\Settings&lt;/i&gt; files are automatically included when &lt;i&gt;DocProjects&lt;/i&gt; and &lt;i&gt;DocSites&lt;/i&gt; are created:  &lt;ul&gt; &lt;li&gt;&lt;b&gt;conceptual_snippets.xml&lt;/b&gt;: Specifies code snippets written in multiple programming languages that may be included in conceptual topics.  &lt;li&gt;&lt;b&gt;tokens.xml&lt;/b&gt;: Specifies shared content items for both conceptual topics and XML documentation comments; items are referenced using &amp;lt;token&amp;gt;name&amp;lt;/token&amp;gt; elements.  &lt;li&gt;&lt;b&gt;links.xml&lt;/b&gt;: Specifies external hyperlinks that can be used in both conceptual topics and XML documentation comments. (See &lt;a href="http://www.codeplex.com/DocProject/Wiki/View.aspx?title=ResolveExternalLinksComponent&amp;amp;referringTitle=Home"&gt;ResolveExternalLinksComponent&lt;/a&gt; for more information.)  &lt;li&gt;&lt;b&gt;metadata.xml:&lt;/b&gt; Specifies global Help 2.x metadata that is inserted into all conceptual topics and auto-generated reference topics. Metadata can include attributes such as &lt;i&gt;DocSet&lt;/i&gt;, &lt;i&gt;Product&lt;/i&gt;, &lt;i&gt;TargetOS&lt;/i&gt; and custom values.  &lt;li&gt;&lt;b&gt;bibliography.xml:&lt;/b&gt; Specifies global reference information for topic bibliographies. Conceptual topics and XML documentation comments that have citations as &amp;lt;cite&amp;gt;name&amp;lt;/cite&amp;gt; elements will have bibliographies generated automatically.  &lt;ul&gt; &lt;li&gt;&lt;b&gt;Note:&lt;/b&gt; The &lt;a href="http://www.codeplex.com/SandcastleStyles"&gt;Sandcastle Styles&lt;/a&gt; patch is required to support this feature. &lt;/li&gt;&lt;/ul&gt;&lt;/li&gt;&lt;/ul&gt; &lt;li&gt;New management dialogs for Help 1.x and Help 2.x configuration. (Settings are persisted to certain files in &lt;i&gt;Help\Settings\Projects\&lt;/i&gt;, &lt;i&gt;Help\Topics\Html\MSHelp2\&lt;/i&gt; and the root &lt;i&gt;Help\&lt;/i&gt; folder.)  &lt;ul&gt; &lt;li&gt;Configurable Help 1.x project options such as the list of source files, &lt;i&gt;Binary TOC&lt;/i&gt;, &lt;i&gt;Default Window&lt;/i&gt; and &lt;i&gt;Display progress during builds&lt;/i&gt;.  &lt;li&gt;Configurable Help 2.x project options.  &lt;ul&gt; &lt;li&gt;Named URL values such as &lt;b&gt;DefaultPage&lt;/b&gt; and &lt;b&gt;HomePage&lt;/b&gt;, which may be chosen from a list of topics, and &lt;b&gt;AboutPageInfo&lt;/b&gt;, &lt;strong&gt;EmptyIndexTerm&lt;/strong&gt; and &lt;b&gt;NavFailPage&lt;/b&gt;, which can be created with DocProject's HTML editor.  &lt;li&gt;The &lt;b&gt;Help &amp;gt; About&lt;/b&gt; image that appears in &lt;b&gt;Document Explorer&lt;/b&gt;. (An HTML page that references the image is automatically generated for the &lt;b&gt;AboutPageIcon&lt;/b&gt; named URL.)  &lt;li&gt;Global metadata attributes, which are stored in &lt;i&gt;Help\Settings\metadata.xml&lt;/i&gt; (more information above). &lt;/li&gt;&lt;/ul&gt;&lt;/li&gt;&lt;/ul&gt; &lt;li&gt;Improved MAML topic templates.  &lt;li&gt;The behavior for detecting out-of-date sources and files has changed to allow for more control over change tacking.  &lt;ul&gt; &lt;li&gt;Modifying individual conceptual topics may change the type of the next build. Changes are detected for MAML topics in &lt;i&gt;Help\Topics\&lt;/i&gt; and raw HTML topics in &lt;i&gt;Help\Topics\Html\&lt;/i&gt;.  &lt;li&gt;Starting Visual Studio and loading a &lt;i&gt;DocProject&lt;/i&gt; or a &lt;i&gt;DocSite&lt;/i&gt; does not force a full build anymore unless the output is actually outdated.  &lt;li&gt;Another effect is that deleting the .chm or .HxS files no longer causes a partial build; instead, it always causes a full build. To force a partial build you must modify a &lt;a href="http://www.codeplex.com/DocProject/Wiki/View.aspx?title=Build%20Process&amp;amp;referringTitle=Home&amp;amp;ANCHOR#Sandcastle"&gt;partial build item&lt;/a&gt;. &lt;/li&gt;&lt;/ul&gt; &lt;li&gt;&lt;b&gt;Generate root API topic&lt;/b&gt; is now enabled by default in new &lt;i&gt;DocProjects&lt;/i&gt; and &lt;i&gt;DocSites&lt;/i&gt;.  &lt;li&gt;Added &lt;b&gt;inheritdoc&lt;/b&gt; tag to the DocProject configuration file so that it appears in the &lt;b&gt;Topic Editor&lt;/b&gt; sections list when writing external XML documentation.&lt;/li&gt;&lt;img src="http://davesexton.com/blog/aggbug.aspx?PostID=484" width="1" height="1"&gt;</description><category domain="http://davesexton.com/blog/blogs/blog/archive/tags/Sandcastle/default.aspx">Sandcastle</category><category domain="http://davesexton.com/blog/blogs/blog/archive/tags/DocProject/default.aspx">DocProject</category></item><item><title>Visual Studio Gallery Updated</title><link>http://davesexton.com/blog/blogs/blog/archive/2008/06/06/visual-studio-gallery-updated.aspx</link><pubDate>Fri, 06 Jun 2008 16:13:59 GMT</pubDate><guid isPermaLink="false">5b5c6d2b-d071-4bf8-ac28-4f9cd768b39b:482</guid><dc:creator>Dave Sexton</dc:creator><slash:comments>2</slash:comments><description>&lt;p&gt;It appears that Microsoft has improved the &lt;a href="http://www.visualstudiogallery.com"&gt;Visual Studio Gallery&lt;/a&gt; by adding the ability for users to rate and review products.&amp;nbsp; The interface was jazzed up a bit as well.&amp;nbsp; Nice work MS - the original gallery was more like a project dump but the new release is community-oriented, which I think people will appreciate.&lt;/p&gt; &lt;p&gt;&lt;a title="DocProject on CodePlex" href="http://www.visualstudiogallery.com/ExtensionDetails.aspx?ExtensionID=0586c442-6114-4071-8135-5244bb1e858e"&gt;DocProject&lt;/a&gt; has been in the top 10 most visited projects since the VS Gallery went live (it was in the top 3 for quite a while too), which just goes to show you how important documentation is to developers when a tool such as DocProject is more &lt;em&gt;interesting&lt;/em&gt; than tools that aid in development.&amp;nbsp; This certainly motivates me to continue working on it for VS 2008 :)&lt;/p&gt; &lt;p&gt;I'd like your feedback so please drop by and write a review if you can find the time.&amp;nbsp; Thanks!&lt;/p&gt;&lt;img src="http://davesexton.com/blog/aggbug.aspx?PostID=482" width="1" height="1"&gt;</description><category domain="http://davesexton.com/blog/blogs/blog/archive/tags/Microsoft/default.aspx">Microsoft</category><category domain="http://davesexton.com/blog/blogs/blog/archive/tags/Visual+Studio/default.aspx">Visual Studio</category><category domain="http://davesexton.com/blog/blogs/blog/archive/tags/DocProject/default.aspx">DocProject</category></item><item><title>Sandcastle Styles Project on CodePlex</title><link>http://davesexton.com/blog/blogs/blog/archive/2008/06/04/sandcastle-styles-project-on-codeplex.aspx</link><pubDate>Wed, 04 Jun 2008 20:47:30 GMT</pubDate><guid isPermaLink="false">5b5c6d2b-d071-4bf8-ac28-4f9cd768b39b:481</guid><dc:creator>Dave Sexton</dc:creator><slash:comments>0</slash:comments><description>&lt;p&gt;The &lt;a title="Sandcastle Styles on CodePlex" href="http://www.codeplex.com/SandcastleStyles"&gt;Sandcastle Styles&lt;/a&gt; project is now live on CodePlex.&amp;nbsp; From the project's home page: &lt;/p&gt; &lt;blockquote&gt; &lt;p&gt;&lt;em&gt;The goal of this project is to improve Sandcastle by providing a rolled-up solution to various presentation style issues in a manner that is highly visible to the Sandcastle community and also involves community feedback.&lt;/em&gt;&lt;/p&gt;&lt;/blockquote&gt; &lt;p&gt;This project was &lt;a href="http://www.codeplex.com/Sandcastle/Thread/View.aspx?ThreadId=27749"&gt;started&lt;/a&gt; by Paul Selormey, Eric Woodruff and myself.&amp;nbsp; Currently we're the only active contributors but we'll be happy to take any feedback you have to offer.&amp;nbsp; Let us know by starting a &lt;a href="http://www.codeplex.com/SandcastleStyles/Thread/List.aspx"&gt;discussion&lt;/a&gt;.&lt;/p&gt; &lt;p&gt;Sandcastle features and issues should be submitted directly to the &lt;a href="http://www.codeplex.com/Sandcastle/WorkItem/AdvancedList.aspx"&gt;Sandcastle Issue Tracker&lt;/a&gt; so that the Sandcastle team will be notified.&lt;/p&gt; &lt;h4&gt;What's Inside?&lt;/h4&gt; &lt;p&gt;Eric has included his &lt;strong&gt;presentation style patches&lt;/strong&gt; from the SHFB project - we're now deploying them as a part of Sandcastle Styles.&amp;nbsp; There are additional bug fixes and modifications that were made for the May 2008 release of Sandcastle as well.&amp;nbsp; He has also included a new &lt;strong&gt;MAML guide&lt;/strong&gt; as a separate download and custom code providers for VB and C# that can be used to extract assemblies and XML documentation files from Visual Studio &lt;strong&gt;Web Site &lt;/strong&gt;projects.&lt;/p&gt; &lt;p&gt;We've also added some new features to each presentation style, such as support for the &lt;strong&gt;MAML glossary&lt;/strong&gt; document type, &lt;strong&gt;image placement&lt;/strong&gt; support in MAML, enhanced &lt;strong&gt;&amp;lt;autoOutline&amp;gt;&lt;/strong&gt; in MAML, and also an &lt;strong&gt;auto-generated bibliography&lt;/strong&gt; for both conceptual and reference topics.&amp;nbsp; Tools such as &lt;a title="DocProject on CodePlex" href="http://www.codeplex.com/DocProject"&gt;DocProject&lt;/a&gt; and &lt;a href="http://www.codeplex.com/SHFB/"&gt;SHFB&lt;/a&gt; support these features with the patches applied.&lt;/p&gt; &lt;p&gt;I've started an &lt;a href="http://www.codeplex.com/SandcastleStyles/SourceControl/DirectoryView.aspx?SourcePath=%24%2fSandcastleStyles%2fMain%2fSource%2fExamples&amp;amp;changeSetId=19568"&gt;Examples&lt;/a&gt;&lt;strong&gt; &lt;/strong&gt;project that shows the typical usage of XML documentation comments (all tags supported by Sandcastle) and common MAML markup, such as linking, tokens, code snippets and media.&amp;nbsp; I've also included DocProject's MAML document templates for those that are using a different tool.&amp;nbsp; Lastly, there's an API that can be used to test Sandcastle filtering capabilities in our automation tools, which also provides some nice examples of how to add XML documentation to code and how to use the &lt;strong&gt;&amp;lt;include/&amp;gt;&lt;/strong&gt; tag to share comments and keep code neat.&lt;/p&gt; &lt;p&gt;We expect to improve our library of examples and include additional languages and project types in the future, and I hope to make it available as a separate download as well.&amp;nbsp; Also, if people will donate language packs for Sandcastle we'll tidy them up and host them.&lt;/p&gt; &lt;p&gt;Hopefully the community will find this project to be a valuable Sandcastle resource.&amp;nbsp; Any feedback will be appreciated :)&lt;/p&gt;&lt;img src="http://davesexton.com/blog/aggbug.aspx?PostID=481" width="1" height="1"&gt;</description><category domain="http://davesexton.com/blog/blogs/blog/archive/tags/Sandcastle/default.aspx">Sandcastle</category><category domain="http://davesexton.com/blog/blogs/blog/archive/tags/documentation/default.aspx">documentation</category><category domain="http://davesexton.com/blog/blogs/blog/archive/tags/MAML/default.aspx">MAML</category></item><item><title>MAML Editor: Progress</title><link>http://davesexton.com/blog/blogs/blog/archive/2008/06/03/maml-editor_2D00_progress.aspx</link><pubDate>Tue, 03 Jun 2008 05:35:00 GMT</pubDate><guid isPermaLink="false">5b5c6d2b-d071-4bf8-ac28-4f9cd768b39b:474</guid><dc:creator>Dave Sexton</dc:creator><slash:comments>5</slash:comments><description>&lt;P&gt;This blog post is just an update on my progress creating a WYSIWYG (what you see is what you get) &lt;A href="http://www.codeplex.com/DocProject/WorkItem/View.aspx?WorkItemId=15724"&gt;MAML editor&lt;/A&gt;.&amp;nbsp; I've received a lot of feedback (relative) for the MAML editor and I know that people are waiting for one, so I'd like to share with you some information about the one that I'm working on and when it will be available.&lt;/P&gt;
&lt;P&gt;For those of you who are unaware of what MAML is, you can read about it &lt;A href="http://davesexton.com/blog/blogs/blog/archive/2008/05/24/maml-migration-the-next-step-in-the-evolution-of-help-authoring.aspx"&gt;here&lt;/A&gt;.&lt;/P&gt;
&lt;P&gt;I've created a &lt;EM&gt;very&lt;/EM&gt; basic MAML editor using .NET 3.5, C# 3.0, LINQ to XML and WPF, but it's not currently my priority since I'm planning to release &lt;A href="http://davesexton.com/blog/blogs/blog/archive/2008/05/03/docproject-roadmap-part-ii.aspx"&gt;DocProject 1.11.0 RC&lt;/A&gt; later this week.&amp;nbsp; A preview of the editor will be released though in the next couple of weeks as a standalone WPF application, a VS 2008 package (with MAML item templates) and also a standalone class library so that other tool developers can use the editor in their own applications - although note the dependency on the .NET 3.5 runtime and the DocProject license, which is currently the &lt;A href="http://www.codeplex.com/DocProject/license"&gt;GNU-GPL&lt;/A&gt;.&lt;/P&gt;
&lt;P&gt;The editor isn't schema based yet - I've hard-coded support for the &lt;EM&gt;Conceptual&lt;/EM&gt; document type only, although since that type shares many common elements with other types, like &lt;EM&gt;How To&lt;/EM&gt; and &lt;EM&gt;UI Reference&lt;/EM&gt;, they're basically supported as well.&amp;nbsp; The only difference now is that there's no schema validation and the UI cannot create several elements that are optional in the schema for the other document types.&amp;nbsp; Though the current implementation has been designed to be flexible enough so that adding these things should be easy to do later on.&lt;/P&gt;
&lt;P&gt;Since the editor is based on a WPF &lt;STRONG&gt;RichTextBox &lt;/STRONG&gt;control, we get a free spell checker with squiggly underlines and an undo/redo buffer.&amp;nbsp; It's also really simple to implement custom control logic for various elements (the current implementation uses a factory pattern to generate parsers for the individual elements, by name), such as a link editor, tables, images, and other stuff.&amp;nbsp; So far I've added collapsible sections that actually function when you click the button, some custom logic that controls input behavior for various key presses, and also whitespace normalization for text (&lt;STRONG&gt;Run &lt;/STRONG&gt;content in WPF).&lt;/P&gt;
&lt;P&gt;Loading and saving also works, however synchronization between the data model in memory and the logical tree of the WPF content model still needs to be implemented - a major part of the editor - but with the event model and my current architecture I don't think it'll be too difficult; e.g., the data model currently uses &lt;STRONG&gt;XElement&lt;/STRONG&gt; instances (from LINQ to XML) that contain annotations for their corresponding WPF content elements (&lt;STRONG&gt;Section&lt;/STRONG&gt;, &lt;STRONG&gt;TableCell&lt;/STRONG&gt;, &lt;STRONG&gt;Paragraph&lt;/STRONG&gt;, &lt;STRONG&gt;Run&lt;/STRONG&gt;, etc.) when the data is first parsed.&amp;nbsp; The idea is to update the document directly when changes in the UI are detected.&amp;nbsp; Saving the changes are then as simple as saving the &lt;STRONG&gt;XDocument&lt;/STRONG&gt;&lt;STRONG&gt;.&lt;/STRONG&gt;&lt;/P&gt;
&lt;P&gt;Metadata is also editable, so I've decided to generate two separate files when saving a single topic.&amp;nbsp; The first file is the topic file itself, which contains the root topic node, its &lt;STRONG&gt;id &lt;/STRONG&gt;and &lt;STRONG&gt;revisionNumber &lt;/STRONG&gt;attributes, as well as the actual MAML content.&amp;nbsp; The second file is an XML companion file (to use the Sandcastle lingo) that contains metadata such as the topic's title, TOC title, MS Help attributes and index keywords.&amp;nbsp; I may have another XML-based file created in the future to save editor settings for individual topics, such as the visibility status of individual sections; i.e., a &lt;EM&gt;designer&lt;/EM&gt; file.&lt;/P&gt;
&lt;P&gt;MAML topics are saved with an .aml extension (&lt;STRONG&gt;A&lt;/STRONG&gt;ssistance &lt;STRONG&gt;M&lt;/STRONG&gt;arkup &lt;STRONG&gt;L&lt;/STRONG&gt;anguage) and companion files use a .cmp extension with the same base file name as the .aml topic.&amp;nbsp; In the VS 2008 package, the .cmp file will be created with a dependency on the .aml so that it appears as a child in Solution Explorer.&amp;nbsp; The next version of &lt;A title="DocProject on CodePlex" href="http://www.codeplex.com/DocProject"&gt;DocProject&lt;/A&gt; will provide support for these extensions so that when I release a preview of the editor your existing DocProjects and DocSites will already be compatible.&lt;/P&gt;
&lt;P&gt;There's still &lt;STRONG&gt;&lt;U&gt;a lot&lt;/U&gt;&lt;/STRONG&gt; more to do before the editor is actually usable for generating quality MAML topics, but it's on its way.&amp;nbsp; After a bit more functionality is implemented I'll blog about it in more depth and post some screenshots.&amp;nbsp; For now, check out a screenshot below of the editor as I edit a simple &lt;EM&gt;How To&lt;/EM&gt; topic that was previously written using Visual Studio's XML editor.&lt;/P&gt;
&lt;P&gt;(Note that this is just a temporary WPF app that hosts the control while I develop it.&amp;nbsp; The final app will have command buttons for semantic markup, such as &lt;STRONG&gt;database&lt;/STRONG&gt;, &lt;STRONG&gt;ui&lt;/STRONG&gt;, &lt;STRONG&gt;application&lt;/STRONG&gt;, &lt;STRONG&gt;system&lt;/STRONG&gt;, &lt;STRONG&gt;localUri&lt;/STRONG&gt;, etc. and block-level elements such as &lt;STRONG&gt;section&lt;/STRONG&gt;, &lt;STRONG&gt;procedure&lt;/STRONG&gt;, &lt;STRONG&gt;list&lt;/STRONG&gt; and &lt;STRONG&gt;table&lt;/STRONG&gt;.&amp;nbsp;&amp;nbsp; I didn't implement them yet because commands seem pretty simple in WPF and I wanted to concentrate on the basic editor support first, as a WPF proof of concept (I'm a first-time WPF developer :)&lt;/P&gt;
&lt;P&gt;&lt;IMG style="MARGIN:0px;" height=689 alt=image src="http://davesexton.com/Images/Blog/MAMLEditor_13D97/image.png" width=796 border=0&gt; &lt;/P&gt;
&lt;P&gt;The image above shows a MAML topic with &lt;STRONG&gt;introduction&lt;/STRONG&gt; text, a collapsible &lt;STRONG&gt;section&lt;/STRONG&gt;, a &lt;STRONG&gt;procedure&lt;/STRONG&gt; and a &lt;STRONG&gt;code&lt;/STRONG&gt; example.&amp;nbsp; I also splashed some style in there, like the large font for the section title, just for the screenshot (the final editor will most likely get style information at runtime from WPF content resource themes so that its appearance will be completely customizable, without having to rebuild the source code).&lt;/P&gt;
&lt;P&gt;Clicking the toggle button for the section will actually toggle the visibility of the section's content in the editor (note that the image is ugly only because it's on a button and I didn't remove the border yet).&amp;nbsp; I plan to add other controls as well for functions such as adding links, tokens and media.&amp;nbsp; The controls will actually be &lt;EM&gt;inside &lt;/EM&gt;the document as part of the flow like the section toggle button - this is one of the really powerful features of WPF 3.5 flow documents.&lt;/P&gt;
&lt;P&gt;There's even a context menu with &lt;STRONG&gt;Cut&lt;/STRONG&gt;, &lt;STRONG&gt;Copy &lt;/STRONG&gt;and &lt;STRONG&gt;Paste &lt;/STRONG&gt;commands that I didn't have to write since it's provided by WPF.&amp;nbsp; Editing the text and everything else behaves exactly like you would expect from a WYSIWYG editor, which also means that I'm going to have to add custom logic to attach behavior to specific elements so that everything is a bit less fragile.&amp;nbsp; For example, one thing that I've done already is to add a behavior so that when the &lt;STRONG&gt;Enter&lt;/STRONG&gt; key is pressed the cursor moves to a new line instead of an entirely new paragraph.&amp;nbsp; Pressing &lt;STRONG&gt;Enter&lt;/STRONG&gt; a second time, while on the new blank line, will delete the blank line and start a new paragraph (it's more complicated than that, but you get the idea).&amp;nbsp; Having a new line within the same paragraph won't change the MAML output, it just provides some control over the appearance while editing.&amp;nbsp; Of course, if this is confusing or annoying I can always remove it later.&lt;/P&gt;
&lt;P&gt;I'd like to get feedback on my ideas so that I can quickly provide an editor that people are satisfied with.&amp;nbsp; If you have any suggestions about how the editor can be improved please let know.&amp;nbsp; Thanks!&lt;/P&gt;&lt;img src="http://davesexton.com/blog/aggbug.aspx?PostID=474" width="1" height="1"&gt;</description><category domain="http://davesexton.com/blog/blogs/blog/archive/tags/Sandcastle/default.aspx">Sandcastle</category><category domain="http://davesexton.com/blog/blogs/blog/archive/tags/DocProject/default.aspx">DocProject</category><category domain="http://davesexton.com/blog/blogs/blog/archive/tags/documentation/default.aspx">documentation</category><category domain="http://davesexton.com/blog/blogs/blog/archive/tags/MAML/default.aspx">MAML</category></item><item><title>MAML Migration: The Next Step in the Evolution of Help Authoring</title><link>http://davesexton.com/blog/blogs/blog/archive/2008/05/24/maml-migration-the-next-step-in-the-evolution-of-help-authoring.aspx</link><pubDate>Sat, 24 May 2008 14:53:10 GMT</pubDate><guid isPermaLink="false">5b5c6d2b-d071-4bf8-ac28-4f9cd768b39b:460</guid><dc:creator>Dave Sexton</dc:creator><slash:comments>4</slash:comments><description>&lt;p&gt;Are you part of that &lt;em&gt;herd &lt;/em&gt;of developers that is used to documenting applications by writing help topics in raw HTML?&amp;nbsp; The power of it is nice, being able to add a pinch of &lt;em&gt;bold &lt;/em&gt;here, a splash of &lt;em&gt;italics&lt;/em&gt; there, some CSS for different layouts, a floating image, several nested tables, an abundance of hyperlinks, embedded Flash and media players, and even some JavaScript to boot.&amp;nbsp; What more could we want?&amp;nbsp; Or maybe a better question is, what could possibly make us want to give any of that up?&lt;/p&gt; &lt;h4&gt;XML Documentation Comments&lt;/h4&gt; &lt;p&gt;Well, &lt;a href="http://msdn.microsoft.com/en-us/library/b2s063f7.aspx"&gt;XML documentation comments&lt;/a&gt; that may be added to code modules (I'm assuming everyone's familiar with this stuff by now) was one thing that prompted .NET developers to start documenting their code without using HTML.&amp;nbsp; It's nice to be able to apply a bit of XML structure to our documentation, isn't it?&lt;/p&gt; &lt;p&gt;Commonly used &lt;em&gt;semantics&lt;/em&gt; for describing an API may be expressed in a universal way with XML tags such as &lt;strong&gt;summary&lt;/strong&gt;, &lt;strong&gt;remarks &lt;/strong&gt;and &lt;strong&gt;example&lt;/strong&gt;, and the compiler builds an XML documentation file that contains the code comments found in each module when we build our project.&amp;nbsp; If you take a look at the contents of this file you may see a repeating pattern - &lt;em&gt;schema&lt;/em&gt; - that seems like it could be used by some other tools to do, well, other things with it...&lt;/p&gt; &lt;p&gt;Compare XML documentation to your legacy HTML help topics and what do you notice?&amp;nbsp; The XML comments that you add to APIs do not typically contain much &lt;em&gt;layout&lt;/em&gt;&lt;strong&gt; &lt;/strong&gt;or &lt;em&gt;formatting&lt;/em&gt;, whereas your HTML topics are chock-full of &amp;lt;b&amp;gt;'s, &amp;lt;i&amp;gt;'s, and &amp;lt;u&amp;gt;'s, and a whole mess of other HTML to describe the document's layout and formatting.&amp;nbsp; Ok, ok, if you've done it &lt;em&gt;correctly &lt;/em&gt;then you've made judicious use of CSS - applying class names to all of those &amp;lt;h*&amp;gt;'s, &amp;lt;div&amp;gt;'s, &amp;lt;span&amp;gt;'s, &amp;lt;p&amp;gt;'s, &amp;lt;a&amp;gt;'s, &amp;lt;td&amp;gt;'s, &amp;lt;tr&amp;gt;'s, &amp;lt;ol&amp;gt;'s, &amp;lt;ul&amp;gt;'s, &amp;lt;dl&amp;gt;'s, and certainly many other HTML tags that only add to the confusion when &lt;em&gt;authoring&lt;/em&gt; topics (as opposed to &lt;em&gt;designing&lt;/em&gt; them).&lt;/p&gt; &lt;p&gt;Now you might be thinking, "Dave, it's not entirely true that XML documentation is &lt;em&gt;without &lt;/em&gt;formatting.&amp;nbsp; What about the &lt;strong&gt;para&lt;/strong&gt;, &lt;strong&gt;code &lt;/strong&gt;and &lt;strong&gt;c &lt;/strong&gt;elements?".&amp;nbsp; And to that my reply would be, "Ok, so then what exactly do they look like?".&amp;nbsp; If you look in the XML documentation files that are produced by your compilers, you'll see the markup exactly as it appears in your code modules.&amp;nbsp; In other words, no HTML and no CSS - nothing more than semantic usage: &lt;em&gt;paragraph&lt;/em&gt;, &lt;em&gt;code block &lt;/em&gt;and &lt;em&gt;in-line code&lt;/em&gt;.&amp;nbsp; (If you were thinking something more like, "&lt;em&gt;leading white-space&lt;/em&gt;, &lt;em&gt;use pre formatting, code coloring&lt;/em&gt; and a &lt;em&gt;fixed font&lt;/em&gt;", then you're getting ahead of yourself, so slow down!)&lt;/p&gt; &lt;p&gt;My point is that the &lt;em&gt;semantics&lt;/em&gt; for the aforementioned XML documentation tags are clear (i.e., what the tags represent), but their appearance is not yet defined (i.e., their style and format).&amp;nbsp; Take a look at the other &lt;a href="http://msdn.microsoft.com/en-us/library/5ast78ax.aspx"&gt;Recommended Tags for Documentation Comments&lt;/a&gt; and you won't find anything out of the ordinary.&amp;nbsp; Each tag has an obvious reason for its existence - to mark up regions of text that serve a particular &lt;em&gt;purpose&lt;/em&gt; in the documentation.&amp;nbsp; But how do they look?&amp;nbsp; Nobody knows!&amp;nbsp; ;)&lt;/p&gt; &lt;h4&gt;Sandcastle&lt;/h4&gt; &lt;p&gt;Now's probably a good time to introduce &lt;a title="Sandcastle on CodePlex" href="http://www.codeplex.com/Sandcastle"&gt;Sandcastle&lt;/a&gt;.&amp;nbsp; For those of you that aren't familiar with it yet, Sandcastle is Microsoft's tool set for producing HTML help topics dynamically by inspecting managed assemblies and incorporating the markup from XML documentation.&amp;nbsp; From the assemblies that you provide to Sandcastle, it automatically infers a table of contents (TOC), various pseudo-topics such as &lt;em&gt;Properties &lt;/em&gt;and &lt;em&gt;Methods&lt;/em&gt;, and also generates many individual topics to cover the entire API.&amp;nbsp; The documentation you've written within XML documentation tags, such as &lt;strong&gt;summary&lt;/strong&gt;, &lt;strong&gt;remarks &lt;/strong&gt;and &lt;strong&gt;example&lt;/strong&gt;, is automatically added to the generated topics in the appropriate places.&lt;/p&gt; &lt;p&gt;The results of running Sandcastle on your assemblies and XML documentation is a set of files that are web-ready HTML help topics for your project.&amp;nbsp; This is typically referred to as &lt;strong&gt;reference documentation&lt;/strong&gt;, since it provides a reference for developers that use your API.&amp;nbsp; These topic files can be used as input to a tool such as &lt;a href="http://www.microsoft.com/downloads/details.aspx?familyid=00535334-C8A6-452F-9AA0-D597D16580CC&amp;amp;displaylang=en"&gt;HTML Help Workshop&lt;/a&gt; (Help 1.x) to produce a stand-alone compiled help file (.chm) that may be distributed with your application as an external help module.&amp;nbsp; The .NET Framework even gets in on the action by providing helpful APIs for integrating context-sensitive help and Help 1.x navigation into your managed applications.&amp;nbsp; (See the &lt;a href="http://msdn.microsoft.com/en-us/library/system.windows.forms.help.aspx"&gt;Help class&lt;/a&gt; for more information.)&lt;/p&gt; &lt;h5&gt;Presentation Styles&lt;/h5&gt; &lt;p&gt;Sandcastle provides three &lt;strong&gt;presentation styles&lt;/strong&gt; that it can produce for your documentation out-of-the-box.&amp;nbsp; Each one consists of a set of XSL transformation files that convert XML documentation into XML-based HTML (not &lt;a href="http://www.w3.org/TR/xhtml1/"&gt;XHTML&lt;/a&gt;, however).&amp;nbsp; They also contain resources such as icons and, of course, CSS style sheets.&lt;/p&gt; &lt;p&gt;For an example of a Sandcastle presentation style, look no further than the documentation for &lt;a href="http://msdn.microsoft.com/en-us/library/aa187916.aspx"&gt;Visual Studio&lt;/a&gt; and the &lt;a href="http://msdn.microsoft.com/en-us/library/aa139615.aspx"&gt;.NET Framework&lt;/a&gt; on MSDN.&amp;nbsp; The appearance that MSDN uses is similar to the &lt;strong&gt;VS2005&lt;/strong&gt; presentation style in Sandcastle.&amp;nbsp; I believe that Microsoft actually uses a customized version to build their internal documentation, even for Visual Studio 2008.&amp;nbsp; The other, experimental styles, that ship with Sandcastle are &lt;strong&gt;Prototype&lt;/strong&gt; and &lt;strong&gt;Hana&lt;/strong&gt;.&lt;/p&gt; &lt;p&gt;For more information about Sandcastle, see my &lt;a title="Sandcastle Help" href="http://www.codeplex.com/DocProject/Wiki/View.aspx?title=Sandcastle+Help"&gt;Sandcastle Help&lt;/a&gt; article on CodePlex.&lt;/p&gt; &lt;h5&gt;From XML Documentation Comments to Reference Documentation&lt;/h5&gt; &lt;p&gt;So the process is actually quite simple.&amp;nbsp; As developers we can easily document our source code using XML documentation, which allows us to concentrate more on writing the content instead of having to worry about formatting it with HTML.&amp;nbsp; When we build our project, the compiler will produce an XML documentation file that can be passed to Sandcastle, which then inspects our assemblies and automatically generates reference documentation that includes the comments that we added to our source code, but in a pretty HTML/CSS-based style that looks very similar to MSDN.&amp;nbsp; Nice!&lt;/p&gt; &lt;h4&gt;User Documentation&lt;/h4&gt; &lt;p&gt;Sandcastle can automatically generate reference documentation that is useful to other developers, but what about user documentation?&amp;nbsp; I mean things like How To, Sample, Walk-through, Overview, etc. - stuff that an end-user would want to have.&amp;nbsp; Well don't expect Sandcastle to know what you're thinking - we still, unfortunately, have to get concepts out of our heads and into help topics manually.&amp;nbsp; (At least for the time being, until someone invents &lt;a href="http://en.wikipedia.org/wiki/HAL_9000"&gt;HAL&lt;/a&gt; ;)&lt;/p&gt; &lt;p&gt;&lt;strong&gt;Conceptual documentation &lt;/strong&gt;(how Sandcastle refers to user documentation) is often much harder to write than XML documentation comments since it requires a more in-depth understanding of the application being documented.&amp;nbsp; It's easy to look at the source code, notice that an exception is being thrown and then add an &lt;strong&gt;exception &lt;/strong&gt;element to the XML documentation comments for that API.&amp;nbsp; Or to notice that a particular algorithm is being used and to add a comment in the &lt;strong&gt;remarks &lt;/strong&gt;element that mentions it.&amp;nbsp; But to understand and be able to express the purpose of different user interface (UI) elements, how to perform various UI-related tasks, and how the individual APIs and components fit into the designs of other high-level processes in an enterprise-level application, is certainly more difficult and typically requires an understanding of many different aspects of the application.&amp;nbsp; So the bigger the application the harder it is to write conceptual documentation, and not just because it's more time consuming but also because it's more complex.&lt;/p&gt; &lt;p&gt;So if writing conceptual documentation can be more time consuming and harder to accomplish than writing XML documentation comments, why do people still insist on writing conceptual documentation in HTML?&amp;nbsp; Maybe the advantages of XML documentation comments can be applied to conceptual documentation as well.&lt;/p&gt; &lt;h4&gt;The Perils of Writing HTML Help&lt;/h4&gt; &lt;p&gt;I started this post by pointing out one very common way of writing help: raw HTML.&amp;nbsp; We've all done it, and I know that each time I do I end up reinventing the wheel all over again.&amp;nbsp; A new HTML layout, CSS styles, some new and strange way of cross-referencing, JavaScript for collapsible sections, etc., must all be redeveloped.&amp;nbsp; (Yea, some companies are too cheap to buy a tool that does this automatically - and so am I. :)&lt;/p&gt; &lt;p&gt;Creating a new help topic starts with copying an existing HTML file that is used as a template, of which there's usually only one kind containing a header, with style sheet links and scripts, a body that's empty, and a footer.&amp;nbsp; Writing a help topic requires having to look through the other topics quite often to find out which HTML tags and CSS class names I should be using for various styles.&amp;nbsp; This is especially annoying when I have a good idea that I simply want to put down quickly and be done with it.&amp;nbsp; Uh oh, that hyperlink to an HTML topic that I've been copying and pasting throughout my documentation is actually misspelled - time to do a search and replace.&amp;nbsp; Hmm, I'm not sure that I like the format that I've been using for laying out tables - oh well, it's not worth the effort to fix it now.&lt;/p&gt; &lt;h5&gt;Is There a Better Way?&lt;/h5&gt; &lt;p&gt;Technical writers, I can only assume, take help authoring more seriously than that.&amp;nbsp; They get paid to worry about things such as structure, readability and maintenance, so it shouldn't surprise us to know that there's a much better way to write help than simply using raw HTML.&amp;nbsp; As developers, we could probably learn a thing or two from them when writing our own documentation, whether it's for an API or conceptual topics.&lt;/p&gt; &lt;p&gt;Lucky for us, Microsoft has a huge library of documentation and employs &lt;a href="http://forums.microsoft.com/MSDN/ShowPost.aspx?PostID=946211&amp;amp;SiteID=1"&gt;technical writers&lt;/a&gt; to write their "official" help, which is then published to the web on &lt;a href="http://msdn.microsoft.com/library/"&gt;MSDN&lt;/a&gt;.&amp;nbsp; (Sorry about that horrible reference for technical writers, but I couldn't find anything better.&amp;nbsp; I know that I've seen someone from Microsoft, probably &lt;a href="http://blogs.msdn.com/sandcastle"&gt;Anand&lt;/a&gt;, state that they don't use developer code comments internally and instead have professional authors write it.)&amp;nbsp; This means that over the years they've had to come up with a solution that makes authoring help manageable, which is a huge task for such a large documentation set.&amp;nbsp; They also needed a way to manage file names and links for cross-referencing help topics (think, &lt;em&gt;See Also&lt;/em&gt; section).&amp;nbsp; Since the look and feel of MSDN changes from time to time, the ability to write documentation that is absolutely independent of any one style or format was imperative as well.&lt;/p&gt; &lt;p&gt;So we have an invaluable example to which we can aspire.&amp;nbsp; A whole plethora of documentation written with clarity and precision using standardized techniques.&amp;nbsp; If you take a look at the documentation on MSDN, you should see a crisp and clean style that, when compared to your raw HTML help topics, probably looks far more professional.&amp;nbsp; This is nothing new to us though - we've been referencing it for quite a long time now as .NET developers.&amp;nbsp; Many people, predating .NET, have even watched MSDN documentation improve dramatically over the years, and most developers that need to write their own documentation seem to want to reproduce the same look and feel.&amp;nbsp; Many tools have even helped us to generate reasonable facsimiles in the past (such as NDoc).&lt;/p&gt; &lt;p&gt;But have we finally come to the point where we can write our own help topics without having to remember abstract HTML tags and CSS class names?&amp;nbsp; Can it be transformed automatically into documentation that looks the same as MSDN, or any other style for that matter?&amp;nbsp; Is there a way to simply specify a unique identifier for another topic and have hyperlinks generated automatically?&amp;nbsp; What about linking to reference topics?&amp;nbsp; Is there a way to ensure that topics of a similar nature will all share the same exact structure?&lt;/p&gt; &lt;p&gt;The answer to all of these questions, of course, is yes.&amp;nbsp; (But wouldn't it be funny if it was no?&amp;nbsp; I'd probably take a nap.)&lt;/p&gt; &lt;h4&gt;Microsoft Assistance Markup Language (MAML)&lt;/h4&gt; &lt;p&gt;Microsoft uses Sandcastle internally to generate help topics for the .NET Framework, so it's no wonder that Sandcastle also provides a way to apply structured authoring techniques to conceptual documentation, in much the same way that XML documentation comments are used by developers to write reference documentation.&amp;nbsp; In Sandcastle, conceptual topics are written in &lt;a title="Sandcastle Help" href="http://www.codeplex.com/DocProject/Wiki/View.aspx?title=Sandcastle+Help#MAML"&gt;MAML&lt;/a&gt;.&lt;/p&gt; &lt;p&gt;MAML is an XML schema that defines various high-level document types, such as How To, Walkthrough, Sample, Glossary, Whitepaper, Troubleshooting and many others.&amp;nbsp; These document types provide the &lt;em&gt;structure&lt;/em&gt; of a help topic, which doesn't change.&amp;nbsp; What &lt;em&gt;can&lt;/em&gt; change though, is how Sandcastle presents this structure when it generates HTML topics.&amp;nbsp; This means that, for example, the markup in all of your &lt;em&gt;How To &lt;/em&gt;topics will look similar, regardless of the presentation style that you choose.&amp;nbsp; As a matter of fact, the markup in &lt;em&gt;your &lt;/em&gt;How To topics will be similar to &lt;em&gt;mine&lt;/em&gt;, even if we choose to produce HTML help output in very different styles.&lt;/p&gt; &lt;p&gt;The schema also defines various XML elements that mark up text using a &lt;em&gt;semantic&lt;/em&gt; approach.&amp;nbsp; For example, the &lt;strong&gt;ui &lt;/strong&gt;tag is applied to text that corresponds to a user interface element, such as the text on a button.&amp;nbsp; Another example is &lt;strong&gt;alert&lt;/strong&gt;, which also requires an attribute named, &lt;strong&gt;class&lt;/strong&gt; that indicates the type of alert, such as note, caution, tip, warning, and others.&amp;nbsp; Another is &lt;strong&gt;country&lt;/strong&gt;, which you may have already guessed, describes a country!&amp;nbsp; You would surround text with an &lt;strong&gt;application &lt;/strong&gt;element when it represents the name of an application.&amp;nbsp; I think you get the idea...&amp;nbsp; By my count there's well over 40 elements that you can choose from.&amp;nbsp;&amp;nbsp; And with Visual Studio's XML editor you can actually have IntelliSense tell you what they all are and where it's appropriate, within the topic's &lt;em&gt;structure&lt;/em&gt;, to use them.&lt;/p&gt; &lt;p&gt;The beauty of all this is that the Sandcastle presentation style that you choose controls the HTML layout of the MAML document type used by your topic.&amp;nbsp; It also defines how all of the MAML elements will appear in the HTML.&amp;nbsp; For example, &lt;em&gt;alert&lt;/em&gt; is transformed into an HTML table layout, while &lt;em&gt;ui &lt;/em&gt;and &lt;em&gt;application&lt;/em&gt; are simply bolded.&amp;nbsp; Special formatting is not actually applied to text that is specified as being the name of a &lt;em&gt;country&lt;/em&gt;, but you could update the transformation to change the HTML markup or possibly just add a CSS rule to apply the formatting that you want, without having to update the actual topic itself.&lt;/p&gt; &lt;h5&gt;A MAML Example&lt;/h5&gt; &lt;p&gt;Here's a small portion of the &lt;strong&gt;Glossary&lt;/strong&gt; help topic that I've written for my &lt;a title="Auto-Input Protection (AIP) on CodePlex" href="http://www.codeplex.com/AIP"&gt;Auto-Input Protection (AIP)&lt;/a&gt; project.&lt;/p&gt;&lt;pre class="code"&gt;&lt;span&gt;&amp;lt;?&lt;/span&gt;&lt;span&gt;xml&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;version&lt;/span&gt;&lt;span&gt;=&lt;/span&gt;"&lt;span&gt;1.0&lt;/span&gt;"&lt;span&gt; &lt;/span&gt;&lt;span&gt;encoding&lt;/span&gt;&lt;span&gt;=&lt;/span&gt;"&lt;span&gt;utf-8&lt;/span&gt;"&lt;span&gt;?&amp;gt;
&amp;lt;&lt;/span&gt;&lt;span&gt;topic&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;id&lt;/span&gt;&lt;span&gt;=&lt;/span&gt;"&lt;span&gt;14790228-f45b-42d5-9b3e-f6b4ab932b9e&lt;/span&gt;"&lt;span&gt; &lt;/span&gt;&lt;span&gt;revisionNumber&lt;/span&gt;&lt;span&gt;=&lt;/span&gt;"&lt;span&gt;0&lt;/span&gt;"&lt;span&gt;&amp;gt;
  &amp;lt;&lt;/span&gt;&lt;span&gt;developerGlossaryDocument&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;xmlns&lt;/span&gt;&lt;span&gt;=&lt;/span&gt;"&lt;span&gt;http://ddue.schemas.microsoft.com/authoring/2003/5&lt;/span&gt;"&lt;span&gt; 
                             &lt;/span&gt;&lt;span&gt;xmlns:xlink&lt;/span&gt;&lt;span&gt;=&lt;/span&gt;"&lt;span&gt;http://www.w3.org/1999/xlink&lt;/span&gt;"&lt;span&gt;&amp;gt;
    &amp;lt;&lt;/span&gt;&lt;span&gt;glossary&lt;/span&gt;&lt;span&gt;&amp;gt;
      &amp;lt;&lt;/span&gt;&lt;span&gt;title&lt;/span&gt;&lt;span&gt;&amp;gt;&lt;/span&gt;Glossary&lt;span&gt;&amp;lt;/&lt;/span&gt;&lt;span&gt;title&lt;/span&gt;&lt;span&gt;&amp;gt;
      &amp;lt;&lt;/span&gt;&lt;span&gt;glossaryEntry&lt;/span&gt;&lt;span&gt;&amp;gt;
        &amp;lt;&lt;/span&gt;&lt;span&gt;terms&lt;/span&gt;&lt;span&gt;&amp;gt;
          &amp;lt;&lt;/span&gt;&lt;span&gt;term&lt;/span&gt;&lt;span&gt;&amp;gt;&lt;/span&gt;AIP&lt;span&gt;&amp;lt;/&lt;/span&gt;&lt;span&gt;term&lt;/span&gt;&lt;span&gt;&amp;gt;
        &amp;lt;/&lt;/span&gt;&lt;span&gt;terms&lt;/span&gt;&lt;span&gt;&amp;gt;
        &amp;lt;&lt;/span&gt;&lt;span&gt;definition&lt;/span&gt;&lt;span&gt;&amp;gt;
          &amp;lt;&lt;/span&gt;&lt;span&gt;para&lt;/span&gt;&lt;span&gt;&amp;gt;
&lt;/span&gt;            An acronym that stands for Auto-Input Protection.
&lt;span&gt;          &amp;lt;/&lt;/span&gt;&lt;span&gt;para&lt;/span&gt;&lt;span&gt;&amp;gt;
        &amp;lt;/&lt;/span&gt;&lt;span&gt;definition&lt;/span&gt;&lt;span&gt;&amp;gt;
      &amp;lt;/&lt;/span&gt;&lt;span&gt;glossaryEntry&lt;/span&gt;&lt;span&gt;&amp;gt;
      &amp;lt;&lt;/span&gt;&lt;span&gt;glossaryEntry&lt;/span&gt;&lt;span&gt;&amp;gt;
        &amp;lt;&lt;/span&gt;&lt;span&gt;terms&lt;/span&gt;&lt;span&gt;&amp;gt;
          &amp;lt;&lt;/span&gt;&lt;span&gt;term&lt;/span&gt;&lt;span&gt;&amp;gt;&lt;/span&gt;Answer&lt;span&gt;&amp;lt;/&lt;/span&gt;&lt;span&gt;term&lt;/span&gt;&lt;span&gt;&amp;gt;
        &amp;lt;/&lt;/span&gt;&lt;span&gt;terms&lt;/span&gt;&lt;span&gt;&amp;gt;
        &amp;lt;&lt;/span&gt;&lt;span&gt;definition&lt;/span&gt;&lt;span&gt;&amp;gt;
          &amp;lt;&lt;/span&gt;&lt;span&gt;para&lt;/span&gt;&lt;span&gt;&amp;gt;
&lt;/span&gt;            A user's or bot's response to a challenge.  In AIP, the correct answer is a 
            string of text that matches the text on the CAPTCHA image.  An incorrect 
            answer does not match.
&lt;span&gt;          &amp;lt;/&lt;/span&gt;&lt;span&gt;para&lt;/span&gt;&lt;span&gt;&amp;gt;
        &amp;lt;/&lt;/span&gt;&lt;span&gt;definition&lt;/span&gt;&lt;span&gt;&amp;gt;
      &amp;lt;/&lt;/span&gt;&lt;span&gt;glossaryEntry&lt;/span&gt;&lt;span&gt;&amp;gt;
      &amp;lt;&lt;/span&gt;&lt;span&gt;glossaryEntry&lt;/span&gt;&lt;span&gt;&amp;gt;
        &amp;lt;&lt;/span&gt;&lt;span&gt;terms&lt;/span&gt;&lt;span&gt;&amp;gt;
          &amp;lt;&lt;/span&gt;&lt;span&gt;term&lt;/span&gt;&lt;span&gt;&amp;gt;&lt;/span&gt;CAPTCHA&lt;span&gt;&amp;lt;/&lt;/span&gt;&lt;span&gt;term&lt;/span&gt;&lt;span&gt;&amp;gt;
        &amp;lt;/&lt;/span&gt;&lt;span&gt;terms&lt;/span&gt;&lt;span&gt;&amp;gt;
        &amp;lt;&lt;/span&gt;&lt;span&gt;definition&lt;/span&gt;&lt;span&gt;&amp;gt;
          &amp;lt;&lt;/span&gt;&lt;span&gt;para&lt;/span&gt;&lt;span&gt;&amp;gt;
&lt;/span&gt;            An acronym that stands for Completely Automated Public Turing test to tell 
            Computers and Humans Apart, trademarked by Carnegie Mellon University according 
            to the following article: &lt;span&gt;&amp;lt;&lt;/span&gt;&lt;span&gt;externalLink&lt;/span&gt;&lt;span&gt;&amp;gt;
              &amp;lt;&lt;/span&gt;&lt;span&gt;linkText&lt;/span&gt;&lt;span&gt;&amp;gt;&lt;/span&gt;CAPTCHA. (2008, March 26).&lt;span&gt;&amp;lt;/&lt;/span&gt;&lt;span&gt;linkText&lt;/span&gt;&lt;span&gt;&amp;gt;
              &amp;lt;&lt;/span&gt;&lt;span&gt;linkUri&lt;/span&gt;&lt;span&gt;&amp;gt;&lt;/span&gt;http://en.wikipedia.org/w/index.php?title=CAPTCHA&lt;span&gt;&amp;amp;amp;&lt;/span&gt;oldid=201120981&lt;span&gt;&amp;lt;/&lt;/span&gt;&lt;span&gt;linkUri&lt;/span&gt;&lt;span&gt;&amp;gt;
            &amp;lt;/&lt;/span&gt;&lt;span&gt;externalLink&lt;/span&gt;&lt;span&gt;&amp;gt;&lt;/span&gt; In Wikipedia, The Free Encyclopedia. Retrieved 09:01, March 27, 2008.
&lt;span&gt;          &amp;lt;/&lt;/span&gt;&lt;span&gt;para&lt;/span&gt;&lt;span&gt;&amp;gt;
        &amp;lt;/&lt;/span&gt;&lt;span&gt;definition&lt;/span&gt;&lt;span&gt;&amp;gt;
      &amp;lt;/&lt;/span&gt;&lt;span&gt;glossaryEntry&lt;/span&gt;&lt;span&gt;&amp;gt;
      &amp;lt;&lt;/span&gt;&lt;span&gt;glossaryEntry&lt;/span&gt;&lt;span&gt;&amp;gt;
        &amp;lt;&lt;/span&gt;&lt;span&gt;terms&lt;/span&gt;&lt;span&gt;&amp;gt;
          &amp;lt;&lt;/span&gt;&lt;span&gt;term&lt;/span&gt;&lt;span&gt;&amp;gt;&lt;/span&gt;Challenge&lt;span&gt;&amp;lt;/&lt;/span&gt;&lt;span&gt;term&lt;/span&gt;&lt;span&gt;&amp;gt;
          &amp;lt;&lt;/span&gt;&lt;span&gt;term&lt;/span&gt;&lt;span&gt;&amp;gt;&lt;/span&gt;Test&lt;span&gt;&amp;lt;/&lt;/span&gt;&lt;span&gt;term&lt;/span&gt;&lt;span&gt;&amp;gt;
        &amp;lt;/&lt;/span&gt;&lt;span&gt;terms&lt;/span&gt;&lt;span&gt;&amp;gt;
        &amp;lt;&lt;/span&gt;&lt;span&gt;definition&lt;/span&gt;&lt;span&gt;&amp;gt;
          &amp;lt;&lt;/span&gt;&lt;span&gt;para&lt;/span&gt;&lt;span&gt;&amp;gt;
&lt;/span&gt;            A CAPTCHA image, being displayed on a web page, to which a user must respond 
            with an answer by entering the text that they see on the image.  The result 
            is pass or fail.
&lt;span&gt;          &amp;lt;/&lt;/span&gt;&lt;span&gt;para&lt;/span&gt;&lt;span&gt;&amp;gt;
        &amp;lt;/&lt;/span&gt;&lt;span&gt;definition&lt;/span&gt;&lt;span&gt;&amp;gt;
      &amp;lt;/&lt;/span&gt;&lt;span&gt;glossaryEntry&lt;/span&gt;&lt;span&gt;&amp;gt;
    &amp;lt;/&lt;/span&gt;&lt;span&gt;glossary&lt;/span&gt;&lt;span&gt;&amp;gt;
  &amp;lt;/&lt;/span&gt;&lt;span&gt;developerGlossaryDocument&lt;/span&gt;&lt;span&gt;&amp;gt;
&amp;lt;/&lt;/span&gt;&lt;span&gt;topic&lt;/span&gt;&lt;span&gt;&amp;gt;&lt;/span&gt;&lt;/pre&gt;
&lt;p&gt;The following image shows the results of the glossary transformation into HTML, built by &lt;a title="DocProject on CodePlex" href="http://www.codeplex.com/DocProject"&gt;DocProject&lt;/a&gt; (a tool that I've written to automate Sandcastle inside Visual Studio).&amp;nbsp; The &lt;strong&gt;VS2005 &lt;/strong&gt;presentation style was used for this example.&lt;/p&gt;
&lt;p&gt;&lt;img style="border-top-width:0px;border-left-width:0px;border-bottom-width:0px;margin:0px;border-right-width:0px;" height="565" alt="image" src="http://davesexton.com/Images/Blog/MAMLMigration_2DB9/image.png" width="620" border="0"&gt; &lt;/p&gt;
&lt;p&gt;And now here's the same exact topic file after being transformed into HTML using the &lt;strong&gt;Hana &lt;/strong&gt;presentation style.&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;img style="border-top-width:0px;border-left-width:0px;border-bottom-width:0px;margin:0px;border-right-width:0px;" height="566" alt="image" src="http://davesexton.com/Images/Blog/MAMLMigration_2DB9/image_3.png" width="620" border="0"&gt; &lt;/p&gt;
&lt;p&gt;There are a few things to point out about all of this.&lt;/p&gt;
&lt;p&gt;First of all, notice that the topic that I've written only uses some very basic XML, yet the output obviously contains additional layout and style, which differs depending upon the presentation style that I've chosen.&amp;nbsp; In the Hana version I've even left in the default header that warns about pre-release documentation.&lt;/p&gt;
&lt;p&gt;You may have also noticed the letter bar and the individual letter sub headers.&amp;nbsp; Where'd they come from?&amp;nbsp; These features are not actually part of Sandcastle, but Eric Woodruff and I have added them to the presentation styles by modifying the XSL transformations that convert the MAML Glossary document type into HTML.&amp;nbsp; The additional behavior automatically detects the glossary &lt;em&gt;terms&lt;/em&gt; in the topic and creates the letter bar and headers dynamically.&amp;nbsp; All of the terms are sorted alphabetically as well (although it's not obvious in my example because they're already in alphabetical order in my topic file).&lt;/p&gt;
&lt;p&gt;Pretty cool, right?&amp;nbsp; You'll be able to get these Glossary updates from the new &lt;a href="http://www.codeplex.com/SandcastleStyles"&gt;Sandcastle Styles&lt;/a&gt; project on CodePlex, which should go public within a few days after the next Sandcastle release.&amp;nbsp; This project was &lt;a href="http://www.codeplex.com/Sandcastle/Thread/View.aspx?ThreadId=27749"&gt;started&lt;/a&gt; by Paul Selormey, Eric Woodruff and myself.&amp;nbsp; In the last week we've been diligently working on preparations for our first release, so please check it out when we go live and let us know what you think :)&lt;/p&gt;
&lt;h5&gt;Linking in MAML&lt;/h5&gt;
&lt;p&gt;The last thing that I want to point out about the previous example is that it contains a hyperlink to an external web site.&amp;nbsp; As you can see from my topic, MAML supports an &lt;strong&gt;externalLink&lt;/strong&gt; element that accepts text in a &lt;strong&gt;linkText&lt;/strong&gt; element and a URI in a &lt;strong&gt;linkUri&lt;/strong&gt; element.&amp;nbsp; It also accepts alternate text in a &lt;strong&gt;linkAlternateText&lt;/strong&gt; element, but that's optional.&lt;/p&gt;
&lt;p&gt;Instead of linking to external URIs, you can also link to any of the other topics being documented.&amp;nbsp; To do that you would use a very simplified version of the &lt;a href="http://www.w3.org/TR/xlink/"&gt;XLink&lt;/a&gt; specification on a &lt;strong&gt;link&lt;/strong&gt; element, as in the following example: &lt;/p&gt;&lt;pre class="code"&gt;&lt;span&gt;&amp;lt;&lt;/span&gt;&lt;span&gt;link&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;xlink:href&lt;/span&gt;&lt;span&gt;=&lt;/span&gt;"&lt;span&gt;37852294-410f-4bb2-9008-c5fa9dfb4347&lt;/span&gt;"&lt;span&gt;&amp;gt;&lt;/span&gt;Part II&lt;span&gt;&amp;lt;/&lt;/span&gt;&lt;span&gt;link&lt;/span&gt;&lt;span&gt;&amp;gt;&lt;/span&gt;&lt;/pre&gt;&lt;a href="http://11011.net/software/vspaste"&gt;&lt;/a&gt;
&lt;p&gt;Right, topics are identified by GUIDs.&amp;nbsp; Currently, Sandcastle also requires that all conceptual topic files are named with a GUID and an .xml extension.&amp;nbsp; A bit annoying at first, but if you use DocProject it provides a &lt;strong&gt;Topic Explorer &lt;/strong&gt;tool window that makes it easy to find the topic that you're looking for without having to open all of them :)&lt;/p&gt;
&lt;p&gt;Notice that in my example the value in the &lt;strong&gt;href &lt;/strong&gt;does not have an .xml file extension specified.&amp;nbsp; That's because &lt;strong&gt;link &lt;/strong&gt;doesn't reference files, it references &lt;em&gt;topics&lt;/em&gt;.&amp;nbsp; This is important to realize because it's not the same as the way linking works in HTML - this is actually dynamic.&amp;nbsp; If Sandcastle cannot find a topic that is associated with the specified GUID, then it doesn't generate a hyperlink at all.&lt;/p&gt;
&lt;p&gt;This is a bit different from what we're used to in HTML, which allows us to link to anything under the sun using only one tag: &lt;strong&gt;a&lt;/strong&gt;.&amp;nbsp; So why such weirdness in MAML?&amp;nbsp; I think the answer to that question is actually quite simple, although for some reason it's easy to miss when first starting out with MAML.&amp;nbsp; The MAML schema defines elements that apply structure and semantics to text, instead of format and style, like HTML.&amp;nbsp; For this reason, you wouldn't see a tag named simply, &lt;em&gt;a &lt;/em&gt;in MAML because it's not descriptive at all.&amp;nbsp; &lt;strong&gt;Link&lt;/strong&gt;, on the other hand, is very descriptive.&amp;nbsp; And since an HTML anchor is meant to provide the source point of a diametric link, its use is actually more limited than XLink.&amp;nbsp; The XLink specification actually provides a way to establish relationships between &lt;em&gt;one or more&lt;/em&gt; resources (at least that's my interpretation of it), which would offer much more flexibility.&amp;nbsp; So MAML provides a mechanism to link to other &lt;em&gt;topics&lt;/em&gt;, not just external URIs, and the XLink implementation provides an explicit way to describe links as being special - they must be processed by Sandcastle.&amp;nbsp; Currently, Sandcastle doesn't actually seem to use any of XLink's features though aside from what has been deemed as "simple" usage, but maybe that'll change in the future.&lt;/p&gt;
&lt;p&gt;But that's not all.&amp;nbsp; If you want to create a link to an API in your &lt;em&gt;reference &lt;/em&gt;documentation, you would use the &lt;strong&gt;codeEntityReference&lt;/strong&gt; element instead.&amp;nbsp; Yikes!&amp;nbsp; So now we've got yet another way to link.&amp;nbsp; But again, keep in mind that MAML is much more expressive than HTML, and that's why we've got different tags for linking to different things.&amp;nbsp; The benefit being that our intentions are clear when we write our topics so that different styles of linking can be handled differently.&lt;/p&gt;
&lt;p&gt;The following XML snippet illustrates all three approaches to linking in MAML topics.&amp;nbsp; Each example is a child of the &lt;strong&gt;relatedTopics&lt;/strong&gt; element, which, in the Sandcastle world, will eventually become your topic's &lt;strong&gt;See Also&lt;/strong&gt; section.&lt;/p&gt;&lt;pre class="code"&gt;&lt;span&gt;&amp;lt;&lt;/span&gt;&lt;span&gt;relatedTopics&lt;/span&gt;&lt;span&gt;&amp;gt;
  &amp;lt;&lt;/span&gt;&lt;span&gt;codeEntityReference&lt;/span&gt;&lt;span&gt;&amp;gt;&lt;/span&gt;T:MyNamespace.MyClass&lt;span&gt;&amp;lt;/&lt;/span&gt;&lt;span&gt;codeEntityReference&lt;/span&gt;&lt;span&gt;&amp;gt;
  &amp;lt;&lt;/span&gt;&lt;span&gt;codeEntityReference&lt;/span&gt;&lt;span&gt;&amp;gt;&lt;/span&gt;P:MyNamespace.MyClass.MyProp&lt;span&gt;&amp;lt;/&lt;/span&gt;&lt;span&gt;codeEntityReference&lt;/span&gt;&lt;span&gt;&amp;gt;
  &amp;lt;&lt;/span&gt;&lt;span&gt;codeEntityReference&lt;/span&gt;&lt;span&gt;&amp;gt;&lt;/span&gt;M:System.IO.File.OpenText(System.String)&lt;span&gt;&amp;lt;/&lt;/span&gt;&lt;span&gt;codeEntityReference&lt;/span&gt;&lt;span&gt;&amp;gt;
  &amp;lt;&lt;/span&gt;&lt;span&gt;externalLink&lt;/span&gt;&lt;span&gt;&amp;gt;
    &amp;lt;&lt;/span&gt;&lt;span&gt;linkText&lt;/span&gt;&lt;span&gt;&amp;gt;&lt;/span&gt;DocProject&lt;span&gt;&amp;lt;/&lt;/span&gt;&lt;span&gt;linkText&lt;/span&gt;&lt;span&gt;&amp;gt;
    &amp;lt;&lt;/span&gt;&lt;span&gt;linkUri&lt;/span&gt;&lt;span&gt;&amp;gt;&lt;/span&gt;http://www.codeplex.com/DocProject&lt;span&gt;&amp;lt;/&lt;/span&gt;&lt;span&gt;linkUri&lt;/span&gt;&lt;span&gt;&amp;gt;
  &amp;lt;/&lt;/span&gt;&lt;span&gt;externalLink&lt;/span&gt;&lt;span&gt;&amp;gt;
  &amp;lt;&lt;/span&gt;&lt;span&gt;link&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;xref&lt;/span&gt;&lt;span&gt;=&lt;/span&gt;"&lt;span&gt;home&lt;/span&gt;"&lt;span&gt;&amp;gt;&lt;/span&gt;My Home Page&lt;span&gt;&amp;lt;/&lt;/span&gt;&lt;span&gt;link&lt;/span&gt;&lt;span&gt;&amp;gt;
  &amp;lt;&lt;/span&gt;&lt;span&gt;link&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;xref&lt;/span&gt;&lt;span&gt;=&lt;/span&gt;"&lt;span&gt;Contact Us&lt;/span&gt;"&lt;span&gt;/&amp;gt;
  &amp;lt;&lt;/span&gt;&lt;span&gt;link&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;vref&lt;/span&gt;&lt;span&gt;=&lt;/span&gt;"&lt;span&gt;/related.aspx&lt;/span&gt;"&lt;span&gt;&amp;gt;&lt;/span&gt;Related web page&lt;span&gt;&amp;lt;/&lt;/span&gt;&lt;span&gt;link&lt;/span&gt;&lt;span&gt;&amp;gt;
  &amp;lt;&lt;/span&gt;&lt;span&gt;link&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;xlink:href&lt;/span&gt;&lt;span&gt;=&lt;/span&gt;"&lt;span&gt;14790228-f45b-42d5-9b3e-f6b4ab932b9e&lt;/span&gt;"&lt;span&gt;&amp;gt;&lt;/span&gt;Part II&lt;span&gt;&amp;lt;/&lt;/span&gt;&lt;span&gt;link&lt;/span&gt;&lt;span&gt;&amp;gt;
&amp;lt;/&lt;/span&gt;&lt;span&gt;relatedTopics&lt;/span&gt;&lt;span&gt;&amp;gt;&lt;/span&gt;&lt;/pre&gt;&lt;a href="http://11011.net/software/vspaste"&gt;&lt;/a&gt;
&lt;p&gt;Notice that there are also two more link types in the example above that I didn't mention previously: &lt;strong&gt;link &lt;/strong&gt;elements with &lt;strong&gt;xref &lt;/strong&gt;and &lt;strong&gt;vref &lt;/strong&gt;attributes.&amp;nbsp; This type of linking is used instead of &lt;strong&gt;externalLink&lt;/strong&gt; so that only an ID must be specified instead of an entire URL.&amp;nbsp; The ID is part of an ID-to-URL mapping that is configured elsewhere.&amp;nbsp; This feature is not actually part of Sandcastle though; it's provided by a custom build component that I've written which, for the next release of DocProject, has been modified to support conceptual builds as well.&amp;nbsp; The component is called &lt;a href="http://davesexton.com/blog/blogs/blog/archive/2008/02/27/resolveexternallinkscomponent.aspx"&gt;ResolveExternalLinksComponent&lt;/a&gt; and it's available as a separate download or as part of DocProject.&amp;nbsp; Without this build component &lt;em&gt;xref &lt;/em&gt;and &lt;em&gt;vref &lt;/em&gt;do nothing.&lt;/p&gt;
&lt;h4&gt;Conclusion&lt;/h4&gt;
&lt;p&gt;HTML is out.&amp;nbsp; MAML is in.&lt;/p&gt;
&lt;p&gt;Well, it's not actually as substantial of a change as I'm implying - HTML is still being used extensively as the final output for compiling help; however, we no longer have to &lt;em&gt;author &lt;/em&gt;help topics in HTML, which is a huge benefit.&lt;/p&gt;
&lt;p&gt;So all this stuff might seem really wonderful in print, but I feel that I must warn you: It actually took me a few weeks before I finally started to get rid of that itch to lace my topics with bold and italic phrases where it didn't actually add any value.&amp;nbsp; When you first start writing MAML it can feel very restrictive, and it is compared to HTML in terms of how &lt;em&gt;quickly &lt;/em&gt;you can apply new styles, since to do that you have to leave the actual topic and modify files in the Sandcastle presentation; but it's actually much more &lt;em&gt;expressive&lt;/em&gt; in terms of describing information and that's what we should be concentrating on when we write help topics - the information.&lt;/p&gt;
&lt;p&gt;What I've learned from writing topics in MAML is that using elements such as &lt;strong&gt;ui&lt;/strong&gt;, &lt;strong&gt;userInput&lt;/strong&gt;, &lt;strong&gt;math, &lt;/strong&gt;&lt;strong&gt;date&lt;/strong&gt;, and many others, as well as &lt;strong&gt;externalLink, &lt;/strong&gt;&lt;strong&gt;codeEntityReference &lt;/strong&gt;and &lt;strong&gt;link &lt;/strong&gt;for linking, ultimately accomplish the same thing as HTML but in a much better way - no more CSS class names to remember or abstract HTML tags like &lt;strong&gt;b &lt;/strong&gt;and &lt;strong&gt;i &lt;/strong&gt;(or &lt;strong&gt;strong &lt;/strong&gt;and &lt;strong&gt;em&lt;/strong&gt; too).&amp;nbsp; Instead, I can specify exactly &lt;em&gt;what &lt;/em&gt;a phrase represents and continue writing.&amp;nbsp; The format and style is already defined for me by the presentation style that I choose, even if I haven't chosen it yet!&amp;nbsp; However, if I've already chosen one that mostly fits my needs but I'm not happy with a particular style, I can apply some HTML and CSS to the different MAML elements without having to update anything in the topics themselves.&amp;nbsp; By reusing the same common tags throughout my documentation, it looks much more professional, it's easier to manage and it's even portable since it's all XML, so if in the future I want to generate &lt;a href="http://office.microsoft.com/en-us/products/HA102058151033.aspx"&gt;Open XML&lt;/a&gt; documents instead of HTML, I won't even have to change anything in my topics.&lt;/p&gt;
&lt;p&gt;Note that if you want to convert all of your existing HTML topics to MAML in a batch process, I've got a tool called &lt;a href="http://davesexton.com/blog/blogs/blog/archive/2008/04/20/doctomaml-1-0-beta-is-now-available.aspx"&gt;DocToMaml&lt;/a&gt;.&amp;nbsp; It's currently in beta, but it does work.&amp;nbsp; Any feedback on it will be appreciated :)&lt;/p&gt;
&lt;p&gt;For the next version of &lt;a href="http://davesexton.com/blog/blogs/blog/archive/2008/05/03/docproject-roadmap-part-ii.aspx"&gt;DocProject 2008&lt;/a&gt; (Beta 3) I'm working on a MAML WYSIWYG editor that is integrated into Visual Studio, so keep your eyes open for that.&lt;/p&gt;
&lt;p&gt;If you have any feedback about how MAML and Sandcastle's conceptual build process can be improved please let the Sandcastle team know by submitting a request to the Sandcastle &lt;a href="http://www.codeplex.com/Sandcastle/WorkItem/AdvancedList.aspx"&gt;Issue Tracker&lt;/a&gt; on CodePlex.&lt;/p&gt;&lt;img src="http://davesexton.com/blog/aggbug.aspx?PostID=460" width="1" height="1"&gt;</description><category domain="http://davesexton.com/blog/blogs/blog/archive/tags/.NET/default.aspx">.NET</category><category domain="http://davesexton.com/blog/blogs/blog/archive/tags/Microsoft/default.aspx">Microsoft</category><category domain="http://davesexton.com/blog/blogs/blog/archive/tags/DocProject/default.aspx">DocProject</category><category domain="http://davesexton.com/blog/blogs/blog/archive/tags/documentation/default.aspx">documentation</category><category domain="http://davesexton.com/blog/blogs/blog/archive/tags/MAML/default.aspx">MAML</category></item><item><title>DocProject Roadmap Part II</title><link>http://davesexton.com/blog/blogs/blog/archive/2008/05/03/docproject-roadmap-part-ii.aspx</link><pubDate>Sat, 03 May 2008 19:36:02 GMT</pubDate><guid isPermaLink="false">5b5c6d2b-d071-4bf8-ac28-4f9cd768b39b:447</guid><dc:creator>Dave Sexton</dc:creator><slash:comments>10</slash:comments><description>&lt;p&gt;In my first &lt;a href="http://davesexton.com/blog/blogs/blog/archive/2008/01/17/docproject-roadmap.aspx"&gt;DocProject Roadmap&lt;/a&gt; post I described my preliminary plans for &lt;a title="DocProject on CodePlex" href="http://www.codeplex.com/DocProject"&gt;DocProject&lt;/a&gt; 1.x and later versions.&amp;nbsp; In this post I'm going to discuss the project's current status and some updates to my plans for future versions.&lt;/p&gt; &lt;h4&gt;1.11.0 RC&lt;/h4&gt; &lt;p&gt;DocProject 1.11.0 RC will be deployed within a week after the upcoming Sandcastle release.&amp;nbsp; It contains several new features and bug fixes, and also a few breaking changes that I'll be sure to mention on the release page.&lt;/p&gt; &lt;p&gt;I expect a few changes to Sandcastle that may prompt the addition of a few new features to DocProject before the next release (e.g., support for Help 1.x and Help 2.x project management and, possibly, the ability to include raw HTML topics using &lt;strong&gt;Topic Explorer&lt;/strong&gt;), but since I can't start working on them until Sandcastle is released, there's obviously going to be a delay.&lt;/p&gt; &lt;p&gt;A week should be more than enough time though since I've taken some time off from paid employment to work on my open source projects - a sacrifice that I can barely afford, but working on my own projects is more fun than writing line of business apps and I just couldn't resist after losing my only client anyway (they lost their biggest client first and had to suspend my services, maybe indefinitely).&lt;/p&gt; &lt;h5&gt;Universal Installer&lt;/h5&gt; &lt;p&gt;The next version of DocProject, 1.11.0 RC, can install DocProject for Visual Studio 2005 and 2008 simultaneously, including all supported Express editions.&amp;nbsp; The code base for DocProject 1.x and DocProject 2008 are now identical and as a result DocProject 2008 now uses the 1.x assemblies.&lt;/p&gt; &lt;h5&gt;Ending Phase I&lt;/h5&gt; &lt;p&gt;I've done a lot of refactoring in 1.11.0 RC, but I still plan to deploy it as the final release candidate (RC) for DocProject 1.x, with compiler optimizations enabled and without any debug symbol databases (.pdb).&lt;/p&gt; &lt;p&gt;Feedback is a must in this release so that I can iron out showstoppers and maybe even add some mission-critical features that people have been waiting for.&amp;nbsp; If you're a fan of DocProject and you use VS 2005 then now would be the time to get in your suggestions for DocProject 1.x since most of my focus in the next phase of development is going to be on Visual Studio 2008.&lt;/p&gt; &lt;p&gt;Unfortunately I didn't get to add some of the features to 1.11.0 RC as I had planned, but they may be added to 1.12.0 or, more likely, DocProject 2008 Beta 3.&lt;/p&gt; &lt;h4&gt;First Production Release&lt;/h4&gt; &lt;p&gt;I still expect &lt;strong&gt;1.12.0&lt;/strong&gt; to be the first production release of DocProject, but now it will target both Visual Studio 2005 and 2008.&amp;nbsp; To support this I've reorganized source control, once again, and included the source for other projects as well, such as &lt;a href="http://davesexton.com/blog/blogs/blog/archive/2008/04/20/doctomaml-1-0-beta-is-now-available.aspx"&gt;DocToMaml&lt;/a&gt;.&amp;nbsp; I've also decided not to package the source code with the installer anymore, starting with 1.11.0 RC.&lt;/p&gt; &lt;p&gt;My plans for DocProject 1.x after the first production release are to provide subsequent releases for bug fixes and small feature updates only, targeting both VS 2005 and 2008.&amp;nbsp; The major features that I have been planning will make their first appearance in DocProject 2008 Beta 3.&lt;/p&gt; &lt;h4&gt;DocProject 2008&lt;/h4&gt; &lt;p&gt;After I deploy 1.11.0 RC, development will continue on both 1.12.0 RTW and DocProject 2008 Beta 3 simultaneously, although the most notable of new features will only be included in DocProject 2008 Beta 3.&amp;nbsp; &lt;em&gt;Some&lt;/em&gt; of these features are described below.&lt;/p&gt; &lt;p&gt;Please let me know which features you're most interested in so that I can prioritize.&lt;/p&gt; &lt;h5&gt;Visual Studio Package&lt;/h5&gt; &lt;p&gt;DocProject currently provides an Add-In that only uses VS automation, but I'd like to provide more integration to create a better &lt;strong&gt;&lt;a title="DocProject on CodePlex" href="http://www.codeplex.com/DocProject/Wiki/View.aspx?title=How+To+Use+The+Topic+Management+Dialog"&gt;Topic Explorer&lt;/a&gt;&lt;/strong&gt;, &lt;strong&gt;Topic Editor&lt;/strong&gt; and &lt;strong&gt;Topic Designer&lt;/strong&gt;, and even a preliminary &lt;a title="Sandcastle Help" href="http://www.codeplex.com/DocProject/Wiki/View.aspx?title=Sandcastle+Help#MAML"&gt;MAML&lt;/a&gt; editor.&amp;nbsp; I've done some initial research and have already come up with a plan to start development.&lt;/p&gt; &lt;p&gt;This is an exciting task to work on but I don't plan on the first release being extremely stable as this will be my first VS package; although, I do plan on reusing a fair amount of the automation code since it has already been tested.&amp;nbsp; I'll also incorporate much of DocProject's current architecture, including its high level of extensibility and its "openness".&lt;/p&gt; &lt;p&gt;Business logic, infrastructure and utilities will probably end up being mostly the same, but I do want to take this as an opportunity to update some of the designs that DocProject currently uses, like change buffering.&lt;/p&gt; &lt;h5&gt;Standalone UI&lt;/h5&gt; &lt;p&gt;The current &lt;a href="http://www.codeplex.com/DocProject/Wiki/View.aspx?title=DocProject+External+UI"&gt;DocProject External UI&lt;/a&gt; program relies on &lt;em&gt;DocProjects&lt;/em&gt; and &lt;em&gt;DocSites&lt;/em&gt; that have been created in Visual Studio.&amp;nbsp; For help authors that just-so-happen to be developers, this isn't a problem.&amp;nbsp; But for anyone that isn't a developer, the free Visual Studio Express edition works well but doesn't make much sense since it's obviously not designed just for building documentation, and certainly not for authoring it.&lt;/p&gt; &lt;p&gt;DocProject 2008 Beta 3 will use the new &lt;a href="http://msdn.microsoft.com/en-us/vsx2008/products/bb933751.aspx"&gt;Visual Studio 2008 Shell&lt;/a&gt; to provide a tool that has all of DocProject's features, but without requiring Visual Studio to be installed.&amp;nbsp; I haven't decided yet whether I'm going to use integrated or isolated mode, but I'm leaning towards integrated.&lt;/p&gt; &lt;p&gt;This should be quite easy to create since DocProject is becoming a VS package anyway.&amp;nbsp; A blocking issue though is whether MSBuild is provided by the &lt;em&gt;Shell&lt;/em&gt; redistributable.&amp;nbsp; If not, then I may just have to continue to deploy the &lt;em&gt;External UI&lt;/em&gt; instead.&amp;nbsp; I'm also not sure whether the &lt;em&gt;Shell &lt;/em&gt;provides C# and VB.NET source code editors, but if not it's no big deal since they aren't available in the current &lt;em&gt;External UI&lt;/em&gt; either.&amp;nbsp; (The code editors would be used to edit the project's build process component.&amp;nbsp; I think this would be a great feature to have in the standalone app, if possible, but it's not a requirement.)&lt;/p&gt; &lt;p&gt;My ultimate goal for the standalone UI is to create a program that works with or without Visual Studio.&amp;nbsp; It must provide the ability to create new &lt;em&gt;DocProjects&lt;/em&gt; and &lt;em&gt;DocSites &lt;/em&gt;from existing MSBuild project templates, so they work in Visual Studio as well.&amp;nbsp; It will also provide all of DocProject's existing and upcoming features, including support for UI extensibility; e.g., providers can register new tool bars and tool windows.&lt;/p&gt; &lt;h5&gt;Continuous Integration&lt;/h5&gt; &lt;p&gt;A project option will be available to enable support for &lt;a href="http://en.wikipedia.org/wiki/Continuous_Integration"&gt;continuous integration&lt;/a&gt;.&amp;nbsp; When enabled, DocProject will copy all dependencies into the project, including DocProject and Sandcastle assemblies, configuration files, and the HTML Help Workshop program, allowing them to be easily committed to source control.&amp;nbsp; After a &lt;em&gt;DocProject&lt;/em&gt; or &lt;em&gt;DocSite&lt;/em&gt; is checked-in, another team member can get the latest version to their computer or to a build server and all the dependencies will be updated as well, without requiring any installation.&lt;/p&gt; &lt;p&gt;The only blocking issue of which I'm aware seems to be that Help 2.x requires installation.&amp;nbsp; DocProject does not use any of the command-line tools that are installed by the VS SDK, however, it does use the MS Help COM interfaces.&amp;nbsp; Unfortunately, to get the libraries and COM objects installed you must install the VS SDK, but to install the SDK you must first install Visual Studio.&amp;nbsp; I'll continue to research this when the time comes to see if I can find a workaround, but so far it doesn't look good.&lt;/p&gt; &lt;h5&gt;Continuous Builds&lt;/h5&gt; &lt;p&gt;I mentioned this in my previous roadmap post.&amp;nbsp; The idea is to detect only the changes made to APIs and XML documentation and have a web server that continuously rebuilds a live &lt;em&gt;DocSite&lt;/em&gt; so that the updates are visible immediately to all team members.&lt;/p&gt; &lt;p&gt;This feature will require dependency detection and differencing algorithms for both API references and XML documentation.&amp;nbsp; &lt;a href="http://forums.microsoft.com/MSDN/ShowPost.aspx?PostID=2140796&amp;amp;SiteID=1"&gt;One question&lt;/a&gt; is whether these algorithms will perform better than building entire documentation sets from scratch, but I believe that they certainly will in the scenarios where it really matters.&lt;/p&gt; &lt;p&gt;The goal is that for projects with many large assemblies there should be little delay to see the updates in documentation, at least compared to the very long delay that ensues when rebuilding entire documentation sets from scratch, which is currently the only option with Sandcastle.&lt;/p&gt; &lt;p&gt;To use this feature you would start be creating a new &lt;em&gt;DocSite&lt;/em&gt; project and probably selecting some option in the &lt;strong&gt;New Project Wizard&lt;/strong&gt; to indicate that you want continuous build support.&amp;nbsp; You would also select a VS solution file or an MSBuild project that the DocSite will use to automatically build sources.&amp;nbsp; In the last wizard step you would add all of the sources to the project as &lt;em&gt;project references&lt;/em&gt;, like normal.&amp;nbsp; When finished configuring the project as usual, you would deploy it to an intranet web server that all team members can access over HTTP.&lt;/p&gt; &lt;p&gt;The live DocSite would trigger a rebuild using MSBuild at a configurable time interval.&amp;nbsp; This way MSBuild will detect updates automatically and the DocSite will always have the latest versions of all sources.&amp;nbsp; The DocSite will monitor changes to the sources and continuously rebuild only those topics that were affected.&amp;nbsp; It will also update the &lt;em&gt;DocSiteContents.xml&lt;/em&gt; and &lt;em&gt;DocSiteIndex.xml&lt;/em&gt; files, as well as the full-text search index.&lt;/p&gt; &lt;p&gt;One problem might be getting the latest source code onto the server so that the DocSite can rebuild it.&amp;nbsp; In a team scenario it's probably safe to assume that some sort of source control system is in use.&amp;nbsp; I'm not sure if it's possible, but if source control systems provide an event model that could be used to automatically get the latest version to the web server after each check-in, that would solve the problem.&amp;nbsp; Otherwise, manually getting the latest version to the server may be required.&amp;nbsp; It may be possible to access the source code over a network share (to a build server perhaps) so that it doesn't have to be stored on the web server, although I'm not sure if MSBuild works with UNC.&lt;/p&gt; &lt;p&gt;Using &lt;em&gt;external sources &lt;/em&gt;instead of project references may be another option, but replacing the assemblies on a network share automatically might be just as difficult.&amp;nbsp; It could be done manually or, as with the solution for project references, using source control events to run a build after each (labeled?) check-in.&lt;/p&gt; &lt;h5&gt;Localization&lt;/h5&gt; &lt;p&gt;I've already put a few hours into researching localization support in DocProject.&amp;nbsp; What I discovered, and I'm not surprised, is that if I want an implementation that isn't a hack I'll have to add some new features to support dynamic changes to various configuration files during builds.&amp;nbsp; Anticipating this problem, I had decided to defer localization support into DocProject 2008.&lt;/p&gt; &lt;p&gt;I suspect that these new &lt;em&gt;support&lt;/em&gt; features will be useful on their own as well, much in the same way that extension methods in C# 3.0 were probably added to support LINQ yet they are even useful by themselves.&amp;nbsp; The new features will add to DocProject's already high level of extensibility and will be customizable via the DocProject configuration file.&lt;/p&gt; &lt;p&gt;My goal for localization support is for a single &lt;em&gt;DocProject&lt;/em&gt; or &lt;em&gt;DocSite&lt;/em&gt; to produce multiple compiled help files for different locales in a single build.&amp;nbsp; This &lt;em&gt;must &lt;/em&gt;be accomplished without affecting the current feature-set of DocProject, including the Sandcastle Build Component drop-down properties and the fact that you can currently change almost anything that you want in the BuildAssembler configuration files.&amp;nbsp; So in other words, the localization feature must be completely transparent when it's not being used.&lt;/p&gt; &lt;p&gt;All Sandcastle content items and user-written XML documentation comments will be localizable.&amp;nbsp; Once implemented, I plan to ask the community to create language packs for content items in various locales (Unfortunately, I only know English, and not so well ;).&amp;nbsp; A language pack will be a .zip file that contains one or more Sandcastle content documents and an XML manifest file, which describes the contents and rules for locale inheritance.&amp;nbsp; DocProject 2008 will be able to locate the packs in its installation directory, by default, or a user-configured location.&lt;/p&gt; &lt;p&gt;With language packs, DocProject can offer out-of-the-box localization for multiple languages so that help authors can simply check a box and build their project to produce multiple compiled help files, one per language.&amp;nbsp; Localized XML documentation comments can be added to the project's &lt;em&gt;Help\Comments\[locale]&lt;/em&gt; folder (e.g., &lt;em&gt;Help\Comments\en-GB&lt;/em&gt;) and it will be merged automatically with XML documentation comments from the source code (how it's merged will depend upon the &lt;em&gt;Merge XML documentation&lt;/em&gt; project option, in the same exact way that it works now in the current version of DocProject).&amp;nbsp; Likewise, localized conceptual topics (MAML) may be added to the project's &lt;em&gt;Help\Topics\[locale]&lt;/em&gt; folder.&lt;/p&gt; &lt;p&gt;Instead of trying to write down the many concepts related to implementing localization support that I have echoing around between my ears, I'll just post my notes in their raw form.&amp;nbsp; If you want more details, please let me know.&lt;/p&gt;&lt;pre&gt;&lt;p&gt;1. add content item mappings to DocProject config file: 
&lt;p&gt;&amp;nbsp; &amp;lt;item name="..." presentationNames="Visual Studio 2005, Sandcastle Hana" source="options-property-name"/&amp;gt; 
&lt;p&gt;&amp;nbsp; - Items that are added here are automatically removed from the content item documents when a project is &lt;/p&gt;&lt;p&gt;    first created.&lt;br&gt;&amp;nbsp; - Before each build a dynamic content item document is generated in the working directory for all of the &lt;/p&gt;&lt;p&gt;    items that are configured here.&lt;br&gt;&amp;nbsp; - Note that a configChange must be added to register the dynamic content item document. &lt;/p&gt;
&lt;p&gt;2. Add a wizard step, before the Create Shared Content step, that allows a user to specify the values for &lt;p&gt;   each of the pre-defined_enum_names: 
&lt;p&gt;&amp;nbsp; - Documentation set name&lt;br&gt;&amp;nbsp; - Running header text&lt;br&gt;&amp;nbsp; - Copyright&lt;br&gt;&amp;nbsp; - Company name&lt;br&gt;&amp;nbsp; - Default locale (combox box) &lt;/p&gt;&lt;p&gt;
&lt;/p&gt;&lt;p&gt;3. Add a Localization Management dialog. 
&lt;p&gt;&amp;nbsp; - Choose the different locales in which distinct documentation sets will be generated by selecting from a &lt;/p&gt;&lt;p&gt;    drop down list, which will add the selection to another list.&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; - one locale may be selected as the "working" locale for the dialog; UI elements will apply only to the &lt;/p&gt;&lt;p&gt;      "working" locale.&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; - a tree view, like solution explorer, shows only the folders that may be localized within the project; &lt;/p&gt;&lt;p&gt;      e.g., Help\Topics, Help\Comments, etc.&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; - one node may be selected at a time.&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; - for the selected locale/node, a button can be clicked that will prompt the user to choose a locale from &lt;/p&gt;&lt;p&gt;      which to import files, with the option of specifying whether the import should be performed recursively.&lt;br&gt;&amp;nbsp; - Choose a default locale (corresponds to the wizard step option indicated above).&lt;br&gt;&amp;nbsp; - A single build will produce all of the documentation sets in each locale.&lt;br&gt;&amp;nbsp; - The BuildContext should have a property that returns the current LCID that's being built and another that &lt;/p&gt;&lt;p&gt;    returns the list of all LCIDs that are being built.&lt;br&gt;&amp;nbsp; - Output will be stored in sub folders named with the locale (e.g., bin\Debug\sp-SP\ or Help\bin\sp-SP).&lt;br&gt;&amp;nbsp; - Local input will be stored in sub folders named with the locale (e.g., Help\Topics\sp-SP\, &lt;/p&gt;&lt;p&gt;    Help\Comments\sp-SP\, Help\Presentation\Style\Content\sp-SP, Help\Presentation\Shared\Content\sp-SP).&lt;br&gt;&amp;nbsp; - The default locale's content will be stored at the root;&amp;nbsp; e.g., Help\Topics\, Help\Comments\, etc. so the &lt;/p&gt;&lt;p&gt;    build process for the default locale will work the same way that it does now.&lt;br&gt;&amp;nbsp; - Source input can be managed in the same way that version management works. &lt;/p&gt;
&lt;p&gt;4. Support dynamic updates to config files at build time. 
&lt;p&gt;&amp;nbsp; - Take all of the &amp;lt;add&amp;gt; elements in the &amp;lt;configChanges&amp;gt; element and move them under a sub element named, &lt;/p&gt;&lt;p&gt;    import.&lt;br&gt;&amp;nbsp; - Add a new sub element named build that will contain &amp;lt;add&amp;gt; elements for changes to be applied during &lt;/p&gt;&lt;p&gt;    builds.&lt;br&gt;&amp;nbsp; - replacements for build changes will work the same as for import changes, although they will also allow &lt;/p&gt;&lt;p&gt;    string replacement tokens: {0} {1} {2} ...&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; - The values of replacement tokens will be defined by attributes on the &amp;lt;add&amp;gt; element: value0="..." &lt;/p&gt;&lt;p&gt;      value1="..." value2="..."&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; - The values of the replacement attributes are strings that identify the names of public properties on &lt;/p&gt;&lt;p&gt;      the current derived implementation of the BuildSettings class during builds; e.g., &lt;/p&gt;&lt;p&gt;      value0="DocumentationSetName"&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; - Single-valued properties are converted to strings using Convert.ToString().&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; - Properties of System.Collections.IEnumerable implementations are iterated and each element is handled &lt;/p&gt;&lt;p&gt;      recursively.&amp;nbsp; Single-valued elements are converted to strings and IEnumerables are iterated.&amp;nbsp; &lt;/p&gt;&lt;p&gt;      The replacement is executed once for each iteration, recursively.&lt;br&gt;&amp;nbsp; - When a build starts the configuration files that will be used are copied to the working directory and &lt;/p&gt;&lt;p&gt;     then the build changes are applied.&lt;br&gt;&amp;nbsp; - Build assembler will use the config files in the working directory. &lt;/p&gt;
&lt;p&gt;5. Support dynamic localization of config files at build time.&lt;p&gt;&amp;nbsp; - Add a new sub element to &amp;lt;configChanges&amp;gt; named, localization.&lt;br&gt;&amp;nbsp; - replacements for localization changes will work the same as for build changes, including replacement &lt;/p&gt;&lt;p&gt;    tokens, expect that replacements are specified as properties of the current BuildContext object.&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; - BuildEngine implementations should be able to override a method to create a BuildContext &lt;/p&gt;&lt;p&gt;      implementation, such as SandcastleBuildContext, so that properties such as Lcid and Locale are dynamic.&lt;br&gt;&amp;nbsp; - When a localized build starts (not the BuildStarting event but the first step of a localized build, which &lt;/p&gt;&lt;p&gt;    is executed repeatedly within a single build - once for each locale), the configured localization &lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; changes are applied, for the current local, to the working copy of the build assembler config files.&amp;nbsp; &lt;/p&gt;&lt;p&gt;    Build assembler must then be executed against the localized copy.&amp;nbsp; (The original copy must not be &lt;/p&gt;&lt;p&gt;    replaced.) &lt;/p&gt;
&lt;p&gt;** The explanations above were created before this example.&amp;nbsp; This example illustrates the _better_ approach &lt;p&gt;when there are conflicts in the notes above since it's more thought out.&lt;p&gt;&amp;nbsp;&lt;p&gt;- DaveSexton.DocProject.dll.config -&lt;p&gt;Sandcastle presentation configuration section&lt;p&gt;
&lt;p&gt;&amp;lt;presentations&amp;gt;&lt;br&gt;&amp;nbsp; &amp;lt;presentation name="..."&lt;/p&gt;&lt;p&gt;                ... all of the attributes that currently appear in a presentation's add element ... &amp;gt;&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;options&amp;gt;&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;add name="RunningHeaderText" type="System.String" displayName="Running header text"&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; description="The text that will appear at the top of each topic." category="Configuration" &lt;/p&gt;&lt;p&gt;           sort="80" /&amp;gt;&amp;nbsp; &amp;lt;!-- the specified type must be convertible to and from System.String &lt;/p&gt;&lt;p&gt;                              (serialization is not supported) --&amp;gt;&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;/options&amp;gt;&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;content&amp;gt;&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;item name="runningHeaderText" value="RunningHeaderText"/&amp;gt;&lt;/p&gt;&lt;p&gt;            &amp;lt;!-- value is the name of a dynamic project option here, but it can be any property that &lt;/p&gt;&lt;p&gt;                 exists on a DocProjectOptions implementation --&amp;gt;&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;/content&amp;gt;&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;newProjectWizard&amp;gt;&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;step type="type name" assembly="assembly name"/&amp;gt;&lt;/p&gt;&lt;p&gt;            &amp;lt;!-- steps are inserted before the Create Shared Content step in the order that&lt;/p&gt;&lt;p&gt;                 they are added here --&amp;gt;&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;/newProjectWizard&amp;gt;&lt;br&gt;&amp;nbsp; &amp;lt;/presentation&amp;gt; &lt;/p&gt;
&lt;p&gt;&amp;nbsp; ... more presentations&lt;br&gt;&amp;lt;/presentations&amp;gt; 
&lt;p&gt;&amp;lt;configChanges&amp;gt;&lt;br&gt;&amp;nbsp; &amp;lt;import&amp;gt;&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; ... all of the stuff that is currently in the configChanges section ... 
&lt;p&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; Note that the default comments folder should be changed from Comments\*.xml to Comments\default\*.xml &lt;/p&gt;&lt;p&gt;    since comments should be segregated by locale; 'default' is used since the default locale can be changed.&lt;br&gt;&amp;nbsp; &amp;lt;/import&amp;gt;&lt;br&gt;&amp;nbsp; &amp;lt;build&amp;gt;&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;add name="assign default reference links locale" ....&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; xpath="find ResolveReferenceLinksComponent2 locale attribute"&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; setAttribute="{0}"&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; value0="Locale" /&amp;gt;&amp;nbsp; &amp;lt;!-- Locale refers to a property (that must be added) on the &lt;/p&gt;&lt;p&gt;                                  SandcastleSettings class --&amp;gt;&lt;br&gt;&amp;nbsp; &amp;lt;/build&amp;gt;&lt;br&gt;&amp;nbsp; &amp;lt;localization&amp;gt;&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;add name="assign reference links locale" ....&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; xpath="find ResolveReferenceLinksComponent2 locale attribute"&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; replaceWith="{0}"&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; value0="Locale" required="true" /&amp;gt;&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;!-- Locale refers to a property on the SandcastleBuildContext class (this class does not currently &lt;/p&gt;&lt;p&gt;         exist; it will derive from BuildContext) --&amp;gt;&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;!-- The required attribute indicates that append should be used if no node is matched by xpath; &lt;/p&gt;&lt;p&gt;         although, I'm not sure if I'll be able to determine programmatically whether xpath is selecting an &lt;/p&gt;&lt;p&gt;         attribute or an element --&amp;gt; &lt;/p&gt;
&lt;p&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;add name="assign localized comments" ....&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; xpath="find CopyFromIndexComponent with index name='comments' and select &lt;/p&gt;&lt;p&gt;                files='Comments\default\*.xml'"&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; replaceWith="Comments\{0}\*.xml"&lt;/p&gt;&lt;p&gt;         value0="Locale" /&amp;gt; &lt;/p&gt;
&lt;p&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;add name="assign shared content items" ....&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; xpath="find all of the shared content component's content items that start &lt;/p&gt;&lt;p&gt;                with ..\..\Help\Presentation\"&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; replaceWith="..\..\Help\Presentation\content\{0}\{1}" value0="Locale" value1="Regex:[^\\]+.xml"&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; collection="true" /&amp;gt;&amp;nbsp; &amp;lt;!-- the collection attribute will indicate whether xpath is expected to &lt;/p&gt;&lt;p&gt;         return a node collection, in which case this change is applied to each node --&amp;gt;&lt;br&gt;&amp;nbsp; &amp;lt;/localization&amp;gt;&lt;br&gt;&amp;lt;/configChanges&amp;gt;&lt;/p&gt;&lt;/pre&gt;&lt;img src="http://davesexton.com/blog/aggbug.aspx?PostID=447" width="1" height="1"&gt;</description><category domain="http://davesexton.com/blog/blogs/blog/archive/tags/Sandcastle/default.aspx">Sandcastle</category><category domain="http://davesexton.com/blog/blogs/blog/archive/tags/DocProject/default.aspx">DocProject</category><category domain="http://davesexton.com/blog/blogs/blog/archive/tags/Open+Source/default.aspx">Open Source</category></item><item><title>Sandcastle: Auto-Generated Bibliography</title><link>http://davesexton.com/blog/blogs/blog/archive/2008/04/25/sandcastle-auto-generated-bibliography.aspx</link><pubDate>Fri, 25 Apr 2008 14:12:58 GMT</pubDate><guid isPermaLink="false">5b5c6d2b-d071-4bf8-ac28-4f9cd768b39b:446</guid><dc:creator>Dave Sexton</dc:creator><slash:comments>0</slash:comments><description>&lt;div style="background-color:lightblue;"&gt;June 11, 2008 Update: This feature is now available as part of the &lt;a title="Sandcastle Styles on CodePlex" href="http://www.codeplex.com/SandcastleStyles"&gt;Sandcastle Styles&lt;/a&gt; patch and &lt;a href="http://davesexton.com/blog/blogs/blog/archive/2008/06/08/docproject-1-11-0-rc-is-now-available.aspx"&gt;DocProject 1.11.0 RC&lt;/a&gt;.&lt;/div&gt; &lt;p&gt;Wouldn't it be cool if you could cite books and web sites while authoring &lt;a title="Sandcastle Help" href="http://www.codeplex.com/DocProject/Wiki/View.aspx?title=Sandcastle+Help#MAML"&gt;MAML&lt;/a&gt; and XML documentation comments and have &lt;a title="Sandcastle on CodePlex" href="http://www.codeplex.com/Sandcastle"&gt;Sandcastle&lt;/a&gt; create a per-topic bibliography automatically?&lt;/p&gt; &lt;p&gt;Someone posted &lt;a href="http://www.codeplex.com/Sandcastle/Thread/View.aspx?ThreadId=26347"&gt;that question&lt;/a&gt; in the Sandcastle forums recently and I came up with a solution (in that discussion) that works for the VS 2005 presentation style and both reference and conceptual builds.&amp;nbsp; Please add your vote to this &lt;a href="http://www.codeplex.com/Sandcastle/WorkItem/View.aspx?WorkItemId=2082"&gt;feature request&lt;/a&gt; if you're interested in having this ability in Sandcastle.&lt;/p&gt; &lt;p&gt;This isn't a feature that I'm going to add specifically to &lt;a title="DocProject on CodePlex" href="http://www.codeplex.com/DocProject"&gt;DocProject&lt;/a&gt; since it requires updating XSL transformations.&amp;nbsp; You can add it yourself for now though until it becomes a feature of Sandcastle (hopefully :).&amp;nbsp; Just follow the instructions that I gave in my post in the Sandcastle forum.&lt;/p&gt; &lt;p&gt;Once you make the appropriate updates to the presentation style, here's what you can do to start using this feature in code comments.&amp;nbsp; (Conceptual usage is similar, although you must add an empty &lt;strong&gt;&amp;lt;bibliography/&amp;gt;&lt;/strong&gt; element somewhere in the root of your MAML, preferably before or after the &lt;em&gt;relatedTopics&lt;/em&gt; element.)&lt;/p&gt; &lt;p&gt;First, author some XML documentation comments that contain citations.&lt;/p&gt;&lt;pre class="code"&gt;&lt;span&gt;&amp;lt;&lt;/span&gt;&lt;span&gt;remarks&lt;/span&gt;&lt;span&gt;&amp;gt;
  &amp;lt;&lt;/span&gt;&lt;span&gt;para&lt;/span&gt;&lt;span&gt;&amp;gt;
&lt;/span&gt;    The statistics show that Sandcastle is a popular tool on 
    CodePlex &lt;span&gt;&amp;lt;&lt;/span&gt;&lt;span&gt;cite&lt;/span&gt;&lt;span&gt;&amp;gt;&lt;/span&gt;sandcastle activity stats&lt;span&gt;&amp;lt;/&lt;/span&gt;&lt;span&gt;cite&lt;/span&gt;&lt;span&gt;&amp;gt;&lt;/span&gt;.
&lt;span&gt;  &amp;lt;/&lt;/span&gt;&lt;span&gt;para&lt;/span&gt;&lt;span&gt;&amp;gt;
  &amp;lt;&lt;/span&gt;&lt;span&gt;para&lt;/span&gt;&lt;span&gt;&amp;gt;
&lt;/span&gt;    DocProject can be used to automate Sandcastle &lt;span&gt;&amp;lt;&lt;/span&gt;&lt;span&gt;cite&lt;/span&gt;&lt;span&gt;&amp;gt;&lt;/span&gt;DocProject&lt;span&gt;&amp;lt;/&lt;/span&gt;&lt;span&gt;cite&lt;/span&gt;&lt;span&gt;&amp;gt;&lt;/span&gt;.
&lt;span&gt;  &amp;lt;/&lt;/span&gt;&lt;span&gt;para&lt;/span&gt;&lt;span&gt;&amp;gt;
  &amp;lt;&lt;/span&gt;&lt;span&gt;para&lt;/span&gt;&lt;span&gt;&amp;gt;
&lt;/span&gt;    The top referring sites are similar for DocProject and 
    Sandcastle &lt;span&gt;&amp;lt;&lt;/span&gt;&lt;span&gt;cite&lt;/span&gt;&lt;span&gt;&amp;gt;&lt;/span&gt;sandcastle activity stats&lt;span&gt;&amp;lt;/&lt;/span&gt;&lt;span&gt;cite&lt;/span&gt;&lt;span&gt;&amp;gt;&amp;lt;&lt;/span&gt;&lt;span&gt;cite&lt;/span&gt;&lt;span&gt;&amp;gt;&lt;/span&gt;docproject activity stats&lt;span&gt;&amp;lt;/&lt;/span&gt;&lt;span&gt;cite&lt;/span&gt;&lt;span&gt;&amp;gt;&lt;/span&gt;.
&lt;span&gt;  &amp;lt;/&lt;/span&gt;&lt;span&gt;para&lt;/span&gt;&lt;span&gt;&amp;gt;
&amp;lt;/&lt;/span&gt;&lt;span&gt;remarks&lt;/span&gt;&lt;span&gt;&amp;gt;&lt;/span&gt;&lt;/pre&gt;
&lt;p&gt;Next, create a &lt;strong&gt;bibliography.xml&lt;/strong&gt; file that provides additional information.&amp;nbsp; It will be used for all topics that you write in both conceptual and reference builds.&lt;/p&gt;&lt;pre class="code"&gt;&lt;span&gt;&amp;lt;?&lt;/span&gt;&lt;span&gt;xml&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;version&lt;/span&gt;&lt;span&gt;=&lt;/span&gt;"&lt;span&gt;1.0&lt;/span&gt;"&lt;span&gt; &lt;/span&gt;&lt;span&gt;encoding&lt;/span&gt;&lt;span&gt;=&lt;/span&gt;"&lt;span&gt;utf-8&lt;/span&gt;"&lt;span&gt; ?&amp;gt;
&amp;lt;&lt;/span&gt;&lt;span&gt;bibliography&lt;/span&gt;&lt;span&gt;&amp;gt;
  &amp;lt;&lt;/span&gt;&lt;span&gt;reference&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;name&lt;/span&gt;&lt;span&gt;=&lt;/span&gt;"&lt;span&gt;sandcastle activity stats&lt;/span&gt;"&lt;span&gt;&amp;gt;
    &amp;lt;&lt;/span&gt;&lt;span&gt;title&lt;/span&gt;&lt;span&gt;&amp;gt;&lt;/span&gt;Sandcastle Activity Statistics&lt;span&gt;&amp;lt;/&lt;/span&gt;&lt;span&gt;title&lt;/span&gt;&lt;span&gt;&amp;gt;
    &amp;lt;&lt;/span&gt;&lt;span&gt;author&lt;/span&gt;&lt;span&gt;&amp;gt;&lt;/span&gt;WebTrends&lt;span&gt;&amp;lt;/&lt;/span&gt;&lt;span&gt;author&lt;/span&gt;&lt;span&gt;&amp;gt;
    &amp;lt;&lt;/span&gt;&lt;span&gt;publisher&lt;/span&gt;&lt;span&gt;&amp;gt;&lt;/span&gt;CodePlex.com&lt;span&gt;&amp;lt;/&lt;/span&gt;&lt;span&gt;publisher&lt;/span&gt;&lt;span&gt;&amp;gt;
    &amp;lt;&lt;/span&gt;&lt;span&gt;link&lt;/span&gt;&lt;span&gt;&amp;gt;&lt;/span&gt;http://www.codeplex.com/Sandcastle/stats/view&lt;span&gt;&amp;lt;/&lt;/span&gt;&lt;span&gt;link&lt;/span&gt;&lt;span&gt;&amp;gt;
  &amp;lt;/&lt;/span&gt;&lt;span&gt;reference&lt;/span&gt;&lt;span&gt;&amp;gt;
  &amp;lt;&lt;/span&gt;&lt;span&gt;reference&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;name&lt;/span&gt;&lt;span&gt;=&lt;/span&gt;"&lt;span&gt;docproject activity stats&lt;/span&gt;"&lt;span&gt;&amp;gt;
    &amp;lt;&lt;/span&gt;&lt;span&gt;title&lt;/span&gt;&lt;span&gt;&amp;gt;&lt;/span&gt;DocProject Activity Statistics&lt;span&gt;&amp;lt;/&lt;/span&gt;&lt;span&gt;title&lt;/span&gt;&lt;span&gt;&amp;gt;
    &amp;lt;&lt;/span&gt;&lt;span&gt;author&lt;/span&gt;&lt;span&gt;&amp;gt;&lt;/span&gt;WebTrends&lt;span&gt;&amp;lt;/&lt;/span&gt;&lt;span&gt;author&lt;/span&gt;&lt;span&gt;&amp;gt;
    &amp;lt;&lt;/span&gt;&lt;span&gt;publisher&lt;/span&gt;&lt;span&gt;&amp;gt;&lt;/span&gt;CodePlex.com&lt;span&gt;&amp;lt;/&lt;/span&gt;&lt;span&gt;publisher&lt;/span&gt;&lt;span&gt;&amp;gt;
    &amp;lt;&lt;/span&gt;&lt;span&gt;link&lt;/span&gt;&lt;span&gt;&amp;gt;&lt;/span&gt;http://www.codeplex.com/DocProject/stats/view&lt;span&gt;&amp;lt;/&lt;/span&gt;&lt;span&gt;link&lt;/span&gt;&lt;span&gt;&amp;gt;
  &amp;lt;/&lt;/span&gt;&lt;span&gt;reference&lt;/span&gt;&lt;span&gt;&amp;gt;
  &amp;lt;&lt;/span&gt;&lt;span&gt;reference&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;name&lt;/span&gt;&lt;span&gt;=&lt;/span&gt;"&lt;span&gt;DocProject&lt;/span&gt;"&lt;span&gt;&amp;gt;
    &amp;lt;&lt;/span&gt;&lt;span&gt;title&lt;/span&gt;&lt;span&gt;&amp;gt;&lt;/span&gt;DocProject&lt;span&gt;&amp;lt;/&lt;/span&gt;&lt;span&gt;title&lt;/span&gt;&lt;span&gt;&amp;gt;
    &amp;lt;&lt;/span&gt;&lt;span&gt;author&lt;/span&gt;&lt;span&gt;&amp;gt;&lt;/span&gt;Dave Sexton&lt;span&gt;&amp;lt;/&lt;/span&gt;&lt;span&gt;author&lt;/span&gt;&lt;span&gt;&amp;gt;
    &amp;lt;&lt;/span&gt;&lt;span&gt;link&lt;/span&gt;&lt;span&gt;&amp;gt;&lt;/span&gt;http://www.codeplex.com/DocProject&lt;span&gt;&amp;lt;/&lt;/span&gt;&lt;span&gt;link&lt;/span&gt;&lt;span&gt;&amp;gt;
  &amp;lt;/&lt;/span&gt;&lt;span&gt;reference&lt;/span&gt;&lt;span&gt;&amp;gt;
&amp;lt;/&lt;/span&gt;&lt;span&gt;bibliography&lt;/span&gt;&lt;span&gt;&amp;gt;&lt;/span&gt;&lt;/pre&gt;&lt;a href="http://11011.net/software/vspaste"&gt;&lt;/a&gt;
&lt;p&gt;Each in-line citation will be replaced with a hyperlink and a number, which corresponds to an entry in the bibliography that is automatically generated at the bottom of each help topic when one or more &lt;strong&gt;&amp;lt;cite&amp;gt;&lt;/strong&gt; elements are detected.&lt;/p&gt;
&lt;p&gt;&lt;img style="border-top-width:0px;border-left-width:0px;border-bottom-width:0px;margin:0px;border-right-width:0px;" height="341" alt="Example Sandcastle Bibliography" src="http://davesexton.com/Images/Blog/SandcastleAutoGeneratedBibliography_8706/image.png" width="686" border="0"&gt;&lt;/p&gt;&lt;img src="http://davesexton.com/blog/aggbug.aspx?PostID=446" width="1" height="1"&gt;</description><category domain="http://davesexton.com/blog/blogs/blog/archive/tags/Sandcastle/default.aspx">Sandcastle</category><category domain="http://davesexton.com/blog/blogs/blog/archive/tags/DocProject/default.aspx">DocProject</category></item><item><title>DocToMaml 1.0 Beta is Now Available</title><link>http://davesexton.com/blog/blogs/blog/archive/2008/04/20/doctomaml-1-0-beta-is-now-available.aspx</link><pubDate>Sun, 20 Apr 2008 05:51:27 GMT</pubDate><guid isPermaLink="false">5b5c6d2b-d071-4bf8-ac28-4f9cd768b39b:441</guid><dc:creator>Dave Sexton</dc:creator><slash:comments>2</slash:comments><description>&lt;p&gt;&lt;a href="http://www.codeplex.com/Release/ProjectReleases.aspx?ProjectName=DocProject&amp;amp;ReleaseId=12723"&gt;DocToMaml 1.0 Beta&lt;/a&gt; is a tool that converts HTML and XHTML help files to &lt;a href="http://www.codeplex.com/DocProject/Wiki/View.aspx?title=Sandcastle+Help#MAML"&gt;Microsoft Assistance Markup Language&lt;/a&gt; (MAML) in a batch process.&lt;/p&gt; &lt;p&gt;MAML help files are used by &lt;a href="http://www.codeplex.com/DocProject"&gt;DocProject&lt;/a&gt; and &lt;a title="Sandcastle on CodePlex" href="http://www.codeplex.com/Sandcastle"&gt;Sandcastle&lt;/a&gt; to build user documentation in various presentation styles.&lt;/p&gt; &lt;p&gt;DocToMaml provides a console mode and a project-based graphical user interface (GUI) for adding inputs and defining conversion rules to quickly and easily convert HTML files into MAML. Future releases will provide more flexibility for defining rules, but the beta can still be used to greatly decrease the amount of effort that would be required to convert large numbers of HTML files into MAML, compared to doing it manually.&lt;/p&gt; &lt;p&gt;&lt;img style="margin:0px;" height="515" alt="DocToMaml-GUI" src="http://davesexton.com/Images/Blog/DocToMaml1.0BetaisNowAvailable_FF74/DocToMamlGUI.jpg" width="693" border="0"&gt; &lt;/p&gt; &lt;h5&gt;Features &lt;/h5&gt;Some of the features of DocToMaml are:  &lt;ul&gt; &lt;li&gt;GUI and console mode.  &lt;li&gt;Project-based for quickly saving and loading different configurations.  &lt;li&gt;File and folder inputs are supported.  &lt;li&gt;Global and input-specific rule sets may be defined.  &lt;li&gt;Edit the source HTML of a file input using a WYSIWYG editor for full control over the conversion.  &lt;li&gt;Convert a file input in memory so that you can see the result quickly.  &lt;li&gt;MAML results for file inputs can be modified in a text box.  &lt;li&gt;Batch conversion saves results to disc for all file and folder inputs and generates a conceptual artwork file that can be used by Sandcastle's &lt;i&gt;ResolveArtLinksComponent&lt;/i&gt; build component.  &lt;li&gt;Hyperlink references to local topics are updated automatically.  &lt;li&gt;Preliminary user documentation. &lt;/li&gt;&lt;/ul&gt; &lt;h5&gt;Current Limitations &lt;/h5&gt; &lt;ul&gt; &lt;li&gt;Only the &lt;i&gt;Conceptual&lt;/i&gt; MAML document type is supported.  &lt;li&gt;Subsections and sub containers are not supported. For example, nested tables and lists are added to the current in-line element, if one exists; otherwise, they are added as new top-level containers.  &lt;li&gt;Images appear to be broken in source view, although this has no effect on the output. You don't have to update the paths to broken images since DocToMaml doesn't do anything with image files in the current release anyway. &lt;/li&gt;&lt;/ul&gt;For help with DocToMaml, see the compiled help file that is available for download on the release page.&lt;img src="http://davesexton.com/blog/aggbug.aspx?PostID=441" width="1" height="1"&gt;</description><category domain="http://davesexton.com/blog/blogs/blog/archive/tags/Sandcastle/default.aspx">Sandcastle</category><category domain="http://davesexton.com/blog/blogs/blog/archive/tags/DocProject/default.aspx">DocProject</category><category domain="http://davesexton.com/blog/blogs/blog/archive/tags/Betas/default.aspx">Betas</category><category domain="http://davesexton.com/blog/blogs/blog/archive/tags/MAML/default.aspx">MAML</category><category domain="http://davesexton.com/blog/blogs/blog/archive/tags/DocToMaml/default.aspx">DocToMaml</category></item><item><title>Article Features DocProject in Microsoft's Dutch .NET Magazine</title><link>http://davesexton.com/blog/blogs/blog/archive/2008/04/07/article-features-docproject-in-microsoft-s-dutch-net-magazine.aspx</link><pubDate>Mon, 07 Apr 2008 16:15:12 GMT</pubDate><guid isPermaLink="false">5b5c6d2b-d071-4bf8-ac28-4f9cd768b39b:439</guid><dc:creator>Dave Sexton</dc:creator><slash:comments>0</slash:comments><description>&lt;p&gt;&lt;a href="http://bloggingabout.net/blogs/jschreuder/"&gt;Jan Schreuder&lt;/a&gt; wrote an article on Sandcastle for Microsoft's Dutch .NET Magazine and &lt;a href="http://bloggingabout.net/blogs/jschreuder/archive/2008/04/07/a-bit-proud.aspx"&gt;it's now available on the web&lt;/a&gt;.&amp;nbsp; In it he provides an overview of Sandcastle and some instructions on how to use it.&amp;nbsp; The article also features a few popular community tools that are available for use with Sandcastle; namely, &lt;a href="http://www.codeplex.com/SHFB"&gt;Sandcastle Help File Builder&lt;/a&gt;, &lt;a href="http://www.codeplex.com/ajaxdoc"&gt;AjaxDoc&lt;/a&gt; (&lt;em&gt;ScriptDoc&lt;/em&gt;) and &lt;a title="DocProject on CodePlex" href="http://www.codeplex.com/DocProject"&gt;DocProject&lt;/a&gt;.&amp;nbsp; Jan mentions that DocProject is his preferred tool for automating Sandcastle and cites some of its advantages.&amp;nbsp; Thanks!&lt;/p&gt; &lt;p&gt;The article is written in Dutch, but I was able to successfully translate it using &lt;a href="http://translate.google.com"&gt;Google Translator&lt;/a&gt;.&amp;nbsp; First, download the PDF (visit Jan's blog for the link) and then save it as text (check the &lt;em&gt;File &lt;/em&gt;menu).&amp;nbsp; Copy and paste the text into the translator, select &lt;em&gt;Dutch to English&lt;/em&gt; and press &lt;em&gt;Translate&lt;/em&gt;.&amp;nbsp; It works well enough to get the gist of the article.&lt;/p&gt; &lt;p&gt;Since the article was written there have been some important changes to Sandcastle and DocProject.&amp;nbsp; Most notably, &lt;a title="Sandcastle on CodePlex" href="http://www.codeplex.com/Sandcastle"&gt;Sandcastle&lt;/a&gt; is now RTW on CodePlex and DocProject now provides &lt;a href="http://davesexton.com/blog/blogs/blog/archive/2008/01/15/docproject-1-10-0-rc-preview.aspx"&gt;first-class support for conceptual documentation&lt;/a&gt; using &lt;a title="Sandcastle Help - MAML" href="http://www.codeplex.com/DocProject/Wiki/View.aspx?title=Sandcastle+Help#MAML"&gt;MAML&lt;/a&gt;, which of course wasn't mentioned in the article.&lt;/p&gt; &lt;h5&gt;More Information about Sandcastle&lt;/h5&gt; &lt;p&gt;For an up-to-date reference check out my (peer reviewed) &lt;a title="Sandcastle Help" href="http://www.codeplex.com/DocProject/Wiki/View.aspx?title=Sandcastle+Help"&gt;Sandcastle Help&lt;/a&gt; article on CodePlex.&amp;nbsp; It doesn't go into detail about how to use Sandcastle but it does provide a bullet-point overview and catalogs the different tools and documentation that exist elsewhere on the web.&amp;nbsp; It's a good starting point.&lt;/p&gt; &lt;h5&gt;More Information about DocProject&lt;/h5&gt; &lt;p&gt;See my &lt;a title="About DocProject on CodePlex" href="http://www.codeplex.com/DocProject/Wiki/View.aspx?title=About+DocProject"&gt;About DocProject&lt;/a&gt; article on CodePlex for an overview, screen shots and how to get started.&lt;/p&gt; &lt;p&gt;I also plan to write a few more &lt;a title="DocProject Tutorials on CodePlex" href="http://www.codeplex.com/DocProject/Wiki/View.aspx?title=How+To...#Tutorials"&gt;DocProject tutorials&lt;/a&gt; in the future, as well as Sandcastle tutorials for things like how to create a custom presentation style and how to add custom tags, so keep an eye on my blog and DocProject's RSS feed on CodePlex.&lt;/p&gt;&lt;img src="http://davesexton.com/blog/aggbug.aspx?PostID=439" width="1" height="1"&gt;</description><category domain="http://davesexton.com/blog/blogs/blog/archive/tags/Microsoft/default.aspx">Microsoft</category><category domain="http://davesexton.com/blog/blogs/blog/archive/tags/Sandcastle/default.aspx">Sandcastle</category><category domain="http://davesexton.com/blog/blogs/blog/archive/tags/DocProject/default.aspx">DocProject</category></item><item><title>Auto-Input Protection 2.0 Beta Is Now Available</title><link>http://davesexton.com/blog/blogs/blog/archive/2008/04/01/auto-input-protection-beta-2-0-is-now-available.aspx</link><pubDate>Wed, 02 Apr 2008 00:26:00 GMT</pubDate><guid isPermaLink="false">5b5c6d2b-d071-4bf8-ac28-4f9cd768b39b:437</guid><dc:creator>Dave Sexton</dc:creator><slash:comments>0</slash:comments><description>&lt;P&gt;I've just deployed &lt;A title="Auto-Input Protection Beta 2.0" href="https://www.codeplex.com/Release/ProjectReleases.aspx?ProjectName=aip&amp;amp;ReleaseId=7035"&gt;Auto-Input Protection&amp;nbsp;2.0 Beta&lt;/A&gt; to CodePlex.&amp;nbsp; (Finally!)&lt;/P&gt;
&lt;P&gt;It was changed from a &lt;EM&gt;Production&lt;/EM&gt; release to a &lt;EM&gt;Beta &lt;/EM&gt;release because there are so many breaking changes, although I'm confident that it works since I've been using it on my blog for the last week or two.&amp;nbsp; I've even fixed a few bugs during that time.&lt;/P&gt;
&lt;P&gt;The release page lists the breaking changes and most of the new features.&lt;/P&gt;
&lt;P&gt;Here are a couple that aren't mentioned: &lt;/P&gt;
&lt;UL&gt;
&lt;LI&gt;All of the provider collection elements in the web.config file are now optional.&amp;nbsp; (It used to be that just the &amp;lt;filters&amp;gt; element was optional.) 
&lt;LI&gt;&lt;STRONG&gt;CrossHatchAutoInputProtectionFilterProvider&lt;/STRONG&gt; is now built-in.&amp;nbsp; Instead of using a diagonal cross hatch each time it selects a &lt;EM&gt;HatchStyle &lt;/EM&gt;value at random, although you can configure it to use a single style if you want. 
&lt;LI&gt;The &lt;STRONG&gt;ProviderHelper&lt;/STRONG&gt; class is now public.&amp;nbsp; It's useful for parsing configuration values from strings into other types. 
&lt;LI&gt;An ASP.NET Web Application project, for testing AIP, is part of the source code provided by the installer. 
&lt;LI&gt;You now have the choice of using the ASP.NET cache or session state to store challenges on the server.&amp;nbsp; With out-of-process session state, AIP can be used in web farm scenarios.&lt;/LI&gt;&lt;/UL&gt;
&lt;H5&gt;Security&lt;/H5&gt;
&lt;P&gt;This release fixes a &lt;A href="http://davesexton.com/blog/blogs/blog/archive/2007/12/12/aip-1-0-0-bypassed.aspx"&gt;security flaw&lt;/A&gt; that was reported for AIP 1.0.0.&amp;nbsp; If you find any other flaws please don't hesitate to report them to me so that I can try to fix them.&lt;/P&gt;
&lt;P&gt;Note that due to the flaw I've added some new behaviors to help secure AIP; however, it may not be appropriate for immediate use in some scenarios.&amp;nbsp; A timeout is now implemented that will cause validation to fail if a user does not respond in a timely manner (30 seconds).&lt;/P&gt;
&lt;P&gt;If you are using the control on a blog (like me) or any other page that contains reading material or data entry fields, then you can increase the default timeout by setting the &lt;STRONG&gt;ValidationTimeout&lt;/STRONG&gt; property on the AIP web control.&lt;/P&gt;
&lt;P&gt;Alternatively, although not recommended, you can disable this behavior entirely by setting the &lt;STRONG&gt;ValidationKeepAlive&lt;/STRONG&gt; property to &lt;STRONG&gt;true&lt;/STRONG&gt; on the AIP web control.&amp;nbsp; Doing so will cause &lt;EM&gt;unused&lt;/EM&gt; challenges to remain on the server indefinitely, which will increase the amount of memory needed upon each request.&amp;nbsp; (An unused challenge is one that is requested but never answered.)&amp;nbsp; If you do decide to disable this timeout (by enabling &lt;EM&gt;ValidationKeepAlive&lt;/EM&gt;) then I recommend setting the &lt;STRONG&gt;PersistenceMode&lt;/STRONG&gt; property (new to the &lt;STRONG&gt;AutoInputProtection&lt;/STRONG&gt; class) to a value of &lt;STRONG&gt;Session&lt;/STRONG&gt; so that at least when a user's session expires their unused challenges will too.&amp;nbsp; You can set this property easily on the &lt;EM&gt;autoInputProtection&lt;/EM&gt; element in your web.config file: &lt;/P&gt;
&lt;P&gt;&amp;lt;autoInputProtection persistenceMode="Session"/&amp;gt;&lt;/P&gt;
&lt;P&gt;When you enable session state persistence you should also add the new &lt;STRONG&gt;AutoInputProtectionSessionRequestHandler&lt;/STRONG&gt; to the configuration file instead of &lt;EM&gt;AutoInputProtectionRequestHandler&lt;/EM&gt;.&amp;nbsp; Refer to the docs for more information.&lt;/P&gt;
&lt;H5&gt;Documentation&lt;/H5&gt;
&lt;P&gt;The first batch of preliminary docs were built for this release.&amp;nbsp; Naturally, I used &lt;A title="DocProject 1.10.1 Release Candidate" href="https://www.codeplex.com/Release/ProjectReleases.aspx?ProjectName=DocProject&amp;amp;ReleaseId=11008"&gt;DocProject 1.10.1 RC&lt;/A&gt; and &lt;A title="Sandcastle on CodePlex" href="http://www.codeplex.com/Sandcastle"&gt;Sandcastle&lt;/A&gt; so that I could automatically generate reference documentation from my triple-slash code comments and write conceptual documentation using &lt;A href="http://www.codeplex.com/DocProject/Wiki/View.aspx?title=Sandcastle%20Help#MAML"&gt;MAML&lt;/A&gt;.&lt;/P&gt;
&lt;P&gt;The AIP installer merges the MS Help 2 docs (.HxS) into Visual Studio 2005 and 2008 automatically.&amp;nbsp; The HTML Help 1.x docs (.chm) is provided on the release page as a separate download.&lt;/P&gt;
&lt;P&gt;&lt;STRONG&gt;A bit off-topic...&lt;/STRONG&gt;&lt;/P&gt;
&lt;P&gt;For the DocProject users out there, I've learned a few things about Help 2.x since I built the documentation for AIP and I plan to write a tutorial that describes how to:&lt;/P&gt;
&lt;UL&gt;
&lt;LI&gt;Add &lt;STRONG&gt;DocSet&lt;/STRONG&gt; attributes to your topics so that your documentation appears when filters are applied in Document Explorer, including custom filters. 
&lt;LI&gt;Set the &lt;A href="https://www.codeplex.com/Thread/View.aspx?ProjectName=DocProject&amp;amp;ThreadId=23252"&gt;home and default pages&lt;/A&gt;. 
&lt;LI&gt;Use the &lt;STRONG&gt;Help Integration Wizard&lt;/STRONG&gt; to produce a Merge Module for your .HxS file that can be added to a Setup Project.&amp;nbsp; The wizard automatically generates the required collection-level files and allows you to specify titles, IDs and custom filters that will be installed automatically.&amp;nbsp; I'll also describe a few showstoppers that you may run into as well.&lt;/LI&gt;&lt;/UL&gt;
&lt;P&gt;There's already documentation online for some of this stuff, but I plan to write this tutorial with DocProject in mind.&lt;/P&gt;
&lt;P&gt;In the AIP solution there are two merge modules: one for VS 2005 and one for VS 2008.&amp;nbsp; Both are referenced by the installer project.&amp;nbsp; I didn't include the &lt;EM&gt;DocProject&lt;/EM&gt; that I used in the solution simply because AIP was written in Visual Studio 2008 and I was using DocProject 1.10.0 RC, which requires Visual Studio 2005.&lt;/P&gt;&lt;img src="http://davesexton.com/blog/aggbug.aspx?PostID=437" width="1" height="1"&gt;</description><category domain="http://davesexton.com/blog/blogs/blog/archive/tags/Open+Source/default.aspx">Open Source</category><category domain="http://davesexton.com/blog/blogs/blog/archive/tags/Auto-Input+Protection/default.aspx">Auto-Input Protection</category><category domain="http://davesexton.com/blog/blogs/blog/archive/tags/AIP/default.aspx">AIP</category><category domain="http://davesexton.com/blog/blogs/blog/archive/tags/ASP.NET/default.aspx">ASP.NET</category><category domain="http://davesexton.com/blog/blogs/blog/archive/tags/Betas/default.aspx">Betas</category></item><item><title>ContractN on CodePlex</title><link>http://davesexton.com/blog/blogs/blog/archive/2008/03/10/contractn-on-codeplex.aspx</link><pubDate>Mon, 10 Mar 2008 10:23:53 GMT</pubDate><guid isPermaLink="false">5b5c6d2b-d071-4bf8-ac28-4f9cd768b39b:111</guid><dc:creator>Dave Sexton</dc:creator><slash:comments>5</slash:comments><description>&lt;p&gt;I've just released the first beta version of &lt;a title="ContractN on CodePlex" href="http://www.codeplex.com/ContractN"&gt;ContractN&lt;/a&gt;, which is a fully managed &lt;a href="http://en.wikipedia.org/wiki/Design_by_contract"&gt;programming-by-contract&lt;/a&gt; framework that uses the CLR's built-in support for &lt;a href="http://en.wikipedia.org/wiki/Aspect-oriented_programming"&gt;aspect-oriented programming&lt;/a&gt; (AOP), which provides a way to seamlessly and intuitively describe the required pre- and post-conditions of a type's contract.&lt;/p&gt; &lt;p&gt;I got the idea based on &lt;a href="http://blogs.microsoft.co.il/blogs/sasha/archive/2008/02/23/interception-and-attributes-a-design-by-contract-sample.aspx#63729"&gt;this blog post&lt;/a&gt; by Sasha Goldshtein; although, Sasha's implementation and that of ContractN have little in common other than their purpose.&amp;nbsp; I liked the way Sasha used dynamically-generated code, but other than that I wasn't satisfied having to create the extra stuff that was required to enforce conditions.&lt;/p&gt; &lt;h5&gt;Advantages of ContractN&lt;/h5&gt; &lt;p&gt;The real benefit of ContractN, IMO, is that there's no overhead in terms of setting up your classes or their consumers, and you don't have to worry about breaking encapsulation or having to create any supporting interfaces or classes.&amp;nbsp; You just need to derive an object from &lt;strong&gt;ContractN.ProgrammingByContract&lt;/strong&gt;. &lt;strong&gt;&lt;/strong&gt;(It's a shame that this is required though - I hope AOP is eventually introduced as a C# language feature; although, I suspect that the CLR would have to participate as well to alleviate the need for subclassing.)&lt;/p&gt; &lt;p&gt;&lt;em&gt;ProgrammingByContract&lt;/em&gt; is an abstract base class that sets up the AOP infrastructure, which is used to intercept method invocations and define conditions as attributes.&amp;nbsp; After defining a class that inherits from &lt;em&gt;ProgrammingByContract&lt;/em&gt;, simply add the appropriate attributes wherever you'd like to enforce certain conditions on the public contract of your type.&amp;nbsp; Here's a really simple C# 3.0 example: &lt;/p&gt;&lt;pre class="code"&gt;&lt;span&gt;public&lt;/span&gt; &lt;span&gt;class&lt;/span&gt; &lt;span&gt;Person&lt;/span&gt; : ContractN.&lt;span&gt;ProgrammingByContract&lt;/span&gt;&lt;span&gt;
&lt;/span&gt;{
  [&lt;span&gt;InRequired&lt;/span&gt;, &lt;span&gt;OutRequired&lt;/span&gt;]
&lt;span&gt;  public&lt;/span&gt; &lt;span&gt;string&lt;/span&gt; Name { &lt;span&gt;get&lt;/span&gt;; &lt;span&gt;set&lt;/span&gt;; }
}&lt;/pre&gt;&lt;a href="http://11011.net/software/vspaste"&gt;&lt;/a&gt;
&lt;p&gt;The example illustrates that there are some built-in conditional attributes for basic argument checking, such as &lt;em&gt;InRequiredAttribute&lt;/em&gt;, &lt;em&gt;OutRequiredAttribute&lt;/em&gt; and &lt;em&gt;ReturnRequiredAttribute&lt;/em&gt;, which throw an exception when an argument (or in the case of the latter two, output parameters and a return value) are null.&amp;nbsp; I plan to add more conditions in the future, and the framework was designed to be flexible enough so that you can define your own conditions as well.&lt;/p&gt;
&lt;h5&gt;Custom Conditions&lt;/h5&gt;
&lt;p&gt;To define a new condition, create a class that derives from either &lt;em&gt;PreConditionBaseAttribute&lt;/em&gt;, &lt;em&gt;PostConditionBaseAttribute&lt;/em&gt; or &lt;em&gt;ConditionBaseAttribute&lt;/em&gt; and override the abstract members.&amp;nbsp; Usage should be intuitive depending upon the implementation that you need, but you can look at the source code for &lt;a href="http://www.codeplex.com/ContractN/SourceControl/FileView.aspx?itemId=207569&amp;amp;changeSetId=16077"&gt;InRequiredAttribute&lt;/a&gt; (beta 1) as an example.&lt;/p&gt;
&lt;h5&gt;Dynamic Conditions&lt;/h5&gt;
&lt;p&gt;I decided to take a different approach than Sasha in terms of how dynamic conditions are implemented.&amp;nbsp; I wanted to take advantage of static type checking instead of hard-coding constraints as strings.&amp;nbsp; &lt;em&gt;PreConditionAttribute&lt;/em&gt; and &lt;em&gt;PostConditionAttribute&lt;/em&gt; allow you to specify a method name on the decorated type that will be invoked automatically whenever any public method is called.&amp;nbsp; That also includes constructors and accessors for properties and events.&amp;nbsp; (Note that these attributes are also valid on a property, constructor, method or event.)&amp;nbsp; The method signature can vary depending upon your needs; generally it will be a parameterless instance method, though static methods are allowed as well.&amp;nbsp; The types of arguments that are accepted encapsulate information about a particular invocation.&amp;nbsp; For example, you could define a method that accepts an argument typed as &lt;em&gt;ContractN.PropertyCall&lt;/em&gt; and the method will be invoked automatically whenever a property get or set accessor is invoked, pre- or post-invocation depending upon the attribute used.&amp;nbsp; Within these methods you can write code that will actually be part of the class that it's meant to constrain, which maintains encapsulation, makes it easy to share code between constraints and allows access to state with compiler support.&lt;/p&gt;
&lt;p&gt;Here's a more sophisticated example than above.&amp;nbsp; It makes use of pre- and post-conditions described above and also implements ad-hoc conditions by providing an implementation of &lt;em&gt;ICondition&lt;/em&gt;: &lt;/p&gt;&lt;pre class="code"&gt;[&lt;span&gt;PreCondition&lt;/span&gt;(&lt;span&gt;"TestStatic"&lt;/span&gt;)]
[&lt;span&gt;PreCondition&lt;/span&gt;(&lt;span&gt;"TestInstance"&lt;/span&gt;)]
&lt;span&gt;class&lt;/span&gt; &lt;span&gt;AdvancedFeatures&lt;/span&gt; : &lt;span&gt;ProgrammingByContract&lt;/span&gt;, &lt;span&gt;ICondition
&lt;/span&gt;{
&lt;span&gt;    #region&lt;/span&gt; Public Properties
    &lt;span&gt;public&lt;/span&gt; &lt;span&gt;string&lt;/span&gt; TestProperty { &lt;span&gt;get&lt;/span&gt;; &lt;span&gt;set&lt;/span&gt;; }
&lt;span&gt;    #endregion
&lt;/span&gt;&lt;span&gt;
    #region&lt;/span&gt; Methods
    &lt;span&gt;private&lt;/span&gt; &lt;span&gt;static&lt;/span&gt; &lt;span&gt;void&lt;/span&gt; TestStatic(&lt;span&gt;PropertyCall&lt;/span&gt; info)
    {
        &lt;span&gt;Console&lt;/span&gt;.WriteLine(&lt;span&gt;"Pre Static Property: {0}"&lt;/span&gt;, info);
    }

    &lt;span&gt;private&lt;/span&gt; &lt;span&gt;static&lt;/span&gt; &lt;span&gt;void&lt;/span&gt; TestStatic(&lt;span&gt;MethodCallBase&lt;/span&gt; info)
    {
        &lt;span&gt;Console&lt;/span&gt;.WriteLine(&lt;span&gt;"Pre Static Default: {0}"&lt;/span&gt;, info);
    }

    &lt;span&gt;private&lt;/span&gt; &lt;span&gt;void&lt;/span&gt; TestInstance(&lt;span&gt;MethodCallBase&lt;/span&gt; info)
    {
        &lt;span&gt;Console&lt;/span&gt;.WriteLine(&lt;span&gt;"Pre Instance Default: {0}"&lt;/span&gt;, info);
    }

    &lt;span&gt;public&lt;/span&gt; &lt;span&gt;void&lt;/span&gt; NoOperation()
    {
    }
&lt;span&gt;    #endregion

    #region&lt;/span&gt; IPreCondition Members
    &lt;span&gt;void&lt;/span&gt; &lt;span&gt;IPreCondition&lt;/span&gt;.Apply(&lt;span&gt;ConstructorCall&lt;/span&gt; info)
    {
        &lt;span&gt;Console&lt;/span&gt;.WriteLine(&lt;span&gt;"Pre: {0}"&lt;/span&gt;, info);
    }

    &lt;span&gt;void&lt;/span&gt; &lt;span&gt;IPreCondition&lt;/span&gt;.Apply(&lt;span&gt;MethodCall&lt;/span&gt; info)
    {
        &lt;span&gt;Console&lt;/span&gt;.WriteLine(&lt;span&gt;"Pre: {0}"&lt;/span&gt;, info);
    }

    &lt;span&gt;void&lt;/span&gt; &lt;span&gt;IPreCondition&lt;/span&gt;.Apply(&lt;span&gt;PropertyCall&lt;/span&gt; info)
    {
        &lt;span&gt;Console&lt;/span&gt;.WriteLine(&lt;span&gt;"Pre: {0}"&lt;/span&gt;, info);
    }

    &lt;span&gt;void&lt;/span&gt; &lt;span&gt;IPreCondition&lt;/span&gt;.Apply(&lt;span&gt;EventRegistrationCall&lt;/span&gt; info)
    {
        &lt;span&gt;Console&lt;/span&gt;.WriteLine(&lt;span&gt;"Pre: {0}"&lt;/span&gt;, info);
    }
&lt;span&gt;    #endregion

    #region&lt;/span&gt; IPostCondition Members
    &lt;span&gt;void&lt;/span&gt; &lt;span&gt;IPostCondition&lt;/span&gt;.Apply(&lt;span&gt;ConstructorCall&lt;/span&gt; info, &lt;span&gt;MethodCallReturn&lt;/span&gt; returnInfo)
    {
        &lt;span&gt;Console&lt;/span&gt;.WriteLine(&lt;span&gt;"Post: {0}"&lt;/span&gt;, info);
    }

    &lt;span&gt;void&lt;/span&gt; &lt;span&gt;IPostCondition&lt;/span&gt;.Apply(&lt;span&gt;MethodCall&lt;/span&gt; info, &lt;span&gt;MethodCallReturn&lt;/span&gt; returnInfo)
    {
        &lt;span&gt;Console&lt;/span&gt;.WriteLine(&lt;span&gt;"Post: {0}"&lt;/span&gt;, info);
    }

    &lt;span&gt;void&lt;/span&gt; &lt;span&gt;IPostCondition&lt;/span&gt;.Apply(&lt;span&gt;PropertyCall&lt;/span&gt; info, &lt;span&gt;MethodCallReturn&lt;/span&gt; returnInfo)
    {
        &lt;span&gt;Console&lt;/span&gt;.WriteLine(&lt;span&gt;"Post: {0}"&lt;/span&gt;, info);
    }
    
    &lt;span&gt;void&lt;/span&gt; &lt;span&gt;IPostCondition&lt;/span&gt;.Apply(&lt;span&gt;EventRegistrationCall&lt;/span&gt; info, &lt;span&gt;MethodCallReturn&lt;/span&gt; returnInfo)
    {
        &lt;span&gt;Console&lt;/span&gt;.WriteLine(&lt;span&gt;"Post: {0}"&lt;/span&gt;, info);
    }
&lt;span&gt;    #endregion
&lt;/span&gt;}&lt;/pre&gt;
&lt;p&gt;When the above class is used as follows: &lt;/p&gt;&lt;pre class="code"&gt;&lt;span&gt;AdvancedFeatures&lt;/span&gt; features = &lt;span&gt;new&lt;/span&gt; &lt;span&gt;AdvancedFeatures&lt;/span&gt;();
features.TestProperty = &lt;span&gt;"A test value"&lt;/span&gt;;
features.NoOperation();&lt;/pre&gt;&lt;a href="http://11011.net/software/vspaste"&gt;&lt;/a&gt;
&lt;p&gt;The console output is: &lt;/p&gt;
&lt;p&gt;&lt;pre&gt;Pre Static Default: ContractN.ConstructorCall&lt;br&gt;Post: ContractN.ConstructorCall&lt;br&gt;Pre: ContractN.PropertyCall&lt;br&gt;Pre Instance Default: ContractN.PropertyCall&lt;br&gt;Pre Static Property: ContractN.PropertyCall&lt;br&gt;Post: ContractN.PropertyCall&lt;br&gt;Pre: ContractN.MethodCall&lt;br&gt;Pre Instance Default: ContractN.MethodCall&lt;br&gt;Pre Static Default: ContractN.MethodCall&lt;br&gt;Post: ContractN.MethodCall&lt;/pre&gt;
&lt;p&gt;One of the really neat uses for the &lt;em&gt;PreConditionAttribute&lt;/em&gt; that I've found is to have &lt;strong&gt;ObjectDisposedException&lt;/strong&gt; automatically thrown instead of having to check for it everywhere.&amp;nbsp; Here's an example that builds off of the &lt;em&gt;Person&lt;/em&gt; class in my first example: &lt;/p&gt;&lt;pre class="code"&gt;[&lt;span&gt;PreCondition&lt;/span&gt;(&lt;span&gt;"NotDisposed"&lt;/span&gt;)]
&lt;span&gt;public&lt;/span&gt; &lt;span&gt;class&lt;/span&gt; &lt;span&gt;Person&lt;/span&gt; : ContractN.&lt;span&gt;ProgrammingByContract&lt;/span&gt;, &lt;span&gt;IDisposable
&lt;/span&gt;{
    [&lt;span&gt;InRequired&lt;/span&gt;, &lt;span&gt;OutRequired&lt;/span&gt;]
    &lt;span&gt;public&lt;/span&gt; &lt;span&gt;string&lt;/span&gt; Name { &lt;span&gt;get&lt;/span&gt;; &lt;span&gt;set&lt;/span&gt;; }

    &lt;span&gt;private&lt;/span&gt; &lt;span&gt;bool&lt;/span&gt; disposed;

    &lt;span&gt;private&lt;/span&gt; &lt;span&gt;void&lt;/span&gt; NotDisposed()
    {
        &lt;span&gt;if&lt;/span&gt; (disposed)
            &lt;span&gt;throw&lt;/span&gt; &lt;span&gt;new&lt;/span&gt; &lt;span&gt;ObjectDisposedException&lt;/span&gt;(&lt;span&gt;this&lt;/span&gt;.GetType().FullName);
    }

    &lt;span&gt;public&lt;/span&gt; &lt;span&gt;void&lt;/span&gt; Dispose()
    {
        disposed = &lt;span&gt;true&lt;/span&gt;;
    }
}&lt;/pre&gt;
&lt;p&gt;After the &lt;em&gt;Dispose&lt;/em&gt; method is called, public members are no longer accessible to external types.&amp;nbsp; All calls will result in &lt;em&gt;ObjectDisposedException&lt;/em&gt; automatically!&lt;/p&gt;
&lt;h5&gt;Conclusion&lt;/h5&gt;
&lt;p&gt;ContractN is more of a hobby project for me now than anything else, but it has potential and I'd really like to see it blossom into something useful.&amp;nbsp; If you have any suggestions for improvements please let me know and I'll consider them for the next beta release.&amp;nbsp; (I'm going to establish a timeline on-the-fly as I get ideas for features.)&amp;nbsp; I have some interesting ideas for new conditions and I hope to blog about them in the future, so don't wander too far off if you're interested...&lt;/p&gt;&lt;img src="http://davesexton.com/blog/aggbug.aspx?PostID=111" width="1" height="1"&gt;</description><category domain="http://davesexton.com/blog/blogs/blog/archive/tags/.NET/default.aspx">.NET</category><category domain="http://davesexton.com/blog/blogs/blog/archive/tags/C_2300_/default.aspx">C#</category><category domain="http://davesexton.com/blog/blogs/blog/archive/tags/Open+Source/default.aspx">Open Source</category><category domain="http://davesexton.com/blog/blogs/blog/archive/tags/Betas/default.aspx">Betas</category><category domain="http://davesexton.com/blog/blogs/blog/archive/tags/ContractN/default.aspx">ContractN</category></item><item><title>DocProject in the Visual Studio Gallery</title><link>http://davesexton.com/blog/blogs/blog/archive/2008/02/27/docproject-in-the-visual-studio-gallery.aspx</link><pubDate>Thu, 28 Feb 2008 01:28:05 GMT</pubDate><guid isPermaLink="false">5b5c6d2b-d071-4bf8-ac28-4f9cd768b39b:110</guid><dc:creator>Dave Sexton</dc:creator><slash:comments>0</slash:comments><description>&lt;p&gt;Microsoft's &lt;a href="http://visualstudiogallery.com/"&gt;Visual Studio Gallery&lt;/a&gt; was &lt;a href="http://blogs.msdn.com/vsxteam/archive/2008/02/27/Visual-Studio-Gallery-announced.aspx"&gt;announced to the public&lt;/a&gt; today.&amp;nbsp; It provides a one-stop-shop for Visual Studio add-ins, packages, item and project templates, macros, controls, coffee makers, toasters, etc.&amp;nbsp; I think it's a great idea.&amp;nbsp; Google can only help so much here (have you tried searching for "visual studio add-ins"? ;)&lt;/p&gt; &lt;p&gt;Anyone can register their &lt;em&gt;free&lt;/em&gt; or &lt;em&gt;paid&lt;/em&gt; products, so if you've got one, let the world know!&lt;/p&gt; &lt;p&gt;I've added DocProject under the &lt;em&gt;Build&lt;/em&gt;, &lt;em&gt;Documentation &lt;/em&gt;and &lt;em&gt;Web &lt;/em&gt;categories.&amp;nbsp; It has its own little HTML-formatted corner of the site too, which is a cool feature I think.&amp;nbsp; Take a look at it &lt;a href="http://visualstudiogallery.com/ExtensionDetails.aspx?ExtensionId=0586c442-6114-4071-8135-5244bb1e858e"&gt;here&lt;/a&gt;.&amp;nbsp; It already has over 150 unique views!&lt;/p&gt; &lt;p&gt;Currently, the site does not host products so I simply link back to CodePlex (although I love CodePlex so I have no intention of leaving anytime soon).&lt;/p&gt; &lt;p&gt;From my few short discussions with the site's program manager, Anthony, I'd say that they have some good ideas to work with for the future.&amp;nbsp; Features that'll make locating products and adding new products easier.&amp;nbsp; So remember to look back occasionally for updates in the next few months.&lt;/p&gt;&lt;img src="http://davesexton.com/blog/aggbug.aspx?PostID=110" width="1" height="1"&gt;</description><category domain="http://davesexton.com/blog/blogs/blog/archive/tags/Microsoft/default.aspx">Microsoft</category><category domain="http://davesexton.com/blog/blogs/blog/archive/tags/Visual+Studio/default.aspx">Visual Studio</category><category domain="http://davesexton.com/blog/blogs/blog/archive/tags/Community+Components/default.aspx">Community Components</category><category domain="http://davesexton.com/blog/blogs/blog/archive/tags/DocProject/default.aspx">DocProject</category><category domain="http://davesexton.com/blog/blogs/blog/archive/tags/Open+Source/default.aspx">Open Source</category><category domain="http://davesexton.com/blog/blogs/blog/archive/tags/Visual+Studio+2008/default.aspx">Visual Studio 2008</category></item><item><title>DocProject 1.10.1 Release Candidate Is Now Available</title><link>http://davesexton.com/blog/blogs/blog/archive/2008/02/27/docproject-1-10-1-release-candidate-is-now-available.aspx</link><pubDate>Wed, 27 Feb 2008 11:30:06 GMT</pubDate><guid isPermaLink="false">5b5c6d2b-d071-4bf8-ac28-4f9cd768b39b:108</guid><dc:creator>Dave Sexton</dc:creator><slash:comments>0</slash:comments><description>&lt;p&gt;The &lt;a href="https://www.codeplex.com/Release/ProjectReleases.aspx?ProjectName=DocProject&amp;amp;ReleaseId=11008"&gt;DocProject 1.10.1 Release Candidate&lt;/a&gt; is now available for download on CodePlex.  &lt;p&gt;This release contains some important bug fixes for 1.10.0 RC.&amp;nbsp; One of which, it was reported, prevented the DocProject Add-In from working at all on some installations of Visual Studio (the &lt;em&gt;Project&lt;/em&gt; context menu could not be located).  &lt;p&gt;It also provides built-in support for &lt;a href="http://davesexton.com/blog/blogs/blog/archive/2008/02/27/resolveexternallinkscomponent.aspx"&gt;ResolveExternalLinksComponent&lt;/a&gt;, which has been updated to include support for URL mapping provider editors and a built-in database URL mapping provider, among other features and bug fixes. The stand-alone component will be released later this week.&lt;/p&gt;&lt;img src="http://davesexton.com/blog/aggbug.aspx?PostID=108" width="1" height="1"&gt;</description><category domain="http://davesexton.com/blog/blogs/blog/archive/tags/Sandcastle/default.aspx">Sandcastle</category><category domain="http://davesexton.com/blog/blogs/blog/archive/tags/DocProject/default.aspx">DocProject</category></item><item><title>ResolveExternalLinksComponent</title><link>http://davesexton.com/blog/blogs/blog/archive/2008/02/27/resolveexternallinkscomponent.aspx</link><pubDate>Wed, 27 Feb 2008 11:01:08 GMT</pubDate><guid isPermaLink="false">5b5c6d2b-d071-4bf8-ac28-4f9cd768b39b:106</guid><dc:creator>Dave Sexton</dc:creator><slash:comments>2</slash:comments><description>&lt;p&gt;&lt;a href="https://www.codeplex.com/Release/ProjectReleases.aspx?ProjectName=DocProject&amp;amp;ReleaseId=11102"&gt;ResolveExternalLinksComponent&lt;/a&gt; is a &lt;a href="http://blogs.msdn.com/sandcastle/archive/2006/08/14/699129.aspx"&gt;Sandcastle build component&lt;/a&gt; that I wrote to solve a general usability problem that was &lt;a href="http://www.codeplex.com/Sandcastle/Thread/View.aspx?ThreadId=22152"&gt;reported here&lt;/a&gt;, by Karl, and to &lt;em&gt;dog food&lt;/em&gt; my &lt;a href="http://davesexton.com/blog/blogs/blog/archive/2008/02/13/sandcastle-build-component-templates-1-1-released.aspx"&gt;Hosted Sandcastle Build Component Template&lt;/a&gt;.&amp;nbsp; The component's current behavior was designed with Karl's help.&amp;nbsp; Thanks Karl :)  &lt;p&gt;Preliminary documentation for the component is &lt;a href="http://www.codeplex.com/DocProject/Wiki/View.aspx?title=ResolveExternalLinksComponent"&gt;here&lt;/a&gt;.  &lt;p&gt;Note that the latest release of the component is built-in to &lt;a href="https://www.codeplex.com/Release/ProjectReleases.aspx?ProjectName=DocProject&amp;amp;ReleaseId=11008"&gt;DocProject 1.10.1&lt;/a&gt; - a separate download is &lt;em&gt;not&lt;/em&gt; required.&amp;nbsp; When you create a new &lt;em&gt;DocProject &lt;/em&gt;or &lt;em&gt;DocSite &lt;/em&gt;the component will be included automatically in the Help1.x and Help 2.x &lt;em&gt;reference&lt;/em&gt; stacks so that you can begin to use its features right away in your XML documentation comments&lt;em&gt;.&lt;/em&gt;  &lt;h4&gt;Overview&lt;/h4&gt; &lt;p&gt;The original problem, to paraphrase, was that Karl had to keep writing repetitive URLs for &lt;strong&gt;&amp;lt;see href="url"/&amp;gt; &lt;/strong&gt;links throughout his XML documentation comments.&amp;nbsp; The common URLs he was using pointed to third-party online documentation and each URL shared the same base, so only the relative portion changed between links.&amp;nbsp; To simplify the process he wanted to write only the relative path each time a link was required, specify the base URL only once, somewhere else, and then have some magic combine them into an absolute path, post-compilation.  &lt;p&gt;As it turns out, a Sandcastle build component was right for the job.  &lt;p&gt;I liked the idea of using IDs instead of hard-coding common URLs throughout the documentation and felt that this would be a feature that I might use, so I developed the component to resolve &lt;em&gt;&amp;lt;see &lt;strong&gt;xref&lt;/strong&gt;="&lt;strong&gt;id&lt;/strong&gt;"/&amp;gt; &lt;/em&gt;into hyperlinks using pre-configured ID-to-URL mappings.&amp;nbsp; For Karl's particular scenario I added support for the &lt;strong&gt;vref&lt;/strong&gt; attribute, which adds additional semantics to the ID so that it will act as the URL itself if a mapping is not defined.  &lt;p&gt;During development I noticed a few opportunities to add more features, which I did, like being able to associate a group of ID-to-URL mappings with any combination of optional attributes.&amp;nbsp;&amp;nbsp; In particular, a base URL, hyperlink target, auto-generated reference topic ID or import file.&amp;nbsp; The component allows for any number of mapping groups with any combination of these attributes, allowing for some pretty interesting scenarios.  &lt;p&gt;For example, in one scenario you might define common URLs as IDs for all of your documentation but then override the URLs in one particular topic to point elsewhere, without even having to modify the XML comments in the API.  &lt;p&gt;Another possibility would be to group mappings by hyperlink &lt;em&gt;target&lt;/em&gt;.&amp;nbsp; So, for example, you could set the default target for all mapped links to open in the same browser frame when clicked but then configure a group of links that reference a third-party website to open in a &lt;em&gt;new&lt;/em&gt; browser window when clicked.  &lt;p&gt;The component has a graphical editor that works in &lt;a title="DocProject on CodePlex" href="http://www.codeplex.com/DocProject"&gt;DocProject&lt;/a&gt; and the &lt;a href="http://www.codeplex.com/SHFB"&gt;Sandcastle Help File Builder&lt;/a&gt;, which makes configuring it really simple.&amp;nbsp; It also provides a few DocProject-specific features, such as providing a list of topic IDs that you can choose from, defaulting to the project's settings directory when using an external mappings file, using a relative path to an external mappings file, automatically including an external mappings file as a project item and expansion options for &lt;em&gt;build component stacks &lt;/em&gt;in the DocProject Properties window.  &lt;h4&gt;What's New In Beta 2&lt;/h4&gt; &lt;p&gt;The next release has a few bug fixes and some neat features that I'd like to mention here.&amp;nbsp; You can read about additional updates on the &lt;a href="https://www.codeplex.com/Release/ProjectReleases.aspx?ProjectName=DocProject&amp;amp;ReleaseId=11102"&gt;release page&lt;/a&gt;.&lt;/p&gt; &lt;p&gt;First, I've added support for resolving IDs to URLs that are stored in a database.&amp;nbsp; (See the section on &lt;em&gt;URL Mapping Providers&lt;/em&gt; below for more information.)&lt;/p&gt; &lt;p&gt;You can now use &lt;em&gt;xref &lt;/em&gt;and &lt;em&gt;vref&lt;/em&gt; attributes on &lt;strong&gt;seealso &lt;/strong&gt;tags as well; although, due to a current limitation in Sandcastle, the &lt;strong&gt;target&lt;/strong&gt; attribute will be ignored.&amp;nbsp; However, if Sandcastle eventually supports the &lt;em&gt;target &lt;/em&gt;attribute on &lt;em&gt;seealso &lt;/em&gt;tags then my component should work without having to be rebuilt.  &lt;p&gt;The editor now provides the ability to edit the &lt;strong&gt;base&lt;/strong&gt; and &lt;strong&gt;target&lt;/strong&gt; attributes on the &lt;em&gt;component&lt;/em&gt; element.  &lt;p&gt;In DocProject, if you configure an external mappings file then it will be included as a project item automatically.&amp;nbsp; Also, you can use the open file dialog to specify the name of a file that doesn't actually exist and it will be created when the editor is closed.&amp;nbsp; The path of the file will be made relative to DocProject's working directory.  &lt;h4&gt;URL Mapping Providers&lt;/h4&gt; &lt;p&gt;The common way to define a group of mappings is to add them to the component's XML configuration using the &lt;strong&gt;mappings&lt;/strong&gt; and &lt;strong&gt;url&lt;/strong&gt; elements.&amp;nbsp; The class that parses &lt;em&gt;url &lt;/em&gt;elements is, &lt;strong&gt;XmlUrlMappingProvider&lt;/strong&gt;, and as you may have already guessed, it's a specialization of the abstract base class, &lt;strong&gt;UrlMappingProvider&lt;/strong&gt;.&amp;nbsp; Here's what a common configuration might look like: &lt;/p&gt;&lt;pre class="code"&gt;&lt;span&gt;&amp;lt;&lt;/span&gt;&lt;span&gt;component&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;type&lt;/span&gt;&lt;span&gt;=&lt;/span&gt;"&lt;span&gt;DaveSexton.Sandcastle.ResolveExternalLinksComponent&lt;/span&gt;"
&lt;span&gt;           &lt;/span&gt;&lt;span&gt;assembly&lt;/span&gt;&lt;span&gt;=&lt;/span&gt;"&lt;span&gt;C:\...\DaveSexton.Sandcastle.dll&lt;/span&gt;"&lt;span&gt;&amp;gt;
  &amp;lt;&lt;/span&gt;&lt;span&gt;mappings&lt;/span&gt;&lt;span&gt;&amp;gt;
    &amp;lt;&lt;/span&gt;&lt;span&gt;url&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;id&lt;/span&gt;&lt;span&gt;=&lt;/span&gt;"&lt;span&gt;home&lt;/span&gt;"&lt;span&gt; &lt;/span&gt;&lt;span&gt;href&lt;/span&gt;&lt;span&gt;=&lt;/span&gt;"&lt;span&gt;http://davesexton.com&lt;/span&gt;"&lt;span&gt; /&amp;gt;
    &amp;lt;&lt;/span&gt;&lt;span&gt;url&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;id&lt;/span&gt;&lt;span&gt;=&lt;/span&gt;"&lt;span&gt;contact&lt;/span&gt;"&lt;span&gt; &lt;/span&gt;&lt;span&gt;href&lt;/span&gt;&lt;span&gt;=&lt;/span&gt;"&lt;span&gt;http://davesexton.com/Contact&lt;/span&gt;"&lt;span&gt; /&amp;gt;
  &amp;lt;/&lt;/span&gt;&lt;span&gt;mappings&lt;/span&gt;&lt;span&gt;&amp;gt;
&amp;lt;/&lt;/span&gt;&lt;span&gt;component&lt;/span&gt;&lt;span&gt;&amp;gt;&lt;/span&gt;&lt;/pre&gt;&lt;a href="http://11011.net/software/vspaste"&gt;&lt;/a&gt;
&lt;p&gt;You can create your own custom providers as well.&amp;nbsp; To use them simply specify the full type name and path to the assembly using the &lt;strong&gt;type &lt;/strong&gt;and &lt;strong&gt;assembly &lt;/strong&gt;attributes, respectively, on the &lt;em&gt;mappings&lt;/em&gt; element.&amp;nbsp; The outer XML of the &lt;em&gt;mappings&lt;/em&gt; element will be supplied to your provider as raw text.&lt;/p&gt;
&lt;p&gt;URL mapping providers can have a UI that will be displayed in the component's editor to easily modify the provider's configuration.&amp;nbsp; The built-in &lt;em&gt;XmlUrlMappingProvider &lt;/em&gt;uses a simple &lt;strong&gt;DataGridView&lt;/strong&gt; for editing the &lt;em&gt;url&lt;/em&gt; elements.&lt;/p&gt;
&lt;h5&gt;DatabaseUrlMappingProvider&lt;/h5&gt;
&lt;p&gt;&lt;strong&gt;DatabaseUrlMappingProvider&lt;/strong&gt; is a new provider as of DocProject 1.10.1 and the ResolveExternalLinksComponent Beta 2 release.&amp;nbsp; It allows you to define ID-to-URL mappings in a database table instead of the inner XML of a &lt;em&gt;mappings&lt;/em&gt; element.&lt;/p&gt;
&lt;p&gt;This provider could be useful in scenarios where you already have URLs stored in a database or when you have a large number of URLs that must be shared between multiple tools, whether related to documentation or not.&lt;/p&gt;
&lt;p&gt;A custom editor that allows you to configure the provider is embedded into the component's editor.&amp;nbsp; With it you can easily specify the data provider, connection string, query, parameters and other settings all in one place: &lt;/p&gt;
&lt;p&gt;&lt;img style="margin:0px;" height="492" alt="DatabaseUrlMappingProvider Editor" src="http://davesexton.com/Images/Blog/ResolveReferenceLinksComponent_45B6/DatabaseUrlMappingProviderEditor.jpg" width="578" border="0"&gt; &lt;/p&gt;
&lt;p&gt;Here's an example configuration that might be used with this provider: &lt;/p&gt;&lt;pre class="code"&gt;&lt;span&gt;&amp;lt;&lt;/span&gt;&lt;span&gt;component&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;type&lt;/span&gt;&lt;span&gt;=&lt;/span&gt;"&lt;span&gt;DaveSexton.Sandcastle.ResolveExternalLinksComponent&lt;/span&gt;"
&lt;span&gt;           &lt;/span&gt;&lt;span&gt;assembly&lt;/span&gt;&lt;span&gt;=&lt;/span&gt;"&lt;span&gt;%DocProjectBuildPath%\DaveSexton.Sandcastle.dll&lt;/span&gt;"&lt;span&gt;&amp;gt;
  &amp;lt;&lt;/span&gt;&lt;span&gt;mappings&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;type&lt;/span&gt;&lt;span&gt;=&lt;/span&gt;"&lt;span&gt;DaveSexton.Sandcastle.DatabaseUrlMappingProvider&lt;/span&gt;"
&lt;span&gt;            &lt;/span&gt;&lt;span&gt;topic&lt;/span&gt;&lt;span&gt;=&lt;/span&gt;"&lt;span&gt;M:SomeNamespace.SomeType.DocumentedMethod(System.String)&lt;/span&gt;"&lt;span&gt;&amp;gt;
    &amp;lt;&lt;/span&gt;&lt;span&gt;connection&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;provider&lt;/span&gt;&lt;span&gt;=&lt;/span&gt;"&lt;span&gt;System.Data.SqlClient&lt;/span&gt;"&lt;span&gt;&amp;gt;
&lt;/span&gt;      Data Source=DEV1\SQLEXPRESS;Initial Catalog=Docs;Integrated Security=True
&lt;span&gt;    &amp;lt;/&lt;/span&gt;&lt;span&gt;connection&lt;/span&gt;&lt;span&gt;&amp;gt;
    &amp;lt;&lt;/span&gt;&lt;span&gt;query&lt;/span&gt;&lt;span&gt;&amp;gt;
&lt;/span&gt;      SELECT ID, HREF FROM UrlMappings WHERE TopicID = @TopicID;
&lt;span&gt;    &amp;lt;/&lt;/span&gt;&lt;span&gt;query&lt;/span&gt;&lt;span&gt;&amp;gt;
    &amp;lt;&lt;/span&gt;&lt;span&gt;parameters&lt;/span&gt;&lt;span&gt;&amp;gt;
      &amp;lt;&lt;/span&gt;&lt;span&gt;parameter&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;name&lt;/span&gt;&lt;span&gt;=&lt;/span&gt;"&lt;span&gt;@TopicID&lt;/span&gt;"&lt;span&gt; &lt;/span&gt;&lt;span&gt;source&lt;/span&gt;&lt;span&gt;=&lt;/span&gt;"&lt;span&gt;TopicID&lt;/span&gt;"&lt;span&gt; /&amp;gt;
    &amp;lt;/&lt;/span&gt;&lt;span&gt;parameters&lt;/span&gt;&lt;span&gt;&amp;gt;
  &amp;lt;/&lt;/span&gt;&lt;span&gt;mappings&lt;/span&gt;&lt;span&gt;&amp;gt;
&amp;lt;/&lt;/span&gt;&lt;span&gt;component&lt;/span&gt;&lt;span&gt;&amp;gt;&lt;/span&gt;&lt;/pre&gt;&lt;a href="http://11011.net/software/vspaste"&gt;&lt;/a&gt;
&lt;p&gt;The component can use any of the built-in Framework data providers (e.g, Odbc, OleDb, SqlClient) or even plug-ins such as Oracle.&lt;/p&gt;
&lt;p&gt;Parameterized textual queries and stored procedures are supported, but only the first result set is used.&amp;nbsp; By default the provider will look for &lt;em&gt;ID&lt;/em&gt; and &lt;em&gt;HREF&lt;/em&gt; columns, but you can specify different names.&lt;/p&gt;
&lt;p&gt;Parameters can have hard-coded values or they can be mapped to a specific source.&amp;nbsp; In the example above the value of the &lt;em&gt;topic&lt;/em&gt; attribute will be used as the value for the &lt;em&gt;@TopicID&lt;/em&gt; parameter.&amp;nbsp; The other acceptable values for the &lt;strong&gt;source&lt;/strong&gt; attribute are: &lt;strong&gt;BaseUrl&lt;/strong&gt;, &lt;strong&gt;File &lt;/strong&gt;and &lt;strong&gt;Target&lt;/strong&gt;, which also correspond to attributes on the &lt;em&gt;mappings&lt;/em&gt; element.&amp;nbsp; To define a specific value for a parameter use the &lt;strong&gt;value &lt;/strong&gt;attribute instead of &lt;em&gt;source&lt;/em&gt;.&lt;/p&gt;&lt;img src="http://davesexton.com/blog/aggbug.aspx?PostID=106" width="1" height="1"&gt;</description><category domain="http://davesexton.com/blog/blogs/blog/archive/tags/Sandcastle/default.aspx">Sandcastle</category><category domain="http://davesexton.com/blog/blogs/blog/archive/tags/DocProject/default.aspx">DocProject</category></item><item><title>Sandcastle Build Component Templates 1.1 Released</title><link>http://davesexton.com/blog/blogs/blog/archive/2008/02/13/sandcastle-build-component-templates-1-1-released.aspx</link><pubDate>Wed, 13 Feb 2008 05:03:23 GMT</pubDate><guid isPermaLink="false">5b5c6d2b-d071-4bf8-ac28-4f9cd768b39b:98</guid><dc:creator>Dave Sexton</dc:creator><slash:comments>1</slash:comments><description>&lt;p&gt;The &lt;a href="https://www.codeplex.com/Release/ProjectReleases.aspx?ProjectName=DocProject&amp;amp;ReleaseId=8349"&gt;Sandcastle Build Component Templates 1.1&lt;/a&gt; release provides two&lt;em&gt; C# Item Templates&lt;/em&gt; that you can use to easily create custom &lt;a href="http://blogs.msdn.com/sandcastle/archive/2006/08/14/699129.aspx"&gt;Sandcastle Build Components&lt;/a&gt; in &lt;em&gt;Visual Studio 2005&lt;/em&gt; and &lt;em&gt;Visual Studio 2008.&lt;/em&gt;&lt;/p&gt; &lt;p&gt;In this blog post I intend to provide some details about the templates, with more focus on &lt;em&gt;hosted &lt;/em&gt;components and DocProject's API&lt;em&gt;.&amp;nbsp; &lt;/em&gt;Instructions for template installation and usage can be found &lt;a href="http://www.codeplex.com/DocProject/Wiki/View.aspx?title=Sandcastle%20Build%20Component%20Templates"&gt;here&lt;/a&gt;.&lt;/p&gt; &lt;h4&gt;Basic Sandcastle Build Component Item Template&lt;/h4&gt; &lt;p&gt;The &lt;strong&gt;Basic Sandcastle Build Component&lt;/strong&gt; item template is a multi-file &lt;em&gt;Visual Studio Item Template&lt;/em&gt;, written in C#, that provides a working example of a custom build component that can be used for command-line builds or with editor support in automation tools such as &lt;a title="DocProject on CodePlex" href="http://www.codeplex.com/DocProject"&gt;DocProject&lt;/a&gt; and the &lt;a href="http://www.codeplex.com/SHFB"&gt;Sandcastle Help File Builder&lt;/a&gt;.&amp;nbsp; It comes with a built-in graphical editor and a dynamic sub property for the &lt;em&gt;DocProject Properties&lt;/em&gt; window, which can be shown by expanding the component in a &lt;em&gt;build component stack &lt;/em&gt;(for more information about the &lt;em&gt;stack&lt;/em&gt; properties, see &lt;a href="http://www.codeplex.com/DocProject/Wiki/View.aspx?title=How%20To%20Use%20Third-Party%20Sandcastle%20Components%20in%20DocProject"&gt;How To Use Third-Party Sandcastle Components in DocProject&lt;/a&gt;)&lt;em&gt;.&lt;/em&gt;&lt;/p&gt; &lt;h4&gt;Hosted Sandcastle Build Component Item Template&lt;/h4&gt; &lt;p&gt;The &lt;strong&gt;Hosted Sandcastle Build Component&lt;/strong&gt; item template is the same as the &lt;em&gt;basic &lt;/em&gt;template, but it also provides direct access and a working example of how to gather information from DocProject's API, thus DocProject is required in order to compile the build components that are created based on this template.&amp;nbsp; Although, DocProject isn't actually required to &lt;em&gt;use&lt;/em&gt; the components if you provide a fall-back initialization path.&lt;/p&gt; &lt;h5&gt;Initialization Paths&lt;/h5&gt; &lt;p&gt;The template's &lt;em&gt;Configuration&lt;/em&gt; class provides two initialization paths, one of which is a fall-back that's automatically invoked if the DocProject host API is not detected.&lt;/p&gt; &lt;p&gt;&lt;strong&gt;Note:&lt;/strong&gt; The host API is &lt;em&gt;never&lt;/em&gt; available during builds - it's only available when the component's editor is displayed.&lt;/p&gt; &lt;p&gt;Fall-back initialization works since the template depends upon just-in-time (JIT) compilation.&amp;nbsp; If you properly encapsulate the use of host interfaces, as the template does out-of-the-box, then you can control the initialization path of the component's &lt;em&gt;Configuration&lt;/em&gt; class.&lt;/p&gt; &lt;p&gt;The template's &lt;em&gt;Host&lt;/em&gt; class is used to encapsulate host interfaces and services, and it provides a way to safely check, at runtime, whether a particular host is reachable.&amp;nbsp; Support for DocProject's host API is built-in to the template.&amp;nbsp; All other hosts will use the fall-back initialization path automatically unless you add support for them to the &lt;em&gt;Host&lt;/em&gt; and &lt;em&gt;Configuration&lt;/em&gt; classes.&amp;nbsp; The only requirement is that the host invokes your component's editor by calling its &lt;em&gt;EditValue&lt;/em&gt; method and passes in an &lt;em&gt;IServiceProvider&lt;/em&gt; implementation that can be used to obtain a reference to one or more of the host's services.&amp;nbsp; (On a side note, the &lt;em&gt;value&lt;/em&gt; argument should be set to a &lt;em&gt;System.Xml.XPath.IXPathNavigable &lt;/em&gt;implementation that's positioned on the outer XML of the component's configuration, which includes the &lt;em&gt;&amp;lt;component&amp;gt;&lt;/em&gt; element itself.)&lt;/p&gt; &lt;h5&gt;Modifying Project Options&lt;/h5&gt; &lt;p&gt;The template gathers read-only data as an example and does not actually modify any build settings or project options at runtime.&amp;nbsp; If you want your component implementation to write to the API, then make sure there's a clear relationship between your component and the changes that it's making.&lt;/p&gt; &lt;p&gt;For example, a proprietary &lt;em&gt;AuthorBuildComponent&lt;/em&gt; changing the value of the &lt;em&gt;Generate root API topic &lt;/em&gt;setting when edited will probably not be obvious to end-users.&amp;nbsp; But it might be appropriate for the same component editor to add &lt;em&gt;external sources&lt;/em&gt; if, for example, it were to provide a way for an end-user to create a list of associations between sources and author names, much like the &lt;em&gt;Version management &lt;/em&gt;dialog does with version information.&amp;nbsp;&amp;nbsp; In this case, the component's editor could save the input-to-author mappings as its inner XML configuration data and add the &lt;em&gt;external sources&lt;/em&gt; as a convenience for the user.&lt;/p&gt; &lt;h5&gt;Hosted Components as Plug-Ins&lt;/h5&gt; &lt;p&gt;&lt;em&gt;Hosted&lt;/em&gt; build components are not meant to be a plug-in mechanism for DocProject, per se, but instead are a plug-in mechanism for Sandcastle.&amp;nbsp; DocProject's API is exposed merely to provide a more user-friendly and integrated experience when editing Sandcastle build components in DocProject.&lt;/p&gt; &lt;p&gt;If you want to create a true DocProject plug-in, then create a &lt;a href="http://www.codeplex.com/DocProject/Wiki/View.aspx?title=Creating%20a%20Build%20Engine%20Provider"&gt;custom build engine provider&lt;/a&gt; or a &lt;a href="http://www.codeplex.com/DocProject/Wiki/View.aspx?title=Build%20Process#BuildProcessComponent"&gt;build process component&lt;/a&gt;, which can provide control over all aspects of DocProject, including the entire build process, engine settings, project options, tool bars, tool windows, menus, custom wizard steps in the &lt;em&gt;New Project Wizard&lt;/em&gt;, etc.&lt;/p&gt; &lt;h5&gt;DocProject's API for Hosted Components&lt;/h5&gt; &lt;p&gt;With the recent release of &lt;a title="DocProject 1.10.0 Release Candidate - Blog Post" href="http://davesexton.com/blog/blogs/blog/archive/2008/02/09/docproject-1-10-0-release-candidate.aspx"&gt;DocProject 1.10.0 RC&lt;/a&gt;, a new interface was added that would provide build components access to DocProject's API, for their graphical &lt;em&gt;editors&lt;/em&gt;.&amp;nbsp; The API can be used to gather information about the environment in which the component's editor is being hosted.&amp;nbsp; The component can then provide automatic configuration and apply appropriate editor defaults, simplifying configuration for end-users while also adhering to the &lt;em&gt;project &lt;/em&gt;paradigm that &lt;em&gt;DocProjects&lt;/em&gt; and &lt;em&gt;DocSites&lt;/em&gt; use to store their settings.&lt;/p&gt; &lt;p&gt;The purpose of the gateway interface, &lt;em&gt;IDocProjectHost&lt;/em&gt; is to provide components with access to DocProject-specific interfaces and types for the context in which the component's editor is being hosted.&amp;nbsp; Here's the interface's definition: &lt;/p&gt;&lt;pre class="code"&gt;&lt;span&gt;public&lt;/span&gt; &lt;span&gt;interface&lt;/span&gt; &lt;span&gt;IDocProjectHost
&lt;/span&gt;{
    &lt;span&gt;IDocProject&lt;/span&gt; Project { &lt;span&gt;get&lt;/span&gt;; }
    &lt;span&gt;BuildSettings&lt;/span&gt; Settings { &lt;span&gt;get&lt;/span&gt;; }
    &lt;span&gt;DocProjectOptions&lt;/span&gt; Options { &lt;span&gt;get&lt;/span&gt;; }
    &lt;span&gt;IBuildEngine&lt;/span&gt; Engine { &lt;span&gt;get&lt;/span&gt;; }
    &lt;span&gt;IEnvironmentHost&lt;/span&gt; EnvironmentHost { &lt;span&gt;get&lt;/span&gt;; }
    &lt;span&gt;bool&lt;/span&gt; RunningInVisualStudio { &lt;span&gt;get&lt;/span&gt;; }
}&lt;/pre&gt;&lt;a href="http://11011.net/software/vspaste"&gt;&lt;/a&gt;
&lt;p&gt;The &lt;em&gt;Hosted&lt;/em&gt; template gets a reference to an &lt;em&gt;IDocProjectHost&lt;/em&gt; implementation through the service provider that's passed to the editor's &lt;em&gt;EditValue &lt;/em&gt;method.&amp;nbsp; If the host is available then the &lt;em&gt;Configuration &lt;/em&gt;class's &lt;em&gt;InitializeForDocProject()&lt;/em&gt; method is invoked instead of the fall-back &lt;em&gt;Initialize()&lt;/em&gt; method (see above for information about &lt;em&gt;initialization paths&lt;/em&gt;).&lt;/p&gt;
&lt;p&gt;The &lt;em&gt;InitializeForDocProject&lt;/em&gt; method uses the types and interfaces exposed through &lt;em&gt;IDocProjectHost &lt;/em&gt;to gather information, which it then stores in private fields.&amp;nbsp; The fields back properties that are used by the template's &lt;em&gt;EditorControl&lt;/em&gt; class.&amp;nbsp; They are typed as &lt;em&gt;nullable &lt;/em&gt;primitives, such as &lt;em&gt;System.String&lt;/em&gt; and &lt;em&gt;bool?&lt;/em&gt;, so if the values are never set then they'll remain &lt;em&gt;null&lt;/em&gt;, in which case the &lt;em&gt;EditorControl&lt;/em&gt; will substitute them with "Unavailable" for its read-only display.&lt;/p&gt;
&lt;p&gt;Developers are free to remove this code (actually, it's recommended) and replace it with appropriate code for gathering information that's required by the component being developed.&amp;nbsp; However, the same pattern can be used to safely encapsulate data that can be initialized with or without a host API.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Note:&lt;/strong&gt; The configuration fields &lt;em&gt;must not&lt;/em&gt; be typed as host-specific types or interfaces if you want to be able to use your components in other environments, without the host API installed.&lt;/p&gt;
&lt;h4&gt;Conclusion&lt;/h4&gt;
&lt;p&gt;With the release of DocProject 1.10.0 RC and the corresponding &lt;em&gt;Hosted&lt;/em&gt; Sandcastle Build Component Item Template 1.1, developers can now have seamless integration in DocProject for their custom build components' editors, providing a more robust platform on which to configure and build documentation while potentially simplifying configuration for end-users through automation and inferred default settings.&lt;/p&gt;&lt;img src="http://davesexton.com/blog/aggbug.aspx?PostID=98" width="1" height="1"&gt;</description><category domain="http://davesexton.com/blog/blogs/blog/archive/tags/C_2300_/default.aspx">C#</category><category domain="http://davesexton.com/blog/blogs/blog/archive/tags/Visual+Studio/default.aspx">Visual Studio</category><category domain="http://davesexton.com/blog/blogs/blog/archive/tags/Sandcastle/default.aspx">Sandcastle</category><category domain="http://davesexton.com/blog/blogs/blog/archive/tags/Community+Components/default.aspx">Community Components</category><category domain="http://davesexton.com/blog/blogs/blog/archive/tags/DocProject/default.aspx">DocProject</category><category domain="http://davesexton.com/blog/blogs/blog/archive/tags/Visual+Studio+2008/default.aspx">Visual Studio 2008</category></item><item><title>DocProject 1.10.0 Release Candidate</title><link>http://davesexton.com/blog/blogs/blog/archive/2008/02/09/docproject-1-10-0-release-candidate.aspx</link><pubDate>Sat, 09 Feb 2008 15:32:46 GMT</pubDate><guid isPermaLink="false">5b5c6d2b-d071-4bf8-ac28-4f9cd768b39b:90</guid><dc:creator>Dave Sexton</dc:creator><slash:comments>2</slash:comments><description>&lt;p&gt;The &lt;a title="DocProject 1.10.0 Release Candidate on CodePlex" href="https://www.codeplex.com/Release/ProjectReleases.aspx?ProjectName=DocProject&amp;amp;ReleaseId=8252"&gt;DocProject 1.10.0 Release Candidate&lt;/a&gt; is now available for download on CodePlex.&lt;/p&gt; &lt;p&gt;It contains lots of bug fixes and some new features that I hope you'll like.&amp;nbsp; You can read my &lt;a href="http://davesexton.com/blog/blogs/blog/archive/2008/01/15/docproject-1-10-0-rc-preview.aspx"&gt;preview post&lt;/a&gt; for information on a few of the more important features that have been added, and a comprehensive list of all of DocProject's features is available &lt;a title="DocProject on CodePlex - New Features" href="http://www.codeplex.com/DocProject#NewFeatures"&gt;here&lt;/a&gt;.&lt;/p&gt; &lt;p&gt;Be aware that I'm still in the process of updating the wikis on CodePlex, which can take a while.&lt;/p&gt; &lt;p&gt;If you feel like you want to leave a comment here, or &lt;a title="Dave Sexton's Contact Form" href="http://davesexton.com/Contact"&gt;tell me&lt;/a&gt; about your experiences with the new version of DocProject, good or bad, please go right ahead :)&lt;/p&gt; &lt;p&gt;&amp;nbsp;&lt;/p&gt; &lt;p&gt;Oh, and one more thing, &lt;strong&gt;&lt;u&gt;Conceptual Content&lt;/u&gt;&lt;/strong&gt;!!!&lt;/p&gt; &lt;p&gt;Now you can use DocProject to build a .CHM and .HxS for conceptual documentation, without the need for auto-generated reference topics.&lt;/p&gt; &lt;p&gt;In other words, DocProject automates the Microsoft HTML Help Workshop and Help 2.x compiler to build conceptual documentation right inside of Visual Studio using Sandcastle's conceptual build process and &lt;a href="http://en.wikipedia.org/wiki/Microsoft_Assistance_Markup_Language"&gt;MAML&lt;/a&gt;, so the output looks identical to a presentation style such as Sandcastle's &lt;em&gt;Visual Studio 2005&lt;/em&gt;.&amp;nbsp; (Note that I haven't even attempted to build conceptual documentation with the other presentation styles since they were &lt;a href="http://forums.microsoft.com/MSDN/ShowPost.aspx?PostID=2624248&amp;amp;SiteID=1"&gt;not tested by Microsoft&lt;/a&gt;.)&lt;/p&gt; &lt;h5&gt;Getting Started With Conceptual Content&lt;/h5&gt; &lt;p&gt;Create a new &lt;em&gt;DocProject&lt;/em&gt; or &lt;em&gt;DocSite&lt;/em&gt; and you can immediately start writing your conceptual documentation in Visual Studio's XML editor, with full IntelliSense for MAML schemas.&amp;nbsp; (Though it seems that you may need to open your project's &lt;em&gt;Help\Schemas\developer.xsd&lt;/em&gt; file in the designer first before you'll get IntelliSense.)&lt;/p&gt; &lt;p&gt;To get started, press the &lt;em&gt;Topic Explorer&lt;/em&gt; button on the Sandcastle tool bar &lt;img style="margin:0px;" height="26" alt="SandcastleToolBar-TopicExplorer" src="http://davesexton.com/Images/Blog/DocProject1.10.0ReleaseCandidate_84F4/SandcastleToolBarTopicExplorer.jpg" width="104" border="0"&gt;and then add a conceptual topic by clicking&lt;img style="margin:5px;" height="16" alt="NewDocumentHS" src="http://davesexton.com/Images/Blog/DocProject1.10.0ReleaseCandidate_84F4/NewDocumentHS.png" width="16" border="0"&gt;on the &lt;em&gt;Topic Explorer's&lt;/em&gt; tool bar.&amp;nbsp; DocProject will ask you which template you want to use.&amp;nbsp; For general documentation use the template named simply, &lt;em&gt;Conceptual&lt;/em&gt;.&amp;nbsp; If you don't need auto-generated reference documentation, then you can build the project now and it will produce conceptual-only documentation.&lt;/p&gt; &lt;h5&gt;Mixed Documentation&lt;/h5&gt; &lt;p&gt;But even better, if you &lt;em&gt;do&lt;/em&gt; have APIs that you want documented, DocProject will build all of your topics together as a single conceptual/reference project without any additional requirements.&amp;nbsp; Simply add references to your source projects and build.&lt;/p&gt; &lt;p&gt;If a &lt;em&gt;DocProject &lt;/em&gt;or &lt;em&gt;DocSite&lt;/em&gt; has one or more sources for documentation (external or project references) then an auto-generated root topic for reference documentation will appear in &lt;em&gt;Topic Explorer&lt;/em&gt;.&amp;nbsp; You can add new conceptual topics to the TOC relative to the root reference topic and even drag &amp;amp; drop conceptual topics and the root reference topic to produce the TOC that you want.&amp;nbsp; Add as many conceptual topics and sources as you'd like, then build.&amp;nbsp; That's it!&lt;/p&gt; &lt;p&gt;Enjoy :D&lt;/p&gt;&lt;img src="http://davesexton.com/blog/aggbug.aspx?PostID=90" width="1" height="1"&gt;</description><category domain="http://davesexton.com/blog/blogs/blog/archive/tags/Sandcastle/default.aspx">Sandcastle</category><category domain="http://davesexton.com/blog/blogs/blog/archive/tags/DocProject/default.aspx">DocProject</category><category domain="http://davesexton.com/blog/blogs/blog/archive/tags/documentation/default.aspx">documentation</category></item><item><title>DocProject Roadmap</title><link>http://davesexton.com/blog/blogs/blog/archive/2008/01/17/docproject-roadmap.aspx</link><pubDate>Thu, 17 Jan 2008 13:58:17 GMT</pubDate><guid isPermaLink="false">5b5c6d2b-d071-4bf8-ac28-4f9cd768b39b:86</guid><dc:creator>Dave Sexton</dc:creator><slash:comments>2</slash:comments><description>&lt;p&gt;As you may have already heard, &lt;a title="Sandcastle on CodePlex" href="http://www.codeplex.com/Sandcastle"&gt;Sandcastle&lt;/a&gt; [1] was officially released to the web (RTW) through CodePlex on January 15, 2008.&amp;nbsp; The license that was chosen is the &lt;em&gt;Microsoft Public License&lt;/em&gt; (Ms-PL) &lt;a title="Microsoft Public License; Ms-PL" href="http://opensource.org/licenses/ms-pl.html"&gt;[2]&lt;/a&gt;, but keep an eye on it because it may change &lt;a href="http://www.codeplex.com/Sandcastle/Thread/View.aspx?ThreadId=20557"&gt;[3]&lt;/a&gt;.&amp;nbsp; There are still a few unanswered questions that I have [3] about how Microsoft's work on Sandcastle will continue and how it will affect &lt;a title="DocProject on CodePlex" href="http://www.codeplex.com/DocProject"&gt;DocProject&lt;/a&gt;, but things are looking very positive.&lt;/p&gt; &lt;p&gt;In this blog post I'd like to express a few of my goals and ideas for DocProject and maybe even try to establish some preliminary timeline.&amp;nbsp; And of course, if you have any thoughts your feedback will be welcomed :)&lt;/p&gt; &lt;h4&gt;The End of Phase 1&lt;/h4&gt; &lt;p&gt;With the help of community feedback and my propensity for being anti-social in favor of sitting in a dark room, programming, DocProject's long initial development phase is nearing an end.&amp;nbsp; The next release, which you can read about in my blog (DocProject 1.10.0 RC Preview &lt;a title="DocProject 1.10.0 RC Preview" href="http://davesexton.com/blog/blogs/blog/archive/2008/01/15/docproject-1-10-0-rc-preview.aspx"&gt;[4]&lt;/a&gt;), brings together a few long-awaited features that will hopefully start to make DocProject into a useful help authoring tool (HAT) &lt;a title="Help Authoring Tool - Wikipedia" href="http://en.wikipedia.org/w/index.php?title=Help_authoring_tool&amp;amp;oldid=183180723"&gt;[5]&lt;/a&gt;.&amp;nbsp; I'm going to try for Monday, January 21st, to release 1.10.0 RC, and I'm hoping that the worst-case scenario will be the following Friday.&lt;/p&gt; &lt;p&gt;From there I expect to deploy only one more &lt;em&gt;Release Candidate&lt;/em&gt; that contains various outstanding bug fixes and feature requests and then I'll freeze DocProject's feature set for Visual Studio 2005.&amp;nbsp; The following deployment, 1.12.0, should therefore be the first DocProject &lt;em&gt;Production&lt;/em&gt; release.&amp;nbsp; Expect that in March, 2008.&lt;/p&gt; &lt;h5&gt;Visual Studio 2005 vs. Visual Studio 2008&lt;/h5&gt; &lt;p&gt;I expect to have my own licensed copy of VS 2008 Standard edition sometime before the end of February, but until then I've decided that I will not be concentrating on any new deployments for DocProject 2008 Beta, although I'm very excited about using VS 2008 and I'll certainly jump on that bandwagon as soon as I can.&lt;/p&gt; &lt;p&gt;So for now, you can expect development to continue like normal for VS 2005.&amp;nbsp; But once I start concentrating on VS 2008, I'm probably going to freeze the feature set for VS 2005, distribute the first &lt;em&gt;Production&lt;/em&gt; release of DocProject 1.x, and then switch gears for .NET 3.5 and, possibly, VS &lt;em&gt;Package&lt;/em&gt; development.&amp;nbsp; I intended to eventually release DocProject as a true package, hopefully with its own editors and &lt;em&gt;actual&lt;/em&gt; project types &lt;a title="DocProject Work Items: VS 2008 Shell and Extensibility" href="http://www.codeplex.com/DocProject/WorkItem/View.aspx?WorkItemId=14029"&gt;[6]&lt;/a&gt; (i.e., &lt;em&gt;DocProject&lt;/em&gt; and &lt;em&gt;DocSite&lt;/em&gt; Templates &lt;a title="DocProject Components" href="http://www.codeplex.com/DocProject/Wiki/View.aspx?title=DocProject+Components"&gt;[7]&lt;/a&gt; that are recognized by Visual Studio as distinct project types, with their own property pages, etc.).&lt;/p&gt; &lt;p&gt;After DocProject 1.x goes into stabilization (the end of &lt;em&gt;phase 1&lt;/em&gt;) I'll certainly provide support for it and help people whenever I can if they have questions about how to modify the source code or how to add additional features themselves.&amp;nbsp; Although, the only official deployments that you'll see will probably be major releases that fix a large number of bugs.&lt;/p&gt; &lt;p&gt;Well that's my plan anyway because in the last couple of DocProject 2008 releases I've realized that maintaining two versions of the project is almost like double the work; however, since Visual Studio 2008 will allow me to target the .NET 2.0 Framework I may be able to work on both versions of DocProject simultaneously, without much additional effort.&amp;nbsp; If that's true then hopefully I won't feel the need to freeze the DocProject 1.x feature set.&amp;nbsp; Although, technically I can't really &lt;em&gt;freeze&lt;/em&gt; DocProject's feature set anyway since it's open source ;)&lt;/p&gt; &lt;h5&gt;DocProject Documentation&lt;/h5&gt; &lt;p&gt;I plan to distribute compiled help for DocProject 1.x that consists of both API reference and conceptual documentation after the first &lt;em&gt;Production&lt;/em&gt; release.&amp;nbsp; I'd say that a week or two should be enough time to author useful, preliminary documentation.&amp;nbsp; After that I'll probably just add content here and there and deploy whenever I reach certain milestones that I define on the fly.&lt;/p&gt; &lt;p&gt;A .chm will be downloadable from CodePlex and the installer will present you with the option to have DocProject's help content (.HxS) merged with Visual Studio's help.&amp;nbsp; I'm even considering hosting a &lt;em&gt;DocSite&lt;/em&gt; as an online reference and as a great working example of DocProject's and Sandcastle's capabilities.&lt;/p&gt; &lt;h4&gt;Phase 2&lt;/h4&gt; &lt;p&gt;The next phase will pickup with the development of DocProject 2008, targeting Visual Studio 2008 and the .NET 3.5 Framework.&amp;nbsp; The timeline will probably start sometime in March, 2008.&amp;nbsp; From there I hope to deploy on a monthly basis as I've done with DocProject for the past year+ (since December, 2006 as a matter of fact).&lt;/p&gt; &lt;h5&gt;Planning&lt;/h5&gt; &lt;p&gt;Although DocProject, in the next release [4], will provide first-class support for building mixed reference and conceptual documentation, unbounded filtering capabilities, much improved performance and a mostly finalized API, I still see lots of room for improvement.&amp;nbsp; Namely, in the area of content-based features such as for authoring topics and localization.&amp;nbsp; Also, here's a few of the outstanding tasks &lt;a title="DocProject Work Items" href="http://www.codeplex.com/DocProject/WorkItem/AdvancedList.aspx"&gt;[8]&lt;/a&gt; that I'm going to look into for DocProject 2008:&amp;nbsp; &lt;/p&gt; &lt;ul&gt; &lt;li&gt;Running DocProject in areas of heightened security (e.g., Vista with UAC enabled).  &lt;li&gt;SQL Server full-text search provider for the &lt;em&gt;DocSite&lt;/em&gt; templates.  &lt;li&gt;Microsoft Word and Adobe PDF output.  &lt;li&gt;The ability to annotate comments with developer notes.&amp;nbsp; &lt;li&gt;Automatic token replacement.  &lt;li&gt;Some new &lt;em&gt;DocSite&lt;/em&gt; skins, maybe including one that makes judicious use of SilverLight.&amp;nbsp; (Documentation might start looking better than the software it documents, if I achieve my goal, that is ;)  &lt;li&gt;Change control and better support for team scenarios; e.g., the ability to have a server that continuously builds live documentation to keep it up-to-date.  &lt;li&gt;The development of a simple community wiki for the &lt;em&gt;DocSite&lt;/em&gt; templates, which I guess we can start calling the "DocSite Community Wiki" feature (sure, some might say it's a rip-off of the MSDN Community Content Wiki idea, and I guess they'd be correct ;).&amp;nbsp; This should be very useful in team scenarios for large, volatile, hosted documentation sets.  &lt;li&gt;The ability to register multiple &lt;em&gt;Build Process Components &lt;/em&gt;&lt;a title="DocProject Build Process: Build Process Components" href="http://www.codeplex.com/DocProject/Wiki/View.aspx?title=Build%20Process#BuildProcessComponent"&gt;[9]&lt;/a&gt; per project, with a management UI as well.&amp;nbsp; I may even turn the Sandcastle/Deployment &lt;a title="DocPoroject Sandcastle/Deployment Plug-In" href="http://www.codeplex.com/DocProject/Wiki/View.aspx?title=Sandcastle%20Deployment%20Plugin"&gt;[10]&lt;/a&gt; engine into a BPC that can be added to any &lt;em&gt;DocProject&lt;/em&gt; or &lt;em&gt;DocSite&lt;/em&gt;. &lt;li&gt;Other various user-defined tasks (bug fixes and feature requests).&lt;/li&gt;&lt;/ul&gt; &lt;p&gt;I have even more ideas that I've been tossing around for a while, so I hope to aggregate them into a blog post and eventually add them as work items in CodePlex.&amp;nbsp; And if you have any ideas for DocProject features please let me know!&lt;/p&gt; &lt;h5&gt;Development&lt;/h5&gt; &lt;p&gt;Development will target Visual Studio 2008 and the .NET 3.5 Framework, and as I mentioned previously, I'm definitely considering rewriting areas of DocProject as a true VS Package with its own custom editors and project types.&amp;nbsp; I'm also considering using WPF for the interfaces.&amp;nbsp; There will be a learning curve but it's one that I'm going to have to accept eventually (and I really do want to learn).&lt;/p&gt; &lt;p&gt;&lt;strong&gt;Collaboration&lt;/strong&gt;&lt;/p&gt; &lt;p&gt;I expect to continue collaborating with community members to find bugs and DocProject's potential for new features.&amp;nbsp; It seems to me that the experience of DocProject users has been positive, so I'd like to continue working on DocProject in the future in the same way as I've been for the last year.&amp;nbsp; But if you feel differently please let me know.&amp;nbsp; Even though it's open source I'd still like to provide an acceptable level of service and support in my free time since the time that I put into helping end-users is also time that I'm putting into DocProject (even if it's just thought), which helps to make a better product even for me to use.&lt;/p&gt; &lt;p&gt;&lt;strong&gt;Extensibility&lt;/strong&gt;&lt;/p&gt; &lt;p&gt;It might also be worth noting that I'm going to maintain the "openness" of DocProject by continuing to introduce new public APIs and areas for extensibility whenever possible.&amp;nbsp; With the limited feedback that I've received, I'd say that DocProject's high level of extensibility was a success.&amp;nbsp; A few people have mentioned to me that their businesses have created custom build engine providers &lt;a title="DocProject: Creating a Build Engine Provider" href="http://www.codeplex.com/DocProject/Wiki/View.aspx?title=Creating%20a%20Build%20Engine%20Provider"&gt;[11]&lt;/a&gt; and build process components, and I've even used BPCs to help people debug issues in the past.&amp;nbsp; Actually, my favorite feature of DocProject might actually be the build process component, which, incidentally, doesn't really have anything in particular to do with documentation.&lt;/p&gt; &lt;h5&gt;Deployment&lt;/h5&gt; &lt;p&gt;It's hard to predict when the first &lt;em&gt;Production&lt;/em&gt; release for DocProject 2008 will be deployed, but if I can use the past year as a metric then I'd say another year from now is certainly reasonable, and possibly even longer than might be required.&amp;nbsp; To be honest, I think the summer of 2008 is a reasonable goal as long as I keep my eyes on the prize.&lt;/p&gt; &lt;h4&gt;Phase 3&lt;/h4&gt; &lt;p&gt;At the start of &lt;em&gt;phase 3&lt;/em&gt; I hope to have already achieved my major goals for DocProject, which includes much better integration into Visual Studio and additional features that will make authoring documentation extremely simple and, in many cases, automated.&amp;nbsp; Thanks to Sandcastle I believe that this goal is attainable.&lt;/p&gt; &lt;p&gt;For the future I think I'm aiming for much better &lt;em&gt;external &lt;/em&gt;support so that non-Visual Studio users will be able to benefit from DocProject's features as well.&amp;nbsp; The team-based features that I mentioned previously might get pushed into this phase, but we'll see how it goes.&amp;nbsp; And finally, I'd like to hear your ideas for where you'd like to see DocProject go.&amp;nbsp; After I'm able to meet most of my own goals I'd like to brainstorm with the community to come up with some new and innovative ideas to be a part of DocProject in the future.&lt;/p&gt; &lt;h4&gt;References&lt;/h4&gt; &lt;p&gt;[1] Sandcastle on CodePlex, &lt;a title="http://www.codeplex.com/Sandcastle" href="http://www.codeplex.com/Sandcastle"&gt;http://www.codeplex.com/Sandcastle&lt;/a&gt;&lt;/p&gt; &lt;p&gt;[2] Microsoft Public License (Ms-PL), &lt;a title="http://opensource.org/licenses/ms-pl.html" href="http://opensource.org/licenses/ms-pl.html"&gt;http://opensource.org/licenses/ms-pl.html&lt;/a&gt;&lt;/p&gt; &lt;p&gt;[3] CTP, License and Source Code, &lt;a title="http://www.codeplex.com/Sandcastle/Thread/View.aspx?ThreadId=20557" href="http://www.codeplex.com/Sandcastle/Thread/View.aspx?ThreadId=20557"&gt;http://www.codeplex.com/Sandcastle/Thread/View.aspx?ThreadId=20557&lt;/a&gt;&lt;/p&gt; &lt;p&gt;[4] Dave Sexton's Blog: DocProject 1.10.0 RC Preview, &lt;a title="http://davesexton.com/blog/blogs/blog/archive/2008/01/15/docproject-1-10-0-rc-preview.aspx" href="http://davesexton.com/blog/blogs/blog/archive/2008/01/15/docproject-1-10-0-rc-preview.aspx"&gt;http://davesexton.com/blog/blogs/blog/archive/2008/01/15/docproject-1-10-0-rc-preview.aspx&lt;/a&gt;&lt;/p&gt; &lt;p&gt;[5] Help authoring tool. (2008, January 9). In &lt;i&gt;Wikipedia, The Free Encyclopedia&lt;/i&gt;. Retrieved 11:22, January 17, 2008, from &lt;a href="http://en.wikipedia.org/w/index.php?title=Help_authoring_tool&amp;amp;oldid=183180723"&gt;http://en.wikipedia.org/w/index.php?title=Help_authoring_tool&amp;amp;oldid=183180723&lt;/a&gt;&lt;/p&gt; &lt;p&gt;[6] DocProject Work Items: VS 2008 Shell and Extensibility, &lt;a title="http://www.codeplex.com/DocProject/WorkItem/View.aspx?WorkItemId=14029" href="http://www.codeplex.com/DocProject/WorkItem/View.aspx?WorkItemId=14029"&gt;http://www.codeplex.com/DocProject/WorkItem/View.aspx?WorkItemId=14029&lt;/a&gt;&lt;/p&gt; &lt;p&gt;[7] DocProject Components, &lt;a title="http://www.codeplex.com/DocProject/Wiki/View.aspx?title=DocProject%20Components" href="http://www.codeplex.com/DocProject/Wiki/View.aspx?title=DocProject+Components"&gt;http://www.codeplex.com/DocProject/Wiki/View.aspx?title=DocProject+Components&lt;/a&gt;&lt;/p&gt; &lt;p&gt;[8] DocProject Work Items, Advanced List, &lt;a title="http://www.codeplex.com/DocProject/WorkItem/AdvancedList.aspx" href="http://www.codeplex.com/DocProject/WorkItem/AdvancedList.aspx"&gt;http://www.codeplex.com/DocProject/WorkItem/AdvancedList.aspx&lt;/a&gt;&lt;/p&gt; &lt;p&gt;[9] DocProject's Build Process, Build Process Components, &lt;a title="http://www.codeplex.com/DocProject/Wiki/View.aspx?title=Build%20Process#BuildProcessComponent" href="http://www.codeplex.com/DocProject/Wiki/View.aspx?title=Build+Process#BuildProcessComponent"&gt;http://www.codeplex.com/DocProject/Wiki/View.aspx?title=Build+Process#BuildProcessComponent&lt;/a&gt;&lt;/p&gt; &lt;p&gt;[10] DocProject Sandcastle/Deployment Plug-In, &lt;a title="http://www.codeplex.com/DocProject/Wiki/View.aspx?title=Sandcastle%20Deployment%20Plugin" href="http://www.codeplex.com/DocProject/Wiki/View.aspx?title=Sandcastle+Deployment+Plugin"&gt;http://www.codeplex.com/DocProject/Wiki/View.aspx?title=Sandcastle+Deployment+Plugin&lt;/a&gt;&lt;/p&gt; &lt;p&gt;[11] DocProject tutorial: Creating a Build Engine Provider, &lt;a title="http://www.codeplex.com/DocProject/Wiki/View.aspx?title=Creating%20a%20Build%20Engine%20Provider" href="http://www.codeplex.com/DocProject/Wiki/View.aspx?title=Creating+a+Build+Engine+Provider"&gt;http://www.codeplex.com/DocProject/Wiki/View.aspx?title=Creating+a+Build+Engine+Provider&lt;/a&gt;&lt;/p&gt;&lt;img src="http://davesexton.com/blog/aggbug.aspx?PostID=86" width="1" height="1"&gt;</description><category domain="http://davesexton.com/blog/blogs/blog/archive/tags/C_2300_/default.aspx">C#</category><category domain="http://davesexton.com/blog/blogs/blog/archive/tags/Visual+Studio/default.aspx">Visual Studio</category><category domain="http://davesexton.com/blog/blogs/blog/archive/tags/wiki/default.aspx">wiki</category><category domain="http://davesexton.com/blog/blogs/blog/archive/tags/Sandcastle/default.aspx">Sandcastle</category><category domain="http://davesexton.com/blog/blogs/blog/archive/tags/DocProject/default.aspx">DocProject</category><category domain="http://davesexton.com/blog/blogs/blog/archive/tags/documentation/default.aspx">documentation</category><category domain="http://davesexton.com/blog/blogs/blog/archive/tags/CodePlex/default.aspx">CodePlex</category><category domain="http://davesexton.com/blog/blogs/blog/archive/tags/Open+Source/default.aspx">Open Source</category><category domain="http://davesexton.com/blog/blogs/blog/archive/tags/Visual+Studio+2008/default.aspx">Visual Studio 2008</category></item></channel></rss>
