<?xml version="1.0" encoding="UTF-8" ?>
<?xml-stylesheet type="text/xsl" href="http://community.sharpdevelop.net/utility/FeedStylesheets/atom.xsl" media="screen"?><feed xmlns="http://www.w3.org/2005/Atom" xml:lang="en"><title type="html">Matt Ward</title><subtitle type="html" /><id>http://community.sharpdevelop.net/blogs/mattward/atom.aspx</id><link rel="alternate" type="text/html" href="http://community.sharpdevelop.net/blogs/mattward/default.aspx" /><link rel="self" type="application/atom+xml" href="http://community.sharpdevelop.net/blogs/mattward/atom.aspx" /><generator uri="http://communityserver.org" version="3.1.20917.1142">Community Server</generator><updated>2006-06-20T17:14:00Z</updated><entry><title>WiX 3.0 Integration</title><link rel="alternate" type="text/html" href="http://community.sharpdevelop.net/blogs/mattward/archive/2008/01/02/Wix3Integration.aspx" /><id>http://community.sharpdevelop.net/blogs/mattward/archive/2008/01/02/Wix3Integration.aspx</id><published>2008-01-02T23:28:00Z</published><updated>2008-01-02T23:28:00Z</updated><content type="html">&lt;p&gt;SharpDevelop 3.0 now supports 
    &lt;a href="http://wix.sourceforge.net"&gt;WiX&lt;/a&gt; 3.0.&lt;/p&gt;&lt;p&gt;There are some changes to how things work compared to the 
    &lt;a href="http://community.sharpdevelop.net/blogs/mattward/archive/2006/09/17/WixIntegration.aspx"&gt;
    WiX integration in SharpDevelop 2&lt;/a&gt;. The differences will be 
    covered in the following sections.&lt;/p&gt;&lt;h2&gt;WiX Project Templates&lt;/h2&gt;&lt;p&gt;There are some new WiX project templates available. A basic 
    empty project template and a template for each of the standard 
    &lt;a href="http://wix.sourceforge.net/manual-wix2/WixUI_dialog_library.htm"&gt;
    WiX UI library&lt;/a&gt; dialog sequences.&lt;/p&gt;&lt;p&gt;&lt;img src="http://community.sharpdevelop.net/photos/mattward/images/original/WixUIProjectTemplates.aspx" alt="" /&gt;&lt;/p&gt;&lt;h2&gt;Adding WiX Extensions&lt;/h2&gt;&lt;p&gt;WiX extensions are now displayed in the project browser instead 
    of in the project options. They can be added by right clicking the 
    &lt;b&gt;WiX Extensions&lt;/b&gt; folder and selecting &lt;b&gt;Add WiX 
    Extension&lt;/b&gt;.&lt;/p&gt;&lt;p&gt;&lt;img src="http://community.sharpdevelop.net/photos/mattward/images/original/AddWixExtensionsContextMenu.aspx" alt="" /&gt;.&lt;/p&gt;&lt;h2&gt;Project Options&lt;/h2&gt;&lt;p&gt;The Library and Linking tabs have been removed from the project 
    options since the WiX extensions can now be added from the project 
    browser.&lt;/p&gt;&lt;p&gt;The &lt;b&gt;Compiling&lt;/b&gt; tab has some new options as shown below.&lt;/p&gt;&lt;p&gt;&lt;img src="http://community.sharpdevelop.net/photos/mattward/images/original/WixCompilingProjectOptions.aspx" alt="" /&gt;&lt;/p&gt;&lt;p&gt;The &lt;b&gt;WiX Variables&lt;/b&gt; field can be used to override the 
    standard WiX UI library settings. In the screenshot above the 
    standard licence agreement and dialog background bitmap are being 
    replaced with new ones.&lt;/p&gt;&lt;p&gt;The &lt;b&gt;Suppress ICEs&lt;/b&gt; field is used to stop WiX from showing 
    errors or warnings for particular 
    &lt;a href="http://msdn2.microsoft.com/en-us/library/aa369554%28VS.85%29.aspx"&gt;
    Internal Consistency Evaluators (ICEs)&lt;/a&gt;. After building your 
    installer WiX now validates it against a standard set of rules 
    which saves you from having to use another validation tool such as 
    &lt;a href="http://msdn2.microsoft.com/en-us/library/aa370557.aspx"&gt;
    Orca&lt;/a&gt;.  &lt;/p&gt;&lt;p&gt;Localized string files are no longer specified in the 
    Application&amp;#39;s tab. Instead add the file to the project and 
    change its Build action to Embedded Resource.&lt;/p&gt;&lt;h2&gt;Other Editors&lt;/h2&gt;&lt;p&gt;If you want integration with Visual Studio 2005 or 2008 then 
    please check out &lt;a href="http://blogs.msdn.com/jrock"&gt;Justin 
    Rockwood&lt;/a&gt;&amp;#39;s 
    &lt;a href="http://wix.sourceforge.net/votive.html"&gt;Votive&lt;/a&gt;.&lt;/p&gt;&lt;p&gt;&lt;a href="http://robmensching.com/blog/"&gt;Rob Mensching&lt;/a&gt; has a 
    &lt;a href="http://robmensching.com/blog/archive/2007/11/20/WiX-editors.aspx"&gt;
    list of WiX editors&lt;/a&gt;, including commerical ones, on his blog.&lt;/p&gt;&lt;p&gt;It also looks like a 
    &lt;a href="http://robmensching.com/blog/archive/2007/11/26/Visual-Studio-ships-the-WiX-toolset.aspx"&gt;
    future version of Visual Studio will ship with WiX&lt;/a&gt;.&lt;/p&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;img src="http://community.sharpdevelop.net/aggbug.aspx?PostID=20371" width="1" height="1"&gt;</content><author><name>MattWard</name><uri>http://community.sharpdevelop.net/members/MattWard.aspx</uri></author><category term="WiX" scheme="http://community.sharpdevelop.net/blogs/mattward/archive/tags/WiX/default.aspx" /></entry><entry><title>Porting an AddIn from SharpDevelop 2.2 to 3.0</title><link rel="alternate" type="text/html" href="http://community.sharpdevelop.net/blogs/mattward/archive/2007/12/09/PortingAnAddInFromSD22ToSD3.aspx" /><id>http://community.sharpdevelop.net/blogs/mattward/archive/2007/12/09/PortingAnAddInFromSD22ToSD3.aspx</id><published>2007-12-09T17:28:00Z</published><updated>2007-12-09T17:28:00Z</updated><content type="html">&lt;p&gt;There have been some fairly large code changes on moving from 
    SharpDevelop 2.2 to 3.0 and addins written for 2.2 are unlikely to 
    work without some modification. We will look at the changes in the 
    core parts of SharpDevelop and then look at one way to do the 
    porting.&lt;/p&gt;&lt;p&gt;Not all the differences are covered in the next section just 
    those types and methods that are likely to have been used by an 
    addin.&lt;/p&gt;&lt;h2&gt;ICSharpCode.Core&lt;/h2&gt;&lt;table class="article"&gt;&lt;tr&gt;&lt;th&gt;Type&lt;/th&gt;&lt;th&gt;Description&lt;/th&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;&lt;b&gt;ICSharpCode.Core.AddInReference&lt;/b&gt;&lt;/td&gt;&lt;td&gt;&lt;br /&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td id="green-fill-indent"&gt;bool RequirePreload&lt;/td&gt;&lt;td&gt;

          New property that specifies that when a type from an addin is 
          created any addins that are needed by this addin will be 
          preloaded if this flag is set to true. This corresponds to 
          the new requirePreload attribute in an .addin file.
          &lt;p&gt;&amp;lt;Dependency addin=&amp;quot;ICSharpCode.XmlEditor&amp;quot; 
          requirePreload=&amp;quot;true&amp;quot;/&amp;gt;&lt;/p&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td id="red-fill"&gt;&lt;b&gt;ICSharpCode.Core.AddInTreeNode.TopologicalSort&lt;/b&gt;&lt;/td&gt;&lt;td&gt;Type is no longer public.&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;&lt;b&gt;ICSharpCode.Core.FileUtility&lt;/b&gt;&lt;/td&gt;&lt;td&gt;&lt;br /&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td id="green-fill-indent"&gt;bool IsValidPath(string path)&lt;/td&gt;&lt;td&gt;New method that determines whether a full or relative path 
        is valid. This replaces the IsValidFileName method.&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td id="red-fill-indent"&gt;bool IsValidFileName(string 
        fileName)&lt;/td&gt;&lt;td&gt;Renamed to IsValidPath.&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td id="green-fill-indent"&gt;static string NormalizePath(string 
        fileName)&lt;/td&gt;&lt;td&gt;New method that gets the normalized version of the 
        filename. Slashes are replaced with backslashes, backreferences 
        &amp;quot;.&amp;quot; and &amp;quot;..&amp;quot; are &amp;#39;evaluated&amp;#39;.&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;&lt;b&gt;ICSharpCode.Core.Properties&lt;/b&gt;&lt;/td&gt;&lt;td&gt;&lt;br /&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td id="red-fill-indent"&gt;void ReadProperties(XmlReader reader, 
        string endElement)&lt;/td&gt;&lt;td&gt;Method is no longer public but internal.&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;&lt;h2&gt;NRefactory&lt;/h2&gt;&lt;table class="article"&gt;&lt;tr&gt;&lt;th&gt;Type&lt;/th&gt;&lt;th&gt;Description&lt;/th&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td id="red-fill"&gt;&lt;b&gt;ICSharpCode.NRefactory.Ast.ArrayInitializerExpression&lt;/b&gt;&lt;/td&gt;&lt;td&gt;Replaced by the CollectionInitializerExpression type.&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;&lt;b&gt;ICSharpCode.NRefactory.Ast.BlockStatement&lt;/b&gt;&lt;/td&gt;&lt;td&gt;&lt;br /&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td id="red-fill-indent"&gt;BlockStatement Null&lt;/td&gt;&lt;td&gt;The Null property now returns a BlockStatement instead of a 
        NullStatement type.&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td id="red-fill"&gt;&lt;b&gt;ICSharpCode.NRefactory.Ast.FieldReferenceExpression&lt;/b&gt;&lt;/td&gt;&lt;td&gt;Replaced by the MemberReferenceExpression type.&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td id="green-fill"&gt;&lt;b&gt;ICSharpCode.NRefactory.Ast.MemberReferenceExpression&lt;/b&gt;&lt;/td&gt;&lt;td&gt;Replaces the FieldReferenceExpression type.&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;&lt;b&gt;ICSharpCode.NRefactory.Ast.InvocationExpression&lt;/b&gt;&lt;/td&gt;&lt;td&gt;&lt;br /&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td id="red-fill-indent"&gt;List&amp;lt;TypeReference&amp;gt; 
        TypeArguments&lt;/td&gt;&lt;td&gt;This property has been removed.&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td id="red-fill"&gt;&lt;b&gt;ICSharpCode.NRefactory.Ast.NullArrayInitializerExpression&lt;/b&gt;&lt;/td&gt;&lt;td&gt;This type has been removed.&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td id="red-fill"&gt;&lt;b&gt;ICSharpCode.NRefactory.Ast.NullBlockStatement&lt;/b&gt;&lt;/td&gt;&lt;td&gt;No longer a public type instead it is now internal.&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td id="red-fill"&gt;&lt;b id="red-fill"&gt;
        ICSharpCode.NRefactory.Ast.NullConstructorInitializer&lt;/b&gt;&lt;/td&gt;&lt;td&gt;No longer a public type instead it is now internal.&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td id="red-fill"&gt;&lt;b id="red-fill"&gt;
        ICSharpCode.NRefactory.Ast.NullEventAddRegion&lt;/b&gt;&lt;/td&gt;&lt;td&gt;No longer a public type instead it is now internal.&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td id="red-fill"&gt;&lt;b id="red-fill"&gt;
        ICSharpCode.NRefactory.Ast.NullEventRaiseStatement&lt;/b&gt;&lt;/td&gt;&lt;td&gt;No longer a public type instead it is now internal.&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td id="red-fill"&gt;&lt;b id="red-fill"&gt;
        ICSharpCode.NRefactory.Ast.NullEventRemoveStatement&lt;/b&gt;&lt;/td&gt;&lt;td&gt;No longer a public type instead it is now internal.&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td id="red-fill"&gt;&lt;b id="red-fill"&gt;
        ICSharpCode.NRefactory.Ast.NullExpression&lt;/b&gt;&lt;/td&gt;&lt;td&gt;No longer a public type instead it is now internal.&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td id="red-fill"&gt;&lt;b id="red-fill"&gt;
        ICSharpCode.NRefactory.Ast.NullPropertyGetRegion&lt;/b&gt;&lt;/td&gt;&lt;td&gt;No longer a public type instead it is now internal.&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td id="red-fill"&gt;&lt;b id="red-fill"&gt;
        ICSharpCode.NRefactory.Ast.NullPropertySetRegion&lt;/b&gt;&lt;/td&gt;&lt;td&gt;No longer a public type instead it is now internal.&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td id="red-fill"&gt;&lt;b id="red-fill"&gt;
        ICSharpCode.NRefactory.Ast.NullStatement&lt;/b&gt;&lt;/td&gt;&lt;td&gt;No longer a public type instead it is now internal.&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;&lt;b&gt;ICSharpCode.NRefactory.IAstVisitor&lt;/b&gt;&lt;/td&gt;&lt;td&gt;Various new methods on this interface to support new 
        types.&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td id="red-fill-indent"&gt;object 
        VisitArrayInitializerExpression(...)&lt;/td&gt;&lt;td&gt;Method removed along with the ArrayInitializerExpression 
        type. Replaced by the VisitCollectionInitializerExpression 
        method.&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td id="red-fill-indent"&gt;object 
        VisitFieldReferenceExpression(...)&lt;/td&gt;&lt;td&gt;Method removed along with the ArrayInitializerExpression 
        type. Replaced by the VisitMemberReferenceExpression 
        method.&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td id="red-fill"&gt;&lt;b&gt;ICSharpCode.NRefactory.Visitors.NodeTrackingAstVisitor&lt;/b&gt;&lt;/td&gt;&lt;td&gt;All TrackedVisit methods have been renamed and now include 
        the name of the type being tracked (e.g. 
        TrackedVisitAddHandlerStatement).&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;&lt;h2&gt;ICSharpCode.SharpDevelop.Dom&lt;/h2&gt;&lt;table class="article"&gt;&lt;tr&gt;&lt;th&gt;Type&lt;/th&gt;&lt;th&gt;Description&lt;/th&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;&lt;b&gt;ICSharpCode.SharpDevelop.Dom.AbstractAmbience&lt;/b&gt;&lt;/td&gt;&lt;td&gt;&lt;br /&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td id="red-fill-indent"&gt;bool IncludeBodies&lt;/td&gt;&lt;td&gt;Replaced by the new IncludeBody property.&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td id="green-fill-indent"&gt;bool IncludeBody&lt;/td&gt;&lt;td&gt;Replaces the IncludeBodies property.&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td id="red-fill-indent"&gt;bool IncludeHTMLMarkup&lt;/td&gt;&lt;td&gt;Replaced by the new IncludeHtmlMarkup property.&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td id="green-fill-indent"&gt;bool IncludeHtmlMarkup&lt;/td&gt;&lt;td&gt;Replaces the old IncludeHTMLMarkup property.&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td id="red-fill-indent"&gt;bool UseFullyQualifiedMemberNames&lt;/td&gt;&lt;td&gt;Replaced by the new UseFullyQualifiedMemberTypeNames 
        property.&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td id="green-fill-indent"&gt;bool 
        UseFullyQualifiedMemberTypeNames&lt;/td&gt;&lt;td&gt;Replaces the old UseFullyQualifiedMemberNames property.&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td id="red-fill-indent"&gt;String Convert(ModifierEnum)&lt;/td&gt;&lt;td&gt;Method removed.&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;&lt;b&gt;ICSharpCode.SharpDevelop.Dom.AbstractReturnType&lt;/b&gt;&lt;/td&gt;&lt;td&gt;&lt;br /&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td id="green-fill-indent"&gt;int TypeArgumentCount&lt;/td&gt;&lt;td&gt;Replaces the old TypeParameterCount property.&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td id="red-fill-indent"&gt;int TypeParameterCount&lt;/td&gt;&lt;td&gt;Replaced by the new TypeArgumentCount property.&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td id="red-fill"&gt;&lt;b id="red-fill"&gt;
        ICSharpCode.SharpDevelop.Dom.AttributeArgument&lt;/b&gt;&lt;/td&gt;&lt;td&gt;Type has been removed.&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;&lt;b&gt;ICSharpCode.SharpDevelop.Dom.ClassFinder&lt;/b&gt;&lt;/td&gt;&lt;td&gt;The constructors now take a ParseInformation type instead 
        of a filename.&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;&lt;b&gt;ICSharpCode.SharpDevelop.Dom.ConversionFlags&lt;/b&gt;&lt;/td&gt;&lt;td&gt;&lt;br /&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td id="red-fill-indent"&gt;IncludeBodies&lt;/td&gt;&lt;td&gt;Replaced by IncludeBody.&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td id="green-fill-indent"&gt;IncludeBody&lt;/td&gt;&lt;td&gt;Replaces IncludeBodies.&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td id="red-fill-indent"&gt;IncludeHTMLMarkup&lt;/td&gt;&lt;td&gt;Replaced by IncludeHtmlMarkup.&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td id="green-fill-indent"&gt;IncludeHtmlMarkup&lt;/td&gt;&lt;td&gt;Replaces IncludeHTMLMarkup.&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td id="red-fill-indent"&gt;QualifiedNamesOnlyForReturnTypes&lt;/td&gt;&lt;td&gt;Enum value removed.&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td id="red-fill-indent"&gt;UseFullyQualifiedNames&lt;/td&gt;&lt;td&gt;Replaced by two new enums UseFullyQualifiedMemberNames and 
        UseFullyQualifedTypeNames.&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td id="green-fill-indent"&gt;UseFullyQualifiedMemberNames&lt;/td&gt;&lt;td&gt;Replaces the UseFullyQualifiedNames enum value.&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td id="green-fill-indent"&gt;UseFullyQualifiedTypeNames&lt;/td&gt;&lt;td&gt;Replaces the UseFullyQualifiedNames enum value.&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;&lt;b&gt;ICSharpCode.SharpDevelop.Dom.CSharpExpressionFinder&lt;/b&gt;&lt;/td&gt;&lt;td&gt;&lt;br /&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td id="red-fill-indent"&gt;int LastExpressionStartPosition&lt;/td&gt;&lt;td&gt;Property has been removed.&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td id="red-fill-indent"&gt;string FindExpressionInternal(string 
        inText, int offset)&lt;/td&gt;&lt;td&gt;Method has been removed.&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td id="red-fill-indent"&gt;ctor(string fileName)&lt;/td&gt;&lt;td&gt;Constructor now takes a ParseInformation type instead of 
        the filename.&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;&lt;b&gt;ICSharpCode.SharpDevelop.Dom.CtrlSpaceResolveHelper&lt;/b&gt;&lt;/td&gt;&lt;td&gt;&lt;br /&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td id="red-fill-indent"&gt;ResolveResult 
        GetResultFromDeclarationLine(IClass callingClass, 
        IMethodOrProperty callingMember, int caretLine, int 
        caretColumn, string expression)&lt;/td&gt;&lt;td&gt;Obsolete method removed. Should use the 
        GetResultFromDeclarationLine method that takes an 
        ExpressionResult instead of a string.&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;&lt;b&gt;ICSharpCode.SharpDevelop.Dom.DefaultAttribute&lt;/b&gt;&lt;/td&gt;&lt;td&gt;&lt;br /&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td id="red-fill-indent"&gt;int CompareTo(IAttribute 
        attribute)&lt;/td&gt;&lt;td&gt;Method removed.&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td id="red-fill-indent"&gt;string Name&lt;/td&gt;&lt;td&gt;Property has been removed. The attribute name can now be 
        obtained from the Name property of the AttributeReturnType.&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;&lt;b&gt;ICSharpCode.SharpDevelop.Dom.DefaultCompilationUnit&lt;/b&gt;&lt;/td&gt;&lt;td&gt;&lt;br /&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td id="red-fill-indent"&gt;List&amp;lt;IClass&amp;gt; GetOuterClasses(int 
        caretLine, int caretColumn)&lt;/td&gt;&lt;td&gt;Method removed.&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;&lt;b&gt;ICSharpCode.SharpDevelop.DomRegion&lt;/b&gt;&lt;/td&gt;&lt;td&gt;&lt;br /&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td id="red-fill-indent"&gt;int CompareTo(DomRegion region)&lt;/td&gt;&lt;td&gt;Method removed and replaced by the Equals method.&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td id="red-fill-indent"&gt;ctor(Location start, Location end)&lt;/td&gt;&lt;td&gt;Replaced by the static FromLocation method.&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;&lt;b&gt;ICSharpCode.SharpDevelop.ExpressionContext&lt;/b&gt;&lt;/td&gt;&lt;td&gt;&lt;br /&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td id="red-fill-indent"&gt;bool IsAttributeContext&lt;/td&gt;&lt;td&gt;Property has been removed. Instead compare the 
        ExpressionContext against the ExpressionContext.Attribute.&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td id="red-fill-indent"&gt;ExpressionContext 
        GetAttribute(IProjectContent projectContent)&lt;/td&gt;&lt;td&gt;Method removed. To indicate that an expression is an 
        attribute use the ExpressionContext.Attribute type.&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td id="red-fill-indent"&gt;ExpressionContext 
        TypeDerivingFrom(IClass baseClass, bool isObjectCreation)&lt;/td&gt;&lt;td&gt;Method now requires an IReturnType instead of an IClass 
        type.&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;&lt;b&gt;ICSharpCode.SharpDevelop.ExpressionResult&lt;/b&gt;&lt;/td&gt;&lt;td&gt;&lt;br /&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td id="red-fill-indent"&gt;ctor(string expression, 
        ExpressionContext context, object tag)&lt;/td&gt;&lt;td&gt;Replaced by the new constructor that also takes a 
        DomRegion.&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td id="red-fill-indent"&gt;ctor(string expression, object 
        tag)&lt;/td&gt;&lt;td&gt;Replaced by the new constructor that also takes a DomRegion 
        and ExpressionContext.&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td id="red-fill"&gt;&lt;b&gt;ICSharpCode.SharpDevelop.GacAssemblyName&lt;/b&gt;&lt;/td&gt;&lt;td&gt;Type removed. Code should use the DomAssemblyName 
        instead.&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;&lt;b&gt;ICSharpCode.SharpDevelop.GacInterop&lt;/b&gt;&lt;/td&gt;&lt;td&gt;&lt;br /&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td id="red-fill-indent"&gt;GacAssemblyName 
        FindBestMatchingAssemblyName(GacAssemblyName name)&lt;/td&gt;&lt;td&gt;Method now uses DomAssemblyName types.&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td id="red-fill-indent"&gt;GacAssemblyName 
        FindBestMatchingAssemblyName(string name)&lt;/td&gt;&lt;td&gt;Method now returns a DomAssemblyName type.&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td id="red-fill"&gt;&lt;b&gt;ICSharpCode.SharpDevelop.GacInterop.AssemblyListEntry&lt;/b&gt;&lt;/td&gt;&lt;td&gt;Type has been removed. Code should now use a 
        DomAssemblyName type.&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;&lt;b&gt;ICSharpCode.SharpDevelop.Dom.IAmbience&lt;/b&gt;&lt;/td&gt;&lt;td&gt;&lt;br /&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td id="red-fill-indent"&gt;String Convert(ModifierEnum)&lt;/td&gt;&lt;td&gt;Method removed.&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;&lt;b&gt;ICSharpCode.SharpDevelop.Dom.IAttribute&lt;/b&gt;&lt;/td&gt;&lt;td&gt;&lt;br /&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td id="red-fill-indent"&gt;string Name&lt;/td&gt;&lt;td&gt;Property has been removed. The attribute name can now be 
        obtained from the Name property of the AttributeReturnType.&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;&lt;b&gt;ICSharpCode.SharpDevelop.Dom.ICompilationUnit&lt;/b&gt;&lt;/td&gt;&lt;td&gt;&lt;br /&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td id="red-fill-indent"&gt;List&amp;lt;IClass&amp;gt; GetOuterClasses(int 
        caretLine, int caretColumn)&lt;/td&gt;&lt;td&gt;

          Method removed. Code should now use the IClass&amp;#39;s 
          DeclaringType property. For example:
          &lt;pre&gt;    IClass type = callingClass.DeclaringType; &lt;br /&gt;    while (type != null) { &lt;br /&gt;      ... &lt;br /&gt;      type = type.DeclaringType; &lt;br /&gt;    } &lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;&lt;b&gt;ICSharpCode.SharpDevelop.Dom.IProjectContent&lt;/b&gt;&lt;/td&gt;&lt;td&gt;&lt;br /&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td id="red-fill-indent"&gt;IClass GetClass(string typeName)&lt;/td&gt;&lt;td&gt;Method removed. Code should now use GetClass(string 
        typeName, int typeParameterCount) and pass 0 for the 
        typeParameterCount.&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;&lt;b&gt;ICSharpCode.SharpDevelop.Dom.IResolver&lt;/b&gt;&lt;/td&gt;&lt;td&gt;&lt;br /&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td id="red-fill-indent"&gt;ArrayList CtrlSpace(int caretLine, int 
        caretColumn, string fileName, string fileContent, 
        ExpressionContext context)&lt;/td&gt;&lt;td&gt;Method changed to use a ParseInformation type instead of a 
        filename.&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td id="red-fill-indent"&gt;ResolveResult Resolve(ExpressionResult 
        expressionResult, int line, int col, string fileName, string 
        fileContent)&lt;/td&gt;&lt;td&gt;Method changed to take a ParseInformation type instead of a 
        filename and the line and column parameters have been 
        removed.&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;&lt;b&gt;ICSharpCode.SharpDevelop.Dom.IReturnType&lt;/b&gt;&lt;/td&gt;&lt;td&gt;&lt;br /&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td id="green-fill-indent"&gt;int TypeArgumentCount&lt;/td&gt;&lt;td&gt;Replaces the old TypeParameterCount property.&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td id="red-fill-indent"&gt;int TypeParameterCount&lt;/td&gt;&lt;td&gt;Replaced by the new TypeArgumentCount property.&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;&lt;b&gt;ICSharpCode.SharpDevelop.Dom.MemberLookupHelper&lt;/b&gt;&lt;/td&gt;&lt;td&gt;&lt;br /&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td id="red-fill-indent"&gt;IMethod 
        FindOverload(IList&amp;lt;IMethod&amp;gt; methods, IReturnType[] 
        typeParameters, IReturnType[] arguments)&lt;/td&gt;&lt;td&gt;Method now has an extra out parameter called 
        resultIsAcceptable. This parameter is true if the resulting 
        method is an acceptable match, false if the resulting method is 
        just a guess and will lead to a compile error.&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;&lt;b&gt;ICSharpCode.SharpDevelop.Dom.NRefactoryResolver&lt;/b&gt;&lt;/td&gt;&lt;td&gt;&lt;br /&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td id="red-fill-indent"&gt;bool Initialize(string fileName, int 
        line, int column)&lt;/td&gt;&lt;td&gt;Method now takes a ParseInformation type instead of a 
        filename.&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td id="red-fill-indent"&gt;IClass SearchClass(string name)&lt;/td&gt;&lt;td&gt;Method now takes an extra Location parameter which is used 
        to search for a class at a particular location in the file. 
        Code that does not need to specify a location should use 
        Location.Empty.&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td id="red-fill-indent"&gt;IReturnType DynamicLookup(string 
        identifier)&lt;/td&gt;&lt;td&gt;Method now takes an extra Location parameter. Use 
        Location.Empty if no location can be specified.&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td id="red-fill-indent"&gt;IReturnType SearchMember(IReturnType 
        type, string memberName)&lt;/td&gt;&lt;td&gt;Method removed. Instead of using this method call GetMember 
        and then use the IMember&amp;#39;s ReturnType.&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td id="red-fill-indent"&gt;IReturnType SearchType(string 
        name)&lt;/td&gt;&lt;td&gt;Method now takes an extra Location parameter. Use 
        Location.Empty if no location can be specified.&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td id="red-fill-indent"&gt;ResolveResult Resolve(ExpressionResult 
        expressionResult, int line, int column, string fileName, string 
        fileContent)&lt;/td&gt;&lt;td&gt;Method now takes a ParseInformation type instead of the 
        filename. The line and column parameters are no longer 
        required.&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td id="red-fill-indent"&gt;ArrayList CtrlSpace(int caretLine, int 
        caretColumn, string fileName, string fileContent, 
        ExpressionContext context)&lt;/td&gt;&lt;td&gt;Method changed to use a ParseInformation type instead of a 
        filename.&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;&lt;b&gt;ICSharpCode.SharpDevelop.Dom.ProjectContentRegistry&lt;/b&gt;&lt;/td&gt;&lt;td&gt;&lt;br /&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td id="red-fill-indent"&gt;IProjectContent 
        GetExistingProjectContent(AssemblyName assembly)&lt;/td&gt;&lt;td&gt;Obsolete method has been removed. Use the overloaded method 
        that takes a DomAssemblyName type instead.&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td id="red-fill-indent"&gt;IProjectContent 
        GetExistingProjectContent(string itemInclude, string 
        itemFileName)&lt;/td&gt;&lt;td&gt;Method removed. Use the overloaded method that takes a 
        single string parameter.&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;&lt;b&gt;ICSharpCode.SharpDevelop.Dom.ReflectionProjectContent&lt;/b&gt;&lt;/td&gt;&lt;td&gt;&lt;br /&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td id="red-fill-indent"&gt;AssemblyName[] 
        ReferencedAssemblies&lt;/td&gt;&lt;td&gt;Property removed and replaced by the 
        ReferencedAssemblyNames property which returns a list of 
        DomAssemblyNames.&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td id="green-fill-indent"&gt;IList&amp;lt;DomAssemblyName&amp;gt; 
        ReferencedAssemblyNames&lt;/td&gt;&lt;td&gt;Replaces the old ReferencedAssemblies property.&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;&lt;h2&gt;ICSharpCode.SharpDevelop.Widgets&lt;/h2&gt;&lt;table class="article"&gt;&lt;tr&gt;&lt;th&gt;Type&lt;/th&gt;&lt;th&gt;Description&lt;/th&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;&lt;b&gt;ICSharpCode.SharpDevelop.Widgets.SideBar.SideTab&lt;/b&gt;&lt;/td&gt;&lt;td&gt;&lt;br /&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td id="red-fill-indent"&gt;bool IsClipboardRing&lt;/td&gt;&lt;td&gt;Property removed.&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;&lt;h2&gt;ICSharpCode.SharpDevelop&lt;/h2&gt;&lt;table class="article"&gt;&lt;tr&gt;&lt;th&gt;Type&lt;/th&gt;&lt;th&gt;Description&lt;/th&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;&lt;b&gt;ICSharpCode.SharpDevelop.ClassBrowserIconService&lt;/b&gt;&lt;/td&gt;&lt;td&gt;&lt;br /&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td id="red-fill-indent"&gt;int CombineIndex&lt;/td&gt;&lt;td&gt;Field removed and replaced with SolutionIndex.&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;&lt;b&gt;ICSharpCode.SharpDevelop.DefaultEditor.Gui.Editor.CtrlSpaceCompletionDataProvider&lt;/b&gt;&lt;/td&gt;&lt;td&gt;&lt;br /&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td id="red-fill-indent"&gt;bool ForceNewExpression&lt;/td&gt;&lt;td&gt;Property removed.&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;&lt;b&gt;ICSharpCode.SharpDevelop.DefaultEditor.Gui.Editor.SharpDevelopTextEditorProperties&lt;/b&gt;&lt;/td&gt;&lt;td&gt;&lt;br /&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td id="red-fill-indent"&gt;bool CreateBackupCopy&lt;/td&gt;&lt;td&gt;Property removed.&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td id="red-fill-indent"&gt;bool UseAntiAliasedFont&lt;/td&gt;&lt;td&gt;Property removed.&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;&lt;b&gt;ICSharpCode.SharpDevelop.FileService&lt;/b&gt;&lt;/td&gt;&lt;td&gt;&lt;br /&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td id="red-fill-indent"&gt;IWorkbenchWindow GetOpenFile(string 
        fileName)&lt;/td&gt;&lt;td&gt;Method now returns an IViewContent type.&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td id="red-fill-indent"&gt;IWorkbenchWindow NewFile(string 
        defaultName, string language, string content)&lt;/td&gt;&lt;td&gt;Method now returns an IViewContent type and the language 
        parameter has been removed.&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td id="red-fill-indent"&gt;IWorkbenchWindow OpenFile(string 
        fileName)&lt;/td&gt;&lt;td&gt;Method now returns an IViewContent type.&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td id="red-fill"&gt;&lt;b&gt;ICSharpCode.SharpDevelop.Gui.AbstractBaseViewContent&lt;/b&gt;&lt;/td&gt;&lt;td&gt;Class has been removed.&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;&lt;b&gt;ICSharpCode.SharpDevelop.Gui.AbstractSecondaryViewContent&lt;/b&gt;&lt;/td&gt;&lt;td&gt;&lt;br /&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td id="red-fill-indent"&gt;void NotifyAfterSave(bool 
        successful)&lt;/td&gt;&lt;td&gt;Method removed.&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td id="red-fill-indent"&gt;void NotifyBeforeSave()&lt;/td&gt;&lt;td&gt;Method removed.&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td id="red-fill-indent"&gt;void NotifyFileNameChanged()&lt;/td&gt;&lt;td&gt;Method removed. Code should either use the TitleNameChanged 
        event or the FileNameChanged event on the PrimaryFile.&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;&lt;b&gt;ICSharpCode.SharpDevelop.Gui.AbstractViewContent&lt;/b&gt;&lt;/td&gt;&lt;td&gt;&lt;br /&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td id="red-fill-indent"&gt;event DirtyChanged&lt;/td&gt;&lt;td&gt;Event renamed to IsDirtyChanged.&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td id="red-fill-indent"&gt;string FileName&lt;/td&gt;&lt;td&gt;Property renamed to PrimaryFileName.&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td id="red-fill-indent"&gt;bool IsUntitled&lt;/td&gt;&lt;td&gt;Property removed. The property has been moved to the 
        OpenedFile type which can be accessed via the view 
        content&amp;#39;s PrimaryFile property.&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td id="red-fill-indent"&gt;void Load(string fileName)&lt;/td&gt;&lt;td&gt;Method replaced by the Load method that takes an OpenedFile 
        and a Stream.&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td id="green-fill-indent"&gt;void Load(OpenedFile file, Stream 
        stream)&lt;/td&gt;&lt;td&gt;New method that is used to open a file in a view. The 
        OpenedFile type contains information about the file, whilst the 
        stream is the actual file data.&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td id="red-fill-indent"&gt;event Saved&lt;/td&gt;&lt;td&gt;Event removed.&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td id="red-fill-indent"&gt;event Saving&lt;/td&gt;&lt;td&gt;Event removed.&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td id="red-fill-indent"&gt;string UntitledName&lt;/td&gt;&lt;td&gt;Property removed. The untitled name is now stored as the 
        filename.&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td id="red-fill"&gt;&lt;b&gt;ICSharpCode.SharpDevelop.Gui.DefaultWorkbench&lt;/b&gt;&lt;/td&gt;&lt;td&gt;Class is now private and no longer publicly accessible.&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td id="red-fill"&gt;&lt;b&gt;ICSharpCode.SharpDevelop.Gui.DriveObject&lt;/b&gt;&lt;/td&gt;&lt;td&gt;Class is now private and no longer publicly accessible.&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;&lt;b&gt;ICSharpCode.SharpDevelop.Gui.ExtTreeView&lt;/b&gt;&lt;/td&gt;&lt;td&gt;&lt;br /&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td id="red-fill-indent"&gt;void ApplyViewStateString(string 
        state, TreeView tree)&lt;/td&gt;&lt;td&gt;Method moved to the TreeViewHelper class.&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td id="red-fill-indent"&gt;string GetViewStateString(TreeView 
        tree)&lt;/td&gt;&lt;td&gt;Method moved to the TreeViewHelper class.&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td id="red-fill"&gt;&lt;b&gt;ICSharpCode.SharpDevelop.Gui.FileList&lt;/b&gt;&lt;/td&gt;&lt;td&gt;Class is now private and no longer publicly accessible.&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td id="red-fill"&gt;&lt;b&gt;ICSharpCode.SharpDevelop.Gui.IBaseViewContent&lt;/b&gt;&lt;/td&gt;&lt;td&gt;

          Interface has been removed. Most of the interface has been 
          moved to the IViewContent interface apart from the following 
          methods which no longer exist.
          &lt;pre&gt;void Deselected()&lt;br /&gt;void Deselecting()&lt;br /&gt;void Selected()&lt;br /&gt;void SwitchedTo()&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;&lt;b&gt;ICSharpCode.SharpDevelop.Gui.ICanBeDirty&lt;/b&gt;&lt;/td&gt;&lt;td&gt;&lt;br /&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td id="red-fill-indent"&gt;event DirtyChanged&lt;/td&gt;&lt;td&gt;Event renamed to IsDirtyChanged.&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td id="red-fill"&gt;bool IsDirty&lt;/td&gt;&lt;td&gt;Property setter is no longer defined in the interface. Only 
        the getter is defined.&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td id="red-fill"&gt;&lt;b&gt;ICSharpCode.SharpDevelop.Gui.IParseableContent&lt;/b&gt;&lt;/td&gt;&lt;td&gt;Interface removed.&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td id="red-fill"&gt;&lt;b&gt;ICSharpCode.SharpDevelop.Gui.ISecondaryViewContent&lt;/b&gt;&lt;/td&gt;&lt;td&gt;Interface removed. All secondary view contents now 
        implement the IViewContent interface.&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;&lt;b&gt;ICSharpCode.SharpDevelop.Gui.IViewContent&lt;/b&gt;&lt;/td&gt;&lt;td&gt;&lt;br /&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td id="green-fill-indent"&gt;bool IsDisposed&lt;/td&gt;&lt;td&gt;New property that indicates whether the view has been 
        disposed.&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td id="red-fill-indent"&gt;bool IsUntitled&lt;/td&gt;&lt;td&gt;Property removed. Code should check the PrimaryFile&amp;#39;s 
        Untitled property instead.&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td id="red-fill-indent"&gt;event Saved&lt;/td&gt;&lt;td&gt;Event removed.&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td id="green-fill-indent"&gt;bool 
        SupportsSwitchFromThisWithoutSaveLoad(OpenedFile file, 
        IViewContent newView)&lt;/td&gt;&lt;td&gt;New method. Determines whether switching without a 
        Save/Load is supported when switching from this view to another 
        view.&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td id="green-fill-indent"&gt;bool 
        SupportsSwitchToThisWithoutSaveLoad(OpenedFile file, 
        IViewContent oldView)&lt;/td&gt;&lt;td&gt;New method. Determines whether switching without a 
        Save/Load is supported when switching to this view from another 
        view.&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td id="green-fill-indent"&gt;IWorkbenchWindow WorkbenchWindow&lt;/td&gt;&lt;td&gt;Property moved from the now obsolete IBaseViewContent 
        interface. Gives access to the workbench window associated with 
        this view.&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td id="red-fill-indent"&gt;List&amp;lt;ISecondaryViewContent&amp;gt; 
        SecondaryViewContents&lt;/td&gt;&lt;td&gt;Property now returns an ICollection instead of a list.&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td id="red-fill-indent"&gt;event FileNameChanged&lt;/td&gt;&lt;td&gt;Event moved to the OpenedFile class which is accessible via 
        the PrimaryFile property.&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td id="red-fill-indent"&gt;event Saving&lt;/td&gt;&lt;td&gt;Event removed.&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td id="green-fill-indent"&gt;OpenedFile PrimaryFile&lt;/td&gt;&lt;td&gt;New property that gives access to information about the 
        primary file associated with this view.&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td id="green-fill-indent"&gt;IList&amp;lt;OpenedFile&amp;gt; Files&lt;/td&gt;&lt;td&gt;New property that returns a list of files that are 
        associated with this view.&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td id="green-fill-indent"&gt;event Disposed&lt;/td&gt;&lt;td&gt;New event raised when the view is disposed.&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td id="green-fill-indent"&gt;event TabPageTextChanged&lt;/td&gt;&lt;td&gt;New event raised when the tab page text at the bottom of 
        the window is changed.&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td id="red-fill-indent"&gt;string FileName&lt;/td&gt;&lt;td&gt;The filename associated with a view is now accessible from 
        the PrimaryFileName property.&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td id="green-fill-indent"&gt;string TabPageText&lt;/td&gt;&lt;td&gt;Gets or sets the tab page text at the bottom of the window. 
        This property was originally on the now obsolete 
        IBaseViewContent interface.&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td id="red-fill-indent"&gt;string UntitledName&lt;/td&gt;&lt;td&gt;Property removed. The UntitledName is now the same as the 
        PrimaryFileName.&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td id="green-fill-indent"&gt;Control Control&lt;/td&gt;&lt;td&gt;Gets or sets the control associated with this view. 
        Originally part of the IBaseViewContent interface.&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td id="red-fill-indent"&gt;void Load(string fileName)&lt;/td&gt;&lt;td&gt;Replaced by the Load method that takes an OpenedFile and a 
        Stream.&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td id="green-fill-indent"&gt;void Load(OpenedFile file, Stream 
        stream)&lt;/td&gt;&lt;td&gt;New method that is used to open a file in a view. The 
        OpenedFile type contains information about the file, whilst the 
        stream is the actual file data..&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td id="red-fill-indent"&gt;void Save()&lt;/td&gt;&lt;td&gt;Replaced by the Save method that takes an OpenedFile and a 
        Stream.&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td id="red-fill-indent"&gt;void Save(string fileName)&lt;/td&gt;&lt;td&gt;Replaced by the Save method that takes an OpenedFile and a 
        Stream.&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td id="green-fill-indent"&gt;void Save(OpenedFile file, Stream 
        stream)&lt;/td&gt;&lt;td&gt;New method that is used to save a file in a view.&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td id="red-fill"&gt;&lt;b&gt;ICSharpCode.SharpDevelop.Gui.IViewContentMemento&lt;/b&gt;&lt;/td&gt;&lt;td&gt;Class removed.&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td id="red-fill"&gt;&lt;b&gt;ICSharpCode.SharpDevelop.Gui.IViewContentMementoCreator&lt;/b&gt;&lt;/td&gt;&lt;td&gt;Class removed.&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;&lt;b&gt;ICSharpCode.SharpDevelop.Gui.IWorkbenchWindow&lt;/b&gt;&lt;/td&gt;&lt;td&gt;&lt;br /&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td id="red-fill-indent"&gt;IBaseViewContent ActiveViewContent&lt;/td&gt;&lt;td&gt;The ActiveViewContent property is now an IViewContent.&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td id="red-fill-indent"&gt;IViewContent ViewContent&lt;/td&gt;&lt;td&gt;Property removed. Use the ActiveViewContent property 
        instead.&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;&lt;b&gt;ICSharpCode.SharpDevelop.IDisplayBinding&lt;/b&gt;&lt;/td&gt;&lt;td&gt;&lt;br /&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td id="red-fill-indent"&gt;bool CanCreateContentForFile(string 
        fileName)&lt;/td&gt;&lt;td&gt;Method now takes an OpenedFile type instead of a 
        string.&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td id="red-fill-indent"&gt;bool 
        CanCreateContentForLanguage(string language)&lt;/td&gt;&lt;td&gt;Method removed.&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;&lt;b&gt;ICSharpCode.SharpDevelop.ISecondaryDisplayBinding&lt;/b&gt;&lt;/td&gt;&lt;td&gt;&lt;br /&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td id="red-fill-indent"&gt;ISecondaryViewContent[] 
        CreateSecondaryViewContent(IViewContent view)&lt;/td&gt;&lt;td&gt;Method now returns an IViewContent array since the 
        ISecondaryViewContent interface is obsolete.&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;&lt;h2&gt;ICSharpCode.TextEditor&lt;/h2&gt;&lt;table class="article"&gt;&lt;tr&gt;&lt;th&gt;Type&lt;/th&gt;&lt;th&gt;Description&lt;/th&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;&lt;b&gt;ICSharpCode.TextEditor.Caret&lt;/b&gt;&lt;/td&gt;&lt;td&gt;&lt;br /&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td id="red-fill-indent"&gt;Point Position&lt;/td&gt;&lt;td&gt;The Position property now uses the 
        ICSharpCode.TextEditor.TextLocation type instead of the 
        System.Drawing.Point type.&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td id="red-fill-indent"&gt;Point ValidatePosition(Position 
        pos)&lt;/td&gt;&lt;td&gt;The method now returns and uses the 
        ICSharpCode.TextEditor.TextLocation type instead of the 
        System.Drawing.Point type.&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;&lt;b&gt;ICSharpCode.TextEditor.Document.Bookmark&lt;/b&gt;&lt;/td&gt;&lt;td&gt;&lt;br /&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td id="red-fill-indent"&gt;event LineNumberChanged&lt;/td&gt;&lt;td&gt;Event removed.&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;&lt;b&gt;ICSharpCode.TextEditor.Document.BookmarkManager&lt;/b&gt;&lt;/td&gt;&lt;td&gt;&lt;br /&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td id="red-fill-indent"&gt;event Changed&lt;/td&gt;&lt;td&gt;Event removed.&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;&lt;b&gt;ICSharpCode.TextEditor.Document.DefaultFormattingStrategy&lt;/b&gt;&lt;/td&gt;&lt;td&gt;&lt;br /&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td id="red-fill-indent"&gt;int FormatLine(TextArea textArea, int 
        line, int caretOffset, char charTyped)&lt;/td&gt;&lt;td&gt;Method now no longer returns anything.&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;&lt;b&gt;ICSharpCode.TextEditor.Document.DefaultTextEditorProperties&lt;/b&gt;&lt;/td&gt;&lt;td&gt;&lt;br /&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td id="red-fill-indent"&gt;bool UseAntiAliasedFont&lt;/td&gt;&lt;td&gt;Property removed.&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;&lt;b&gt;ICSharpCode.TextEditor.Document.IDocument&lt;/b&gt;&lt;/td&gt;&lt;td&gt;&lt;br /&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td id="indent"&gt;LineSegment GetLineSegment(int line)&lt;/td&gt;&lt;td&gt;The default implementation in the DefaultLineSegment class 
        no longer allows the line number to be equal to the number of 
        items in the IDocument&amp;#39;s LineSegment collection.&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td id="red-fill-indent"&gt;Point OffsetToPosition(int offset)&lt;/td&gt;&lt;td&gt;Method now returns a TextLocation type.&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td id="red-fill-indent"&gt;int PositionToOffset(Point point)&lt;/td&gt;&lt;td&gt;Method now takes a TextLocation type.&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;&lt;b&gt;ICSharpCode.TextEditor.Document.IFormattingStrategy&lt;/b&gt;&lt;/td&gt;&lt;td&gt;&lt;br /&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td id="red-fill-indent"&gt;int FormatLine(TextArea textArea, int 
        line, int caretOffset, char charTyped)&lt;/td&gt;&lt;td&gt;Method now no longer returns anything.&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td id="red-fill"&gt;&lt;b&gt;ICSharpCode.TextEditor.Document.ILineManager&lt;/b&gt;&lt;/td&gt;&lt;td&gt;Interface has been removed.&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;&lt;b&gt;ICSharpCode.TextEditor.Document.ISelection&lt;/b&gt;&lt;/td&gt;&lt;td&gt;&lt;br /&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td id="red-fill-indent"&gt;bool ContainsPosition(Point point)&lt;/td&gt;&lt;td&gt;Method now uses a TextLocation type.&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td id="red-fill-indent"&gt;Point EndPosition&lt;/td&gt;&lt;td&gt;Property now uses a TextLocation type.&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td id="red-fill-indent"&gt;Point StartPosition&lt;/td&gt;&lt;td&gt;Property now uses a TextLocation type.&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;&lt;b&gt;ICSharpCode.TextEditor.Document.ITextEditorProperties&lt;/b&gt;&lt;/td&gt;&lt;td&gt;&lt;br /&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td id="red-fill-indent"&gt;bool CreateBackupCopy&lt;/td&gt;&lt;td&gt;Property removed.&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td id="red-fill-indent"&gt;bool UseAntiAliasedFont&lt;/td&gt;&lt;td&gt;Property removed.&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td id="red-fill"&gt;&lt;b&gt;ICSharpCode.TextEditor.Document.LineLengthEventArgs&lt;/b&gt;&lt;/td&gt;&lt;td&gt;Replaced by the LineLengthChangedEventArgs type.&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;&lt;b&gt;ICSharpCode.TextEditor.Gui.InsightWindow.IInsightDataProvider&lt;/b&gt;&lt;/td&gt;&lt;td&gt;&lt;br /&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td id="red-fill-indent"&gt;char CharTyped&lt;/td&gt;&lt;td&gt;Property removed.&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;&lt;b&gt;ICSharpCode.TextEditor.TextEditorControlBase&lt;/b&gt;&lt;/td&gt;&lt;td&gt;&lt;br /&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td id="red-fill-indent"&gt;event Changed&lt;/td&gt;&lt;td&gt;Event renamed to TextChanged.&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td id="red-fill-indent"&gt;bool CreateBackupCopy&lt;/td&gt;&lt;td&gt;Property removed.&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td id="red-fill-indent"&gt;bool IsUpdating&lt;/td&gt;&lt;td&gt;Property removed.&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td id="red-fill-indent"&gt;bool UseAntiAliasedFont&lt;/td&gt;&lt;td&gt;Property removed.&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;&lt;b&gt;ICSharpCode.TextEditor.ToolTipRequestEventArgs&lt;/b&gt;&lt;/td&gt;&lt;td&gt;&lt;br /&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td id="red-fill-indent"&gt;Point LogicalPosition&lt;/td&gt;&lt;td&gt;Property now uses a TextLocation type.&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;&lt;b&gt;ICSharpCode.TextEditor.Undo.UndoStack&lt;/b&gt;&lt;/td&gt;&lt;td&gt;&lt;br /&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td id="red-fill-indent"&gt;void CombineLast(int actionCount)&lt;/td&gt;&lt;td&gt;Method removed. Similar functionality can be obtained by 
        using the StartUndoGroup and EndUndoGroup method.&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td id="red-fill-indent"&gt;void UndoLast(int actionCount)&lt;/td&gt;&lt;td&gt;Method removed. Similar functionality can be obtained by 
        using the StartUndoGroup and EndUndoGroup method.&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;&lt;h2&gt;How to Port&lt;/h2&gt;&lt;p&gt;This section looks at one way to port an addin. This is the way 
    that the IronPython addin was ported from SharpDevelop 2.2 to 
    SharpDevelop 3.&lt;/p&gt;&lt;p&gt;Download the source code for SharpDevelop 3.0 and 2.2.&lt;/p&gt;&lt;p&gt;Copy the source code of your addin to a folder inside 
    SharpDevelop 3.0.&lt;/p&gt;&lt;p&gt;Run three copies of SharpDevelop, one to view SharpDevelop 
    2.2&amp;#39;s source, one to view SharpDevelop 3.0&amp;#39;s source, one 
    with your addin. In the other copies of SharpDevelop you should 
    open SharpDevelop.sln for 2.2 and 3.0. This will allow you to 
    quickly search for SharpDevelop classes when you find your addin 
    code will not compile.&lt;/p&gt;&lt;p&gt;Compile your code and fix the code or comment it out as you try 
    to work out what is wrong.&lt;/p&gt;&lt;p&gt;You do not have to convert the project to use .NET 3.5. 
    SharpDevelop itself uses it, but some of the addins do not. With 
    the IronPython addin I needed to change it to use .NET 3.5 since 
    there were some assembly conflicts between what SharpDevelop was 
    using and what the addin was using. Obviously changing to use .NET 
    3.5 will allow you to use any new features of this framework.&lt;/p&gt;&lt;h2&gt;.NET Framework Differences&lt;/h2&gt;&lt;p&gt;One change in .NET 3.5 caused me a few problems when porting the 
    IronPython addin. This was a change in MSBuild.&lt;/p&gt;&lt;p&gt;After finally getting the IronPython addin to compile with the 
    modified SharpDevelop 3 assemblies there was an assembly conflict 
    for MSBuild. The ICSharpCode.SharpDevelop assembly now uses MSBuild 
    3.5 assemblies whilst the IronPython build task project and test 
    project were using MSBuild 2.0. This was fixed by converting these 
    two projects so they use the .NET Framework 3.5. This can be done 
    by opening the project&amp;#39;s properties, selecting the Compiling 
    tab, then clicking the Convert Project to C# 3.0 button. In the 
    dialog that opens we select the &amp;quot;Change target framework to 
    .NET 3.5&amp;quot; and click the OK button. After making this change 
    the addin compiled and worked however all the unit tests for the 
    IronPython build tasks were failing with the error:&lt;/p&gt;&lt;p&gt;System.ArrayTypeMismatchException : Attempted to access an 
    element as a type incompatible with the array.&lt;/p&gt;&lt;p&gt;The test code that was failing:&lt;/p&gt;&lt;pre id="xml"&gt;PythonCompilerTask compiler = new PythonCompilerTask(); &lt;br /&gt;TaskItem sourceTaskItem = new TaskItem(&amp;quot;test.py&amp;quot;); &lt;br /&gt;compiler.Sources = new ITaskItem[] {sourceTaskItem}; &lt;/pre&gt;&lt;p&gt;The last line was failing when the unit test was run. The 
    TaskItem type implements the ITaskItem interface so the code should 
    have worked. The reason for this error is that both the build task 
    and build task tests project were referencing the MSBuild libraries 
    just using the reference name.&lt;/p&gt;&lt;pre id="xml"&gt;    &amp;lt;Reference Include=&amp;quot;Microsoft.Build.Framework&amp;quot; /&amp;gt; &lt;br /&gt;    &amp;lt;Reference Include=&amp;quot;Microsoft.Build.Tasks&amp;quot; /&amp;gt; &lt;br /&gt;    &amp;lt;Reference Include=&amp;quot;Microsoft.Build.Utilities&amp;quot; /&amp;gt; &lt;/pre&gt;&lt;p&gt;Running MSBuild from the command line the actual assemblies 
    being used were a mix of 3.5 and 2.0 versions.&lt;/p&gt;&lt;pre id="xml"&gt;&amp;quot;Python.Build.Tasks.csproj&amp;quot;: &lt;br /&gt;/reference:&amp;quot;C:\Program Files\Reference Assemblies\Microsoft\Framework\v3.5\Microsoft.Build.Framework.dll&amp;quot;  &lt;br /&gt;/reference:C:\WINDOWS\Microsoft.NET\Framework\v2.0.50727\Microsoft.Build.Tasks.dll  &lt;br /&gt;/reference:C:\WINDOWS\Microsoft.NET\Framework\v2.0.50727\Microsoft.Build.Utilities.dll  &lt;/pre&gt;&lt;p&gt;Printing out the code base of the TaskItem and ITaskItem types 
    whilst running the unit tests showed that the TaskItem was being 
    taken from Microsoft.Build.Utilities assembly version 2.0 and the 
    ITaskItem was being taken the Microsoft.Build.Framework 3.5 
    assembly. The TaskItem we actually needed was in the new 
    Microsoft.Build.Utilities assembly version 3.5. Changing the 
    project references so they used this new 3.5 assembly fixed the 
    problem.&lt;/p&gt;&lt;img src="http://community.sharpdevelop.net/aggbug.aspx?PostID=20160" width="1" height="1"&gt;</content><author><name>MattWard</name><uri>http://community.sharpdevelop.net/members/MattWard.aspx</uri></author><category term="Porting" scheme="http://community.sharpdevelop.net/blogs/mattward/archive/tags/Porting/default.aspx" /></entry><entry><title>IronPython AddIn Internals</title><link rel="alternate" type="text/html" href="http://community.sharpdevelop.net/blogs/mattward/archive/2007/11/18/IronPythonAddInInternals.aspx" /><link rel="enclosure" type="application/zip" length="741997" href="http://community.sharpdevelop.net/blogs/mattward/attachment/19803.ashx" /><id>http://community.sharpdevelop.net/blogs/mattward/archive/2007/11/18/IronPythonAddInInternals.aspx</id><published>2007-11-18T15:54:00Z</published><updated>2007-11-18T15:54:00Z</updated><content type="html">This is a tutorial about how to create a language binding for SharpDevelop using the IronPython addin as an example. As well as covering how to create a language binding it will also look at how the addin used IronPython. The source code for the IronPython addin is available at the end of this tutorial.

The tutorial will cover the following.

    * Syntax Highlighting
    * File Filters
    * Project and File Templates
    * Compiling a Project
    * Project Options
    * Code Folding
    * Class View
    * Creating a Forms Designer
    * Code Completion
    * Code Conversion
...(&lt;a href="http://community.sharpdevelop.net/blogs/mattward/archive/2007/11/18/IronPythonAddInInternals.aspx"&gt;read more&lt;/a&gt;)&lt;img src="http://community.sharpdevelop.net/aggbug.aspx?PostID=19803" width="1" height="1"&gt;</content><author><name>MattWard</name><uri>http://community.sharpdevelop.net/members/MattWard.aspx</uri></author><category term="Python" scheme="http://community.sharpdevelop.net/blogs/mattward/archive/tags/Python/default.aspx" /></entry><entry><title>IronPython Integration In SharpDevelop 2.2</title><link rel="alternate" type="text/html" href="http://community.sharpdevelop.net/blogs/mattward/archive/2007/10/21/IronPythonIntegrationInSharpDevelop22.aspx" /><link rel="enclosure" type="application/zip" length="558193" href="http://community.sharpdevelop.net/blogs/mattward/attachment/19421.ashx" /><id>http://community.sharpdevelop.net/blogs/mattward/archive/2007/10/21/IronPythonIntegrationInSharpDevelop22.aspx</id><published>2007-10-21T16:02:00Z</published><updated>2007-10-21T16:02:00Z</updated><content type="html">&lt;p&gt;Support for 
    &lt;a href="http://www.codeplex.com/IronPython/Release/ProjectReleases.aspx?ReleaseId=2573"&gt;
    IronPython 1.1&lt;/a&gt; is now available for 
    &lt;a href="http://www.sharpdevelop.net/OpenSource/SD/Download/GetFile.aspx?What=Setup&amp;amp;Release=Serralongue"&gt;
    SharpDevelop 2.2.1.2648&lt;/a&gt;. The IronPython addin is an early alpha 
    release and is not an official part of SharpDevelop 2.2.1 so it is 
    available as a separate download at the end of this post.&lt;/p&gt;

&lt;p&gt;The addin will not work with SharpDevelop 3.0 nor IronPython 
    2.0.&lt;/p&gt;
&lt;h2&gt;Features&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;Code folding&lt;/li&gt;

&lt;li&gt;Syntax highlighting&lt;/li&gt;

&lt;li&gt;File and project templates for Console and Windows Forms 
      applications&lt;/li&gt;

&lt;li&gt;Code completion (limited)&lt;/li&gt;

&lt;li&gt;Windows Forms designer&lt;/li&gt;

&lt;li&gt;C# and VB.NET code conversion to Python&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Please note that code completion, the forms designer and code 
    conversion all need a lot more work.&lt;/p&gt;
&lt;h2&gt;Creating a Windows Application&lt;/h2&gt;
&lt;p&gt;Open up the new project dialog by selecting &lt;b&gt;New&lt;/b&gt; then 
    &lt;b&gt;Solution&lt;/b&gt; from the &lt;b&gt;File&lt;/b&gt; menu. Selecting the Python 
    category will show two project templates. One will create a Windows 
    console application and the other will create a Windows Forms 
    application.&lt;/p&gt;

&lt;p&gt;&lt;img src="http://community.sharpdevelop.net/photos/mattward/images/original/NewPythonProjectDialog.aspx" alt="New Python Project Dialog"&gt;&lt;/p&gt;

&lt;p&gt;Once you have created a new project you will then need to add a 
    reference to the IronPython assembly. Open the &lt;b&gt;Projects&lt;/b&gt; 
    window by selecting &lt;b&gt;Projects&lt;/b&gt; from the &lt;b&gt;View&lt;/b&gt; menu. In 
    the &lt;b&gt;Projects&lt;/b&gt; window, right click the project and select 
    &lt;b&gt;Add Reference&lt;/b&gt;. Select the &lt;b&gt;.NET Assembly Browser&lt;/b&gt; tab 
    and click the &lt;b&gt;Browse&lt;/b&gt; button. Then browse to IronPython.dll. 
    The addin includes this file so can either extract it from there or 
    if you installed it from the sdaddin file then you should be able 
    to find the IronPython.dll in the folder:&lt;/p&gt;

&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;pre&gt;C:\Documents&amp;nbsp;and&amp;nbsp;Settings\[YourUserName]\Application &lt;br&gt;    Data\ICSharpCode\SharpDevelop2.1\AddIns\ICSharpCode.PythonBinding&lt;/pre&gt;
&lt;p&gt;To build the application select &lt;b&gt;Build Solution&lt;/b&gt; from the 
    &lt;b&gt;Build&lt;/b&gt; menu.&lt;/p&gt;

&lt;p&gt;The built executables cannot be run with the debugger so instead 
    select &lt;b&gt;Run without debugger&lt;/b&gt; from the &lt;b&gt;Debug&lt;/b&gt; menu. If 
    you are running a windows app and nothing seems to happen then open 
    a command line window and run it from there. This way you should 
    see any errors reported from the IronPython runtime.&lt;/p&gt;

&lt;p&gt;There are a few file templates which can be added to the project 
    as shown below.&lt;/p&gt;

&lt;p&gt;&lt;img src="http://community.sharpdevelop.net/photos/mattward/images/original/NewPythonFileDialog.aspx"&gt;&lt;/p&gt;
&lt;h2&gt;Designing Windows Forms&lt;/h2&gt;
&lt;p&gt;The Windows Forms designer is still in its early stages so 
    please be warned that it may break the form's code or worse. 
    Most of the Windows Forms controls work with the designer but 
    things like adding columns to a list view will generate code that 
    does not compile.&lt;/p&gt;

&lt;p&gt;The designer can be opened in the usual way by opening the form 
    in the text editor and selecting the Design tab at the bottom of 
    the text editor.&lt;/p&gt;

&lt;p&gt;&lt;img src="http://community.sharpdevelop.net/photos/mattward/images/original/PythonMainFormBeforeOpeningInDesigner.aspx" alt="Python main form before opening the designer"&gt;&lt;/p&gt;

&lt;p&gt;Once open in the designer you can add controls to the form in 
    the usual way from the Tools window. In the screenshot below a 
    label, text box and a button have been added.&lt;/p&gt;

&lt;p&gt;&lt;img src="http://community.sharpdevelop.net/photos/mattward/images/original/PythonMainFormInDesigner.aspx" alt="Main form designed in designer"&gt;&lt;/p&gt;

&lt;p&gt;Click the Source tab to view the generated code in the 
    InitializeComponents method.&lt;/p&gt;

&lt;p&gt;&lt;img src="http://community.sharpdevelop.net/photos/mattward/images/original/PythonMainFormGeneratedCode.aspx" alt="Generated form code"&gt;&lt;/p&gt;
&lt;h2&gt;Code Folding&lt;/h2&gt;
&lt;p&gt;Code folding allows you to collapse regions of a class.&lt;/p&gt;

&lt;p&gt;&lt;img src="http://community.sharpdevelop.net/photos/mattward/images/original/PythonClassBeforeFolding.aspx"&gt;&lt;/p&gt;

&lt;p&gt;&lt;img src="http://community.sharpdevelop.net/photos/mattward/images/original/PythonClassFolded.aspx" alt="Folded python code"&gt;&lt;/p&gt;
&lt;h2&gt;Code Completion&lt;/h2&gt;
&lt;p&gt;Code completion is very limited currently. If you type a space 
    after an import statement then you will get a list of namespaces 
    available.&lt;/p&gt;

&lt;p&gt;&lt;img src="http://community.sharpdevelop.net/photos/mattward/images/original/PythonImportCodeCompletion.aspx" alt="Import code completion"&gt;&lt;/p&gt;

&lt;p&gt;Code completion for classes is one area which has the most 
    limited support. If you open Program.py you can get code completion 
    for static classes such as System.Console but it does not work 
    everywhere.&lt;/p&gt;

&lt;p&gt;&lt;img src="http://community.sharpdevelop.net/photos/mattward/images/original/PythonSystemNamespaceCodeCompletion.aspx"&gt;&lt;/p&gt;

&lt;p&gt;&lt;img src="http://community.sharpdevelop.net/photos/mattward/images/original/PythonConsoleWriteLineCodeCompletion.aspx" alt="Console.WriteLine code completion"&gt;&lt;/p&gt;

&lt;p&gt;&lt;img src="http://community.sharpdevelop.net/photos/mattward/images/original/PythonConsoleWriteLineMethodInsight.aspx" alt="Method insight for Python"&gt;&lt;/p&gt;
&lt;h2&gt;Code Conversion&lt;/h2&gt;
&lt;p&gt;To convert VB.NET or C# to Python open the file you want to 
    convert and then select &lt;b&gt;Convert code to Python&lt;/b&gt; from the 
    &lt;b&gt;Tools&lt;/b&gt; menu.&lt;/p&gt;

&lt;p&gt;&lt;img src="http://community.sharpdevelop.net/photos/mattward/images/original/ConvertCodeToPythonMenuItem.aspx" alt="Convert code to Python menu item"&gt;&lt;/p&gt;

&lt;p&gt;The code conversion is limited to classes so it will not convert 
    an arbitary piece of code that is not inside a class. A C# class 
    being converted to Python is shown below.&lt;/p&gt;

&lt;p&gt;&lt;img src="http://community.sharpdevelop.net/photos/mattward/images/original/CSharpCodeBeforeConversionToPython.aspx" alt="C# code before converting to Python"&gt;&lt;/p&gt;

&lt;p&gt;&lt;img src="http://community.sharpdevelop.net/photos/mattward/images/original/ConvertedCSharpClassAsPython.aspx" alt="Converted Python code"&gt;&lt;/p&gt;

&lt;p&gt;The code conversion is still at an early stage of development so 
    it will fail on complicated classes.&lt;/p&gt;
&lt;h2&gt;Class View&lt;/h2&gt;
&lt;p&gt;Classes in the open solution will be displayed in the Class 
    browser (Select &lt;b&gt;Classes&lt;/b&gt; from the &lt;b&gt;View&lt;/b&gt; menu).&lt;/p&gt;

&lt;p&gt;&lt;img src="http://community.sharpdevelop.net/photos/mattward/images/original/PythonClassInClassWindow.aspx" alt="Python class in Classes window"&gt;&lt;/p&gt;

&lt;p&gt;From there you can double click a class or method and the text 
    editor will display the corresponding code.&lt;/p&gt;
&lt;h2&gt;Standalone Python Files&lt;/h2&gt;
&lt;p&gt;The addin has support for standalone Python files. If you open a 
    file with a .py file extension then a Python menu will appear.&lt;/p&gt;

&lt;p&gt;&lt;img src="http://community.sharpdevelop.net/photos/mattward/images/original/PythonRunMenuItem.aspx" alt="Python menu items"&gt;&lt;/p&gt;

&lt;p&gt;From this menu you can run ipy.exe and have it execute the file. 
    Any output from the Python script will be shown in the Output 
    window. &lt;/p&gt;

&lt;p&gt;By default the ipy.exe run is the one that ships with the addin. 
    You can choose another IronPython console by select &lt;b&gt;Options&lt;/b&gt; 
    from the &lt;b&gt;Tools&lt;/b&gt; menu. Selecting the &lt;b&gt;Python&lt;/b&gt; option 
    allows you to choose another IronPython console.&lt;/p&gt;

&lt;p&gt;&lt;img src="http://community.sharpdevelop.net/photos/mattward/images/original/PythonToolsOptionsDialog.aspx" alt="Python options dialog"&gt;&lt;/p&gt;
&lt;h2&gt;Installing the IronPython AddIn&lt;/h2&gt;
&lt;ol&gt;
&lt;li&gt;Rename the &lt;b&gt;IronPythonAddIn-0.2.1.zip&lt;/b&gt; file to 
      &lt;b&gt;IronPythonAddIn-0.2.1.sdaddin&lt;/b&gt;.&lt;/li&gt;

&lt;li&gt;
        From the 
        &lt;b&gt;Tools&lt;/b&gt;
         menu select 
        &lt;b&gt;AddIn Manager&lt;/b&gt;
         .
        
&lt;p&gt;&lt;img src="http://community.sharpdevelop.net/photos/mattward/images/original/ToolsAddInManagerMenuItem.aspx" alt="Tools AddIn Manager menu item"&gt;&lt;/p&gt;
&lt;/li&gt;

&lt;li&gt;
        Click the 
        &lt;b&gt;Install AddIn&lt;/b&gt;
         button.
        
&lt;p&gt;&lt;img src="http://community.sharpdevelop.net/photos/mattward/images/original/AddInManagerDialog.aspx" alt="AddIn Manager dialog"&gt;&lt;/p&gt;
&lt;/li&gt;

&lt;li&gt;
        In the Open File Dialog browse to the 
        &lt;b&gt;IronPythonAddIn-0.2.1.sdaddin&lt;/b&gt;
         file and click the 
        &lt;b&gt;Open&lt;/b&gt;
         button.
        
&lt;p&gt;&lt;img src="http://community.sharpdevelop.net/photos/mattward/images/original/IronPythonAddInInstalledDialog.aspx" alt="AddIn installed confirmation dialog."&gt;&lt;/p&gt;
&lt;/li&gt;

&lt;li&gt;Click the &lt;b&gt;Close&lt;/b&gt; button.&lt;/li&gt;

&lt;li&gt;Restart SharpDevelop.&lt;/li&gt;
&lt;/ol&gt;
&lt;h2&gt;Future Work&lt;/h2&gt;
&lt;p&gt;Since SharpDevelop 2.2.1.2648 is the last release in the 2.x 
    branch the next release of the IronPython addin will be for 
    SharpDevelop 3.0 and it will support IronPython 2.0.&lt;/p&gt;
&lt;h2&gt;Python Links&lt;/h2&gt;
&lt;p&gt;Some of the Python tutorials and links used whilst creating the 
    IronPython addin.&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;&lt;a href="http://docs.python.org/"&gt;Python documentation&lt;/a&gt; by 
      Guido van Rossum the author of Python.&lt;/li&gt;

&lt;li&gt;&lt;a href="http://www.diveintopython.org/"&gt;Dive into Python&lt;/a&gt; 
      book by Mark Pilgrim. The full text is available online.&lt;/li&gt;

&lt;li&gt;&lt;a href="http://www.codeplex.com/IronPython"&gt;IronPython 
      homepage&lt;/a&gt;.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;&amp;nbsp;&lt;/p&gt;

&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;img src="http://community.sharpdevelop.net/aggbug.aspx?PostID=19421" width="1" height="1"&gt;</content><author><name>MattWard</name><uri>http://community.sharpdevelop.net/members/MattWard.aspx</uri></author><category term="Python" scheme="http://community.sharpdevelop.net/blogs/mattward/archive/tags/Python/default.aspx" /></entry><entry><title>New Features in SharpDevelop 2.1</title><link rel="alternate" type="text/html" href="http://community.sharpdevelop.net/blogs/mattward/archive/2007/03/05/NewFeaturesInSharpDevelop21.aspx" /><id>http://community.sharpdevelop.net/blogs/mattward/archive/2007/03/05/NewFeaturesInSharpDevelop21.aspx</id><published>2007-03-05T18:27:00Z</published><updated>2007-03-05T18:27:00Z</updated><content type="html">&lt;p&gt;Here is the list of features that have been added to 
    SharpDevelop 2.1.&lt;/p&gt;&lt;table class="article"&gt;&lt;tr&gt;&lt;th&gt;Feature&lt;/th&gt;&lt;th&gt;Description&lt;/th&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;&lt;a href="http://laputa.sharpdevelop.net/FxCopSupportInSharpDevelop221Serralongue.aspx"&gt;Code Analysis with FxCop&lt;/a&gt;&lt;/td&gt;&lt;td&gt;Analyse your code with 
        &lt;a href="http://community.sharpdevelop.net/controlpanel/blogs/www.gotdotnet.com/Team/FxCop/"&gt;FxCop&lt;/a&gt; inside 
        SharpDevelop.&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;&lt;a href="http://laputa.sharpdevelop.net/CodeCompletionSupportForNET1011AndCompactFramework20.aspx"&gt;Code Completion for Different Frameworks&lt;br&gt;&lt;/a&gt;&lt;/td&gt;&lt;td&gt;When a particular .NET framework is targeted by a project 
        you will get code completion for that framework. Currently .NET 
        1.1, Mono 2.0 and Compact Framework 2.0 are supported.&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;&lt;a href="http://community.sharpdevelop.net/blogs/davidalpert/archive/2006/09/18/Code-Navigation-History.aspx"&gt;Code Navigation History&lt;/a&gt;&lt;/td&gt;&lt;td&gt;Allows you to quickly navigate backwards and forwards 
        through visited code.&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;Compact Framework Support&lt;/td&gt;&lt;td&gt;New templates and code completion for the Compact Framework 
        have been added.&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;&lt;a href="http://community.sharpdevelop.net/blogs/mattward/archive/2006/06/20/UsingTheComponentInspector.aspx"&gt;Component Inspector&lt;/a&gt;&lt;/td&gt;&lt;td&gt;SharpDevelop includes the 
        &lt;a href="http://www.oaklandsoftware.com/product_compinsp1/product_1.html"&gt;.NET Component Inspector&lt;/a&gt; created by 
        &lt;a href="http://www.oaklandsoftware.com/"&gt;Oakland Software&lt;/a&gt;. 
        The Component Inspector allows you to explore any type in an 
        assembly or COM component, create an instance of that type, 
        execute its methods, change its properties, and monitor its 
        events.&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;Custom Tool Support&lt;/td&gt;&lt;td&gt;A custom tool is a component that is run every time a 
        particular file is saved. SharpDevelop ships with a 
        ResXFileCodeGenerator custom tool that can be used to 
        automatically generate a class that provides strongly typed 
        access to a resource file. An addin can also extend 
        SharpDevelop with its own custom tools.&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;Edit Solution Configuration&lt;/td&gt;&lt;td&gt;You can now add, remove and rename solution build 
        configurations.&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;&lt;a href="http://community.sharpdevelop.net/blogs/mattward/archive/2006/08/09/GoToXmlSchemaDefinition.aspx"&gt;Go to XML Schema Definition&lt;/a&gt;&lt;/td&gt;&lt;td&gt;Whilst editing an XML document with an associated schema 
        you can quickly navigate to the schema definition of the 
        currently selected element, attribute or attribute value.&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;&lt;a href="http://laputa.sharpdevelop.net/AnnouncingSharpDevelopForApplicationsSDA.aspx"&gt;Hosting SharpDevelop - SharpDevelop for Applications&lt;/a&gt;&lt;/td&gt;&lt;td&gt;You can now host SharpDevelop inside your own application. 
        This allows you to create your own IDE with support for addins 
        without having to write the code from scratch.&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;&lt;a href="http://community.sharpdevelop.net/blogs/mattward/archive/2006/09/09/IncrementalSearchInSharpDevelop21.aspx"&gt;Incremental Search&lt;/a&gt;&lt;/td&gt;&lt;td&gt;You can now search the active document incrementally. As 
        you type in each character the document is searched from the 
        current cursor position and the first match is highlighted.&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;&lt;a href="http://community.sharpdevelop.net/blogs/christianhornung/archive/2006/10/04/ResourceToolkit-addin.aspx"&gt;Resource Toolkit&lt;/a&gt;&lt;/td&gt;&lt;td&gt;The resource toolkit provides code completion and tooltips 
        for string resources when localizing an application.&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;&lt;a href="http://community.sharpdevelop.net/blogs/dickonfield/archive/2006/12/03/basic-sql-tool-in-revision-2125-as-part-of-servertools.aspx"&gt;SQL Queries&lt;/a&gt;&lt;/td&gt;&lt;td&gt;SharpDevelop includes a simple SQL query tool that allows 
        you to run SQL queries and view the results.&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;&lt;a href="http://laputa.sharpdevelop.net/SharpReportStandalone.aspx"&gt;Standalone SharpDevelop Reports&lt;/a&gt;&lt;/td&gt;&lt;td&gt;SharpDevelop Reports is now available as a standalone 
        application as well as being integrated inside 
        SharpDevelop.&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;Subversion Integration&lt;/td&gt;&lt;td&gt;SharpDevelop integrates with 
        &lt;a href="http://tortoisesvn.tigris.org/"&gt;TortoiseSVN&lt;/a&gt; to 
        provide support for &lt;a href="http://subversion.tigris.org/"&gt;
        Subversion&lt;/a&gt;.&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;&lt;a href="http://community.sharpdevelop.net/blogs/mattward/archive/2006/12/14/TestingWithDotnet11InSharpDevelop21.aspx"&gt;Testing with .NET 1.1&lt;/a&gt;&lt;/td&gt;&lt;td&gt;If your unit test project targets .NET 1.1 then the tests 
        will be run under this framework.&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;&lt;a href="http://community.sharpdevelop.net/blogs/mattward/archive/2006/09/17/WixIntegration.aspx"&gt;WiX Integration&lt;/a&gt;&lt;/td&gt;&lt;td&gt;You can create &lt;a href="http://wix.sourceforge.net"&gt;WiX&lt;/a&gt; 
        setup packages and design WiX dialogs with SharpDevelop's 
        forms designer.&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;XML Tree Editor&lt;/td&gt;&lt;td&gt;You can view and edit XML in a tree based editor similar to 
        Microsoft's 
        &lt;a href="http://www.microsoft.com/downloads/details.aspx?familyid=72D6AA49-787D-4118-BA5F-4F30FE913628"&gt;XML Notepad&lt;/a&gt;.&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;&lt;a href="http://community.sharpdevelop.net/blogs/mattward/archive/2006/08/05/TestingXPathQueriesInSharpDevelop.aspx"&gt;XPath Queries&lt;/a&gt;&lt;/td&gt;&lt;td&gt;You can run xpath queries on the active XML document and 
        the matched items will be highlighted in the text editor.&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;&lt;img src="http://community.sharpdevelop.net/aggbug.aspx?PostID=15586" width="1" height="1"&gt;</content><author><name>MattWard</name><uri>http://community.sharpdevelop.net/members/MattWard.aspx</uri></author></entry><entry><title>Creating an Installer with SharpDevelop</title><link rel="alternate" type="text/html" href="http://community.sharpdevelop.net/blogs/mattward/archive/2007/01/08/CreatingAnInstallerWithSharpDevelop.aspx" /><id>http://community.sharpdevelop.net/blogs/mattward/archive/2007/01/08/CreatingAnInstallerWithSharpDevelop.aspx</id><published>2007-01-08T21:30:00Z</published><updated>2007-01-08T21:30:00Z</updated><content type="html">This tutorial will walk you through creating an installer from scratch using the integrated WiX support included with SharpDevelop 2.1. It takes you step by step through the process, from creating an empty WiX setup project, adding files to the installer, using the WiX dialog library, through to building and validating the installer....(&lt;a href="http://community.sharpdevelop.net/blogs/mattward/archive/2007/01/08/CreatingAnInstallerWithSharpDevelop.aspx"&gt;read more&lt;/a&gt;)&lt;img src="http://community.sharpdevelop.net/aggbug.aspx?PostID=14533" width="1" height="1"&gt;</content><author><name>MattWard</name><uri>http://community.sharpdevelop.net/members/MattWard.aspx</uri></author><category term="WiX" scheme="http://community.sharpdevelop.net/blogs/mattward/archive/tags/WiX/default.aspx" /></entry><entry><title>Configuring File Associations in the Installer</title><link rel="alternate" type="text/html" href="http://community.sharpdevelop.net/blogs/mattward/archive/2007/01/01/ConfiguringFileAssociationsInTheInstaller.aspx" /><id>http://community.sharpdevelop.net/blogs/mattward/archive/2007/01/01/ConfiguringFileAssociationsInTheInstaller.aspx</id><published>2007-01-01T12:34:00Z</published><updated>2007-01-01T12:34:00Z</updated><content type="html">&lt;p&gt;The installer for SharpDevelop 2.1, from revision 2245 onwards, 
    now allows you to configure the file associations that are created. Previously the installer would register them 
    without asking and you would lose any file associations that Visual 
    Studio had previously set up.&lt;/p&gt;&lt;p&gt;When you install SharpDevelop you will now be presented with a 
    dialog containing a feature tree.&lt;/p&gt;&lt;p&gt;&lt;img src="http://community.sharpdevelop.net/photos/mattward/images/original/InstallerWithFeatureTree.aspx"&gt;&lt;/p&gt;&lt;p&gt;Expand the &lt;b&gt;File Associations&lt;/b&gt; feature to see the list of 
    file associations that will be created by default.&lt;/p&gt;&lt;p&gt;&lt;img src="http://community.sharpdevelop.net/photos/mattward/images/original/InstallerFileAssocsExpanded.aspx"&gt;&lt;/p&gt;&lt;p&gt;From this dialog you can stop the installer from registering any 
    file associations or you can disable individual file associations. 
    To stop the installer from registering any associations, right 
    click &lt;b&gt;File Associations&lt;/b&gt; and select &lt;b&gt;Entire feature will be 
    unavailable&lt;/b&gt;.&lt;/p&gt;&lt;p&gt;&lt;img src="http://community.sharpdevelop.net/photos/mattward/images/original/DisablingAllFileAssocs.aspx"&gt;&lt;/p&gt;&lt;p&gt;Disabled file associations will then be marked with a red 
    cross.&lt;/p&gt;&lt;p&gt;&lt;img src="http://community.sharpdevelop.net/photos/mattward/images/original/AllFileAssocsDisabled.aspx"&gt;&lt;/p&gt;&lt;p&gt;Individual file associations can be selected and disabled in the 
    same way.&lt;/p&gt;&lt;img src="http://community.sharpdevelop.net/aggbug.aspx?PostID=14293" width="1" height="1"&gt;</content><author><name>MattWard</name><uri>http://community.sharpdevelop.net/members/MattWard.aspx</uri></author><category term="Installer" scheme="http://community.sharpdevelop.net/blogs/mattward/archive/tags/Installer/default.aspx" /></entry><entry><title>Testing with .NET 1.1 in SharpDevelop 2.1</title><link rel="alternate" type="text/html" href="http://community.sharpdevelop.net/blogs/mattward/archive/2006/12/14/TestingWithDotnet11InSharpDevelop21.aspx" /><id>http://community.sharpdevelop.net/blogs/mattward/archive/2006/12/14/TestingWithDotnet11InSharpDevelop21.aspx</id><published>2006-12-14T21:12:00Z</published><updated>2006-12-14T21:12:00Z</updated><content type="html">
&lt;p&gt;SharpDevelop 2.1, as of revision 2135, now allows you to run 
    your unit tests against .NET 1.1 or .NET 2.0.&lt;/p&gt;

&lt;p&gt;Which framework your tests are run under is determined by the 
    target framework your test project. So if you choose .NET 1.1 as 
    your target framework, your tests are run in the .NET 1.1 
    framework. The project's target framework can be set by 
    selecting &lt;b&gt;Project Options&lt;/b&gt; from the &lt;b&gt;Project&lt;/b&gt; menu, then 
    opening the &lt;b&gt;Compiling&lt;/b&gt; tab.&lt;/p&gt;

&lt;p&gt;&lt;img src="http://community.sharpdevelop.net/photos/mattward/images/original/FeatureTourTargetingDifferentFrameworks.aspx" alt="Target framework options"&gt;&lt;/p&gt;

&lt;p&gt;Only .NET 1.1 and .NET 2.0 are supported, so if you choose 
    another framework, such as one of the Compact Frameworks or Mono 
    SharpDevelop will run your unit tests under .NET 2.0.&lt;/p&gt;

&lt;p&gt;There's currently no support for Mono because our modified 
    nunit-console has a threading problem which happens very frequently 
    under Mono, but never seems to occur under Microsoft's .NET 
    Framework.&lt;/p&gt;
&lt;h2&gt;Running under another .NET Framework&lt;/h2&gt;
&lt;p&gt;Since SharpDevelop recently moved to using nunit-console to run 
    unit tests it was a fairly simple task to make it possible to test 
    against .NET 1.1 or .NET 2.0. It is straight forward because 
    nunit-console can be compiled against .NET 1.1. Since SharpDevelop 
    is launching nunit-console as a separate process we could have used 
    one of the following to target one particular framework.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;app.config&lt;/li&gt;

&lt;li&gt;COMPLUS_Version environment variable&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;App.Config&lt;/h2&gt;
&lt;p&gt;Using an app.config file is the most obvious and well documented 
    way to target a particular framework and is actually how 
    SharpDevelop gets nunit-console to target the different 
    frameworks.&lt;/p&gt;

&lt;p&gt;To run unit tests with .NET 1.1 we have nunit-console.exe built 
    against .NET 1.1 and an app.config file, called 
    nunit-console.exe.config which, contains the following:&lt;/p&gt;
&lt;div id="xml"&gt;
&lt;pre&gt;&amp;lt;configuration&amp;gt;&lt;br&gt;    &amp;lt;!--  &lt;br&gt;        The startup section may be used to specify the runtime versions supported&lt;br&gt;        in the order that they will be used if more than one is present.&lt;br&gt;    --&amp;gt; &lt;br&gt;    &amp;lt;startup&amp;gt; &lt;br&gt;        &amp;lt;supportedRuntime version="v1.1.4322" /&amp;gt; &lt;br&gt;    &amp;lt;/startup&amp;gt; &lt;br&gt;&amp;lt;/configuration&amp;gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;Note that the actual nunit-console's actual app.config has 
    some extra things which I have removed in the above example so it 
    just shows what is needed to target a particular framework. The &amp;lt;&lt;a href="http://msdn.microsoft.com/library/en-us/cpgenref/html/gnconSupportedRuntimeElement.asp"&gt;supportedRuntime&lt;/a&gt;&amp;gt; element is used to determine which 
    framework the application is run against.&lt;/p&gt;

&lt;p&gt;To run against .NET 2.0 we use the same copy of nunit-console, 
    built against .NET 1.1, but with an app.config which has .NET 2.0 
    as the supported runtime. When you run the unit tests SharpDevelop 
    looks at the project's target framework and runs the 
    corresponding nunit-console.&lt;/p&gt;

&lt;p&gt;&lt;b&gt;COMPlus_Version&lt;/b&gt;&lt;/p&gt;

&lt;p&gt;With Microsoft's .NET framework you can set the 
    COMPlus_Version environment variable before running your .NET 
    application to run it under a particular framework. So at the 
    command line you could execute&lt;/p&gt;

&lt;p&gt;&lt;b&gt;SET COMPLUS_Version=v1.1.4322&lt;/b&gt;&lt;/p&gt;

&lt;p&gt;Then your application would run against .NET 1.1. Specifying a 
    framework in your app.config will override the COMPLUS_Version 
    setting however.&lt;/p&gt;

&lt;p&gt;SharpDevelop does not use this method since using an app.config 
    makes it easy to support running unit tests with 
    &lt;a href="http://ncover.org"&gt;NCover&lt;/a&gt; and the debugger. Using 
    COMPLUS_Version we could not run NCover since it is compiled 
    against .NET 2.0. The debugger would also need to be modified so it 
    could set environment variables before debugging an application.&lt;/p&gt;
&lt;h2&gt;Mono&lt;/h2&gt;
&lt;p&gt;How do we target another framework with Mono? You can use one of 
    the following:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;app.config&lt;/li&gt;

&lt;li&gt;mono.exe --runtime command line parameter&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Again we can use the app.config file as discussed previously. We 
    can also use the new &lt;b&gt;--runtime&lt;/b&gt; command line parameter that 
    was added in Mono 1.2.2. This works in a similar way to the 
    COMPLUS_Version environment variable allowing you to set the 
    framework version globally. Using the command line&lt;/p&gt;

&lt;p&gt;&lt;b&gt;mono --runtime=v1.1.4322 nunit-console.exe&lt;/b&gt;&lt;/p&gt;

&lt;p&gt;would run nunit-console under Mono's .NET 1.1 framework.&lt;/p&gt;

&lt;p&gt;There is one difference though, specifying the target framework 
    in the app.config does not override this command line setting.&lt;/p&gt;
&lt;h2&gt;Code Coverage with .NET 1.1&lt;/h2&gt;
&lt;p&gt;If you want to look at code coverage when running your unit 
    tests under .NET 1.1 you will need to use 
    &lt;a href="http://ncover.org/SITE/files/4/ncover_setup/entry202.aspx"&gt;
    NCover version 1.5.4&lt;/a&gt; since the latest release 1.5.5 does not 
    work produce any coverage results when profiling a .NET 1.1 
    assembly.&lt;/p&gt;&lt;img src="http://community.sharpdevelop.net/aggbug.aspx?PostID=13987" width="1" height="1"&gt;</content><author><name>MattWard</name><uri>http://community.sharpdevelop.net/members/MattWard.aspx</uri></author><category term="Mono" scheme="http://community.sharpdevelop.net/blogs/mattward/archive/tags/Mono/default.aspx" /><category term="CodeCoverage" scheme="http://community.sharpdevelop.net/blogs/mattward/archive/tags/CodeCoverage/default.aspx" /><category term="UnitTests" scheme="http://community.sharpdevelop.net/blogs/mattward/archive/tags/UnitTests/default.aspx" /></entry><entry><title>Unit Testing Changes In SharpDevelop 2.1</title><link rel="alternate" type="text/html" href="http://community.sharpdevelop.net/blogs/mattward/archive/2006/11/22/UnitTestingChangesInSharpDevelop21.aspx" /><id>http://community.sharpdevelop.net/blogs/mattward/archive/2006/11/22/UnitTestingChangesInSharpDevelop21.aspx</id><published>2006-11-22T19:31:00Z</published><updated>2006-11-22T19:31:00Z</updated><content type="html">
&lt;p&gt;The Unit Tests window in SharpDevelop 2.1 (revision 2039) has 
    been changed in order to fix a few bugs and problems that it had. 
    How you unit test in SharpDevelop is still the same, as explained 
    in the &lt;a href="http://community.sharpdevelop.net/blogs/mattward/articles/FeatureTourUnitTesting.aspx"&gt;Unit Testing feature tour&lt;/a&gt;, but there are some new 
    features shown below. Most of the changes have been behind the 
    scenes so everything should look the essentially the same.&lt;/p&gt;
&lt;p&gt;&lt;img src="http://community.sharpdevelop.net/photos/mattward/images/original/UnitTestsWindowSD21.aspx" alt="Unit Tests window in SharpDevelop 2.1"&gt;&lt;/p&gt;
&lt;h2&gt;New Features&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;Unit Tests window shows classes and methods obtained from 
      SharpDevelop's parser.&lt;/li&gt;
&lt;li&gt;Unit Tests tree dynamically updates itself to show new test 
      methods and classes as the parser information is updated.&lt;/li&gt;
&lt;li&gt;All tests are run using a slightly modified 
      nunit-console.exe.&lt;/li&gt;
&lt;li&gt;You can now run all tests from all the projects with the 
      debugger or with code coverage in one step. Previously you had to 
      select an individual project in the Unit Tests window.&lt;/li&gt;
&lt;li&gt;Running a test with code coverage or with the debugger will 
      now update the Unit Tests tree.&lt;/li&gt;
&lt;li&gt;Running tests from the Unit Tests window will use the test 
      project's app.config so you can now run tests in a 
      &lt;b&gt;STA&lt;/b&gt; or &lt;b&gt;MTA&lt;/b&gt;.&lt;/li&gt;
&lt;li&gt;The &lt;b&gt;Reload&lt;/b&gt; and &lt;b&gt;Unload&lt;/b&gt; toolbar buttons have been 
      removed since they are no longer needed.&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;Running Tests in a STA or MTA&lt;/h2&gt;
&lt;p&gt;By default SharpDevelop runs tests in the &lt;b&gt;MTA&lt;/b&gt;. This is 
    the default behaviour of &lt;a href="http://nunit.org"&gt;NUnit&lt;/a&gt; which 
    is what SharpDevelop uses.&lt;/p&gt;
&lt;p&gt;To run your tests in an &lt;b&gt;STA&lt;/b&gt; you can create an 
    &lt;b&gt;app.config&lt;/b&gt; file for your test project as shown below:&lt;/p&gt;
&lt;div id="xml"&gt;
&lt;pre&gt;    &amp;lt;configuration&amp;gt; &lt;br&gt;           &amp;lt;configSections&amp;gt;&lt;br&gt;                   &amp;lt;sectionGroup name="NUnit"&amp;gt;&lt;br&gt;                           &amp;lt;section name="TestRunner"&lt;br&gt;                                    type="System.Configuration.NameValueSectionHandler" /&amp;gt;&lt;br&gt;                   &amp;lt;/sectionGroup&amp;gt;&lt;br&gt;           &amp;lt;/configSections&amp;gt;&lt;br&gt;           &amp;lt;NUnit&amp;gt;&lt;br&gt;                   &amp;lt;TestRunner&amp;gt;&lt;br&gt;                           &amp;lt;!-- Valid values are STA,MTA. Others ignored. --&amp;gt;&lt;br&gt;                           &amp;lt;add key="ApartmentState" value="STA" /&amp;gt;&lt;br&gt;                   &amp;lt;/TestRunner&amp;gt;&lt;br&gt;           &amp;lt;/NUnit&amp;gt;&lt;br&gt;    &amp;lt;/configuration&amp;gt;&lt;/pre&gt;&lt;/div&gt;&lt;h2&gt;Unit Tests Internals&lt;/h2&gt;
&lt;p&gt;In this section we will look at what is actually happening when 
    you open a solution and then run its tests.&lt;/p&gt;
&lt;h3&gt;Dynamically Updating Unit Tests Tree&lt;/h3&gt;
&lt;p&gt;When a solution is opened in SharpDevelop any project that has a 
    reference to the &lt;b&gt;NUnit.Framework&lt;/b&gt; assembly will have a 
    corresponding tree node added to the Unit Tests tree. Expanding the 
    project node shows test classes grouped according to namespace. 
    Expanding a test class node shows the individual test methods.&lt;/p&gt;
&lt;p&gt;What classes and methods are considered to be test fixtures and 
    tests are all determined based on the information from 
    SharpDevelop's parser. If a class has a &lt;b&gt;[TestFixture]&lt;/b&gt; 
    attribute then it is considered a test class. If a method has a 
    &lt;b&gt;[Test]&lt;/b&gt; attribute then it is considered a test method.&lt;/p&gt;
&lt;p&gt;The Unit Tests window will update itself as the parser notices 
    changes in your code. So new test classes and methods will appear 
    in the test tree as you type.&lt;/p&gt;
&lt;h3&gt;Customised NUnit-Console&lt;/h3&gt;
&lt;p&gt;Whenever you run unit tests in SharpDevelop nunit-console.exe is 
    involved. This NUnit-Console is a slightly modified version of that 
    which ships with &lt;a href="http://nunit.org"&gt;NUnit&lt;/a&gt; 2.2.8. It has 
    three extra command line arguments:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;&lt;b&gt;testMethodName&lt;/b&gt;
&lt;p&gt;Added by 
        &lt;a href="http://wiki.sharpdevelop.net/default.aspx/SharpDevelop.DanielGrunwald"&gt;Daniel Grunwald&lt;/a&gt; in SharpDevelop 2.0. This allows 
        NUnit-Console to run a single test and takes the fully 
        qualified test method name.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;&lt;b&gt;results&lt;/b&gt;
&lt;p&gt;Used to specify the filename where the test results are 
        written to as they occur.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;&lt;b&gt;namespaceFilter&lt;/b&gt;
&lt;p&gt;If this argument is used then NUnit-Console will only run 
        the tests that exist in the specified namespace. SharpDevelop 
        sets this argument when you select a namespace node in the Unit 
        Tests tree and run the tests.&lt;/p&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;As the tests are run SharpDevelop monitors the generated test 
    results file. As each test result is added to the file the Unit 
    Tests tree is updated with the usual red, green and yellow colours. 
    Any test failures are added to the &lt;b&gt;Errors&lt;/b&gt; window.&lt;/p&gt;
&lt;p&gt;Whenever you run a test or set of tests nunit-console.exe will 
    be run, either by SharpDevelop itself, or by 
    &lt;a href="http://ncover.org"&gt;NCover&lt;/a&gt; when looking at code 
    coverage, or by the debugger when you need to debug your tests.&lt;/p&gt;
&lt;p&gt;&lt;b&gt;[Update 25th November, 2006]&lt;/b&gt;&lt;/p&gt;
&lt;p&gt;In revision 2076 you can now select a namespace node in the Unit 
    Tests tree and run only those tests for that namespace. This was 
    done by adding a new namespace filter argument to 
    nunit-console.exe. The post has been updated to reflect this. &lt;/p&gt;&lt;img src="http://community.sharpdevelop.net/aggbug.aspx?PostID=13387" width="1" height="1"&gt;</content><author><name>MattWard</name><uri>http://community.sharpdevelop.net/members/MattWard.aspx</uri></author><category term="UnitTests" scheme="http://community.sharpdevelop.net/blogs/mattward/archive/tags/UnitTests/default.aspx" /></entry><entry><title>WiX Integration</title><link rel="alternate" type="text/html" href="http://community.sharpdevelop.net/blogs/mattward/archive/2006/09/17/WixIntegration.aspx" /><id>http://community.sharpdevelop.net/blogs/mattward/archive/2006/09/17/WixIntegration.aspx</id><published>2006-09-17T14:14:00Z</published><updated>2006-09-17T14:14:00Z</updated><content type="html">&lt;p&gt;Support for creating &lt;a href="http://wix.sourceforge.net"&gt;
    WiX&lt;/a&gt; setup packages is now available in SharpDevelop 2.1. It was 
    originally disabled in SharpDevelop 2.0, but has now been 
    re-enabled and some new features have been added. It is still a 
    work in progress. Some parts are not quite finished and there are 
    some missing features, but it is currently being used to build and 
    maintain the installer for SharpDevelop itself. At the moment 
    SharpDevelop ships with WiX 2.0.4221, but it will be updated to 
    2.0.4415.0 shortly.&lt;/p&gt;&lt;h2&gt;Features&lt;/h2&gt;&lt;ul&gt;&lt;li&gt;WiX project and file templates.&lt;/li&gt;&lt;li&gt;Build a setup package (.msi), merge module (.msm) or WiX 
      Library (.wixlib) from inside SharpDevelop. All built using 
      MSBuild and WiX&amp;#39;s custom MSBuild tasks.&lt;/li&gt;&lt;li&gt;Add WiX libraries, WiX extensions and preprocessor variables 
      to the WiX project.&lt;/li&gt;&lt;li&gt;WiX Dialog Designer.&lt;/li&gt;&lt;li&gt;Setup Dialogs window. Lists all dialogs in a project. Each 
      dialog can then be opened up in the designer.&lt;/li&gt;&lt;li&gt;Setup Files editor. Add directories, components and files to 
      the installer via a GUI instead of editing the XML.&lt;/li&gt;&lt;/ul&gt;&lt;p&gt;The next sections will look at the WiX support in more 
    detail.&lt;/p&gt;&lt;h2&gt;Creating a WiX Project&lt;/h2&gt;&lt;p&gt;To create a new WiX project, from the &lt;strong&gt;File&lt;/strong&gt; menu, select 
    &lt;strong&gt;New&lt;/strong&gt; and then select &lt;strong&gt;Solution...&lt;/strong&gt;. In the &lt;strong&gt;New 
    Project&lt;/strong&gt; dialog select the &lt;strong&gt;Setup&lt;/strong&gt; category.&lt;/p&gt;&lt;p&gt;&lt;img alt="WiX project templates in the New Project dialog" src="http://community.sharpdevelop.net/photos/mattward/images/original/WixProjectTemplatesNonEmptyProjectSelected.aspx" /&gt;&lt;/p&gt;&lt;p&gt;SharpDevelop has two WiX project templates available&lt;/p&gt;&lt;ul&gt;&lt;li&gt;

        Empty Setup.
        &lt;p&gt;This project template creates a Solution (.sln), a WiX 
        Project (.wixproj) and a minimal WiX Setup file (.wxs).&lt;/p&gt;&lt;/li&gt;&lt;li&gt;

        Setup.
        &lt;p&gt;The Setup project template creates a basic WiX project which 
        can be built immediately after creation.&lt;/p&gt;&lt;p&gt;&lt;img alt="Setup project open in Project Browser" src="http://community.sharpdevelop.net/photos/mattward/images/original/WixProjectOpenInProjectBrowser.aspx" /&gt;&lt;/p&gt;&lt;p&gt;The installer created by this project installs a License.rtf 
        file to the installation directory.&lt;/p&gt;&lt;p&gt;The Setup project template also has its own dialogs which 
        can be customised.&lt;/p&gt;&lt;/li&gt;&lt;/ul&gt;&lt;p&gt;The Setup project is the project we will be using in this 
    walkthrough.&lt;/p&gt;&lt;h2&gt;Building&lt;/h2&gt;&lt;p&gt;Building the WiX project is done in the same way as for other 
    projects in SharpDevelop from the build menu.&lt;/p&gt;&lt;p&gt;&lt;img alt="Build menu for MySetup project" src="http://community.sharpdevelop.net/photos/mattward/images/original/BuildMenuForMySetupProject.aspx" /&gt;&lt;/p&gt;&lt;p&gt;Output messages from the WiX compiler and linker are displayed 
    in the Output window and any errors are added to the Errors 
    window.&lt;/p&gt;&lt;h2&gt;Creating a Merge Module or WiX Library&lt;/h2&gt;&lt;p&gt;By default the project will build an MSI file. You can choose to 
    create a merge module (.msm) or WiX Library (.wixlib) from the 
    project options. Select the project in the &lt;strong&gt;Project Browser&lt;/strong&gt;, 
    then from the &lt;strong&gt;Project&lt;/strong&gt; menu select &lt;strong&gt;Project Options&lt;/strong&gt;.&lt;/p&gt;&lt;p&gt;&lt;img alt="WiX Project options" src="http://community.sharpdevelop.net/photos/mattward/images/original/WixProjectApplicationOptions.aspx" /&gt;&lt;/p&gt;&lt;p&gt;From the &lt;strong&gt;Application&lt;/strong&gt; tab you can change the output type 
    to msi, msm or wixlib.&lt;/p&gt;&lt;p&gt;&lt;img alt="WiX Project output types" src="http://community.sharpdevelop.net/photos/mattward/images/original/WixProjectOutputTypes.aspx" /&gt;&lt;/p&gt;&lt;h2&gt;Running&lt;/h2&gt;&lt;p&gt;To run the installer, select &lt;strong&gt;Run&lt;/strong&gt; from the &lt;strong&gt;Debug&lt;/strong&gt; 
    menu or press &lt;strong&gt;F5&lt;/strong&gt;. The installer will then be built and run 
    and you will see the first dialog of your installer.&lt;/p&gt;&lt;p&gt;&lt;img alt="Running the installer from inside SharpDevelop" src="http://community.sharpdevelop.net/photos/mattward/images/original/RunningWixInstallerFirstDialogShown.aspx" /&gt;&lt;/p&gt;&lt;h2&gt;Adding a new WiX File&lt;/h2&gt;&lt;p&gt;You can either have one big WiX setup file (.wxs) or split the 
    project up into several different files. The WiX MSBuild tasks will 
    compile all the WiX files and link them all into one installer.&lt;/p&gt;&lt;p&gt;To add a new WiX file, select the project in the &lt;strong&gt;Project 
    Browser&lt;/strong&gt; window, right click, select &lt;strong&gt;Add&lt;/strong&gt; and then select 
    &lt;strong&gt;New Item...&lt;/strong&gt;. From the &lt;strong&gt;New File dialog&lt;/strong&gt; selecting the 
    &lt;strong&gt;Setup&lt;/strong&gt; category will show you the WiX file templates.&lt;/p&gt;&lt;p&gt;&lt;img alt="WiX file templates in File dialog" src="http://community.sharpdevelop.net/photos/mattward/images/original/WixFileTemplatesInNewFileDialog.aspx" /&gt;&lt;/p&gt;&lt;h2&gt;Adding WiX Libraries&lt;/h2&gt;&lt;p&gt;To add a wixlib to your project, select &lt;strong&gt;WiX Libraries&lt;/strong&gt; in 
    the &lt;strong&gt;Project Browser&lt;/strong&gt;, right click and select &lt;strong&gt;Add WiX 
    Library&lt;/strong&gt;.&lt;/p&gt;&lt;p&gt;&lt;img alt="Add WiX Library menu item" src="http://community.sharpdevelop.net/photos/mattward/images/original/WixProjectBrowserAddWixLibraryContextMenu.aspx" /&gt;&lt;/p&gt;&lt;p&gt;This opens up the file dialog where you can browse to one or 
    more wixlibs and add them to the project.&lt;/p&gt;&lt;h2&gt;Adding WiX Extensions&lt;/h2&gt;&lt;p&gt;WiX extensions can be added to the project in the 
    &lt;strong&gt;Compiling&lt;/strong&gt;, &lt;strong&gt;Library&lt;/strong&gt; and &lt;strong&gt;Linking&lt;/strong&gt; tabs available 
    from the project options. The &lt;strong&gt;Compiling&lt;/strong&gt; tab determines what 
    extensions are passed to Candle the WiX compiler. The 
    &lt;strong&gt;Linking&lt;/strong&gt; tab determines what extensions get passed to Light 
    the WiX linker. The &lt;strong&gt;Library&lt;/strong&gt; tab determines what extensions 
    get passed to Lit the Wix Library Tool. If you are creating a setup 
    package (.msi) then typically you should put the extensions in the 
    &lt;strong&gt;Compiling&lt;/strong&gt; and &lt;strong&gt;Linking&lt;/strong&gt; tab. If you are creating a WiX 
    Library (.wixlib) then you need to put the extensions in the 
    &lt;strong&gt;Library&lt;/strong&gt; tab.&lt;/p&gt;&lt;p&gt;&lt;img alt="WiX Linking tab showing extensions" src="http://community.sharpdevelop.net/photos/mattward/images/original/WixLinkingTabShowingExtensions.aspx" /&gt;&lt;/p&gt;&lt;p&gt;The extensions can either be typed in directly into the 
    Extensions text box, one per line, as shown above, or you can click 
    the &lt;strong&gt;Add&lt;/strong&gt; button to open the &lt;strong&gt;Add Extensions&lt;/strong&gt; dialog and 
    select one or more of the standard extensions WiX provides.&lt;/p&gt;&lt;p&gt;&lt;img alt="Add WiX Extensions dialog" src="http://community.sharpdevelop.net/photos/mattward/images/original/AddWixExtensionsDialog.aspx" /&gt;&lt;/p&gt;&lt;h2&gt;Preprocessor Variables&lt;/h2&gt;&lt;p&gt;&lt;a href="http://wix.sourceforge.net/manual-wix2/preprocessor.htm"&gt;Preprocessor variables&lt;/a&gt; can be added in the 
    &lt;strong&gt;Preprocessing&lt;/strong&gt; tab available from the project options.&lt;/p&gt;&lt;p&gt;&lt;img alt="WiX Preprocessor Variables defined in project options" src="http://community.sharpdevelop.net/photos/mattward/images/original/WixPreprocessingVariablesDefined.aspx" /&gt;&lt;/p&gt;&lt;p&gt;In the screenshot above the DATADIR variable is defined. 
    Generally the variable values will just be strings, but you can 
    also use MSBuild properties. In the screenshot above the 
    SharpDevelopBinPath MSBuild property is being used. You can use 
    MSBuild properties here since these properties will be expanded 
    before WiX compiles anything.&lt;/p&gt;&lt;p&gt;In the UserInterface.wxs file the DATADIR preprocessor variable 
    is referenced as shown below:&lt;/p&gt;&lt;p&gt;&lt;code&gt;&amp;lt;Binary Id=&amp;quot;dialog.bmp&amp;quot; 
    SourceFile=&amp;quot;$(var.DATADIR)/default-dialog.bmp&amp;quot; 
    /&amp;gt;&lt;/code&gt;&lt;/p&gt;&lt;h2&gt;Visually Designing a Dialog&lt;/h2&gt;&lt;p&gt;To open a setup dialog in the designer, open the WiX file, move 
    the cursor so it is inside the dialog element, then click the 
    &lt;strong&gt;Design&lt;/strong&gt; tab.&lt;/p&gt;&lt;p&gt;&lt;img alt="WiX dialog in designer" src="http://community.sharpdevelop.net/photos/mattward/images/original/WixDialogDesigner.aspx" /&gt;&lt;/p&gt;&lt;p&gt;You can also open a dialog in the designer from the &lt;strong&gt;Setup 
    Dialogs Window&lt;/strong&gt;, which is described in the next section.&lt;/p&gt;&lt;p&gt;You can have multiple dialogs defined in one WiX file or create 
    one file per dialog, it is up to you. If you have multiple dialogs 
    then you need to move the cursor inside the dialog element before 
    you select the Design tab otherwise the designer will not know 
    which dialog to load. If you have only one dialog element in the 
    file then the cursor can be anywhere in the WiX document and does 
    not need to be inside the dialog element.&lt;/p&gt;&lt;p&gt;In the designer you can reposition, resize and remove existing 
    controls. You can also add new WiX controls from the Setup Dialog 
    Controls tab by dragging them to the dialog.&lt;/p&gt;&lt;p&gt;&lt;img alt="Setup dialog controls in the toolbox" src="http://community.sharpdevelop.net/photos/mattward/images/original/SetupDialogControlsToolbox.aspx" /&gt;&lt;/p&gt;&lt;p&gt;At the moment not all the WiX controls are supported and WiX 
    specific properties are not available in the properties window.&lt;/p&gt;&lt;h2&gt;Setup Dialogs Window&lt;/h2&gt;&lt;p&gt;To open the &lt;strong&gt;Setup Dialogs&lt;/strong&gt; window, from the &lt;strong&gt;View&lt;/strong&gt; 
    menu select &lt;strong&gt;Setup&lt;/strong&gt; and then select &lt;strong&gt;Dialogs&lt;/strong&gt;.&lt;/p&gt;&lt;p&gt;&lt;img alt="View setup dialogs menu item" src="http://community.sharpdevelop.net/photos/mattward/images/original/ViewSetupDialogsMenuItem.aspx" /&gt;&lt;/p&gt;&lt;p&gt;The &lt;strong&gt;Setup Dialogs&lt;/strong&gt; window is then opened.&lt;/p&gt;&lt;p&gt;&lt;img alt="Setup dialogs window" src="http://community.sharpdevelop.net/photos/mattward/images/original/SetupDialogsWindow.aspx" /&gt;&lt;/p&gt;&lt;p&gt;This window lists all the dialogs available in the project. You 
    can open a dialog into the designer by right clicking it and 
    selecting &lt;strong&gt;Open&lt;/strong&gt;. Or view its XML by selecting &lt;strong&gt;View 
    Code&lt;/strong&gt;.&lt;/p&gt;&lt;h2&gt;Visually Editing Directories, Components and Files&lt;/h2&gt;&lt;p&gt;To open the &lt;strong&gt;Setup Files Editor&lt;/strong&gt;, from the &lt;strong&gt;View&lt;/strong&gt; menu 
    select &lt;strong&gt;Setup&lt;/strong&gt; and then select &lt;strong&gt;Files&lt;/strong&gt;.&lt;/p&gt;&lt;p&gt;The Setup Files Editor will look at all the WiX files in the 
    project for the &lt;strong&gt;TARGETDIR&lt;/strong&gt; Directory element or the 
    DirectoryRef element. Once this is found then it will show the 
    directories, components and files that will be installed.&lt;/p&gt;&lt;p&gt;&lt;img alt="Files editor" src="http://community.sharpdevelop.net/photos/mattward/images/original/SetupFilesEditor.aspx" /&gt;&lt;/p&gt;&lt;p&gt;The left hand side of the editor shows the files in a tree view. 
    On the right hand side of the editor you can modify the properties 
    of the currently selected item.&lt;/p&gt;&lt;p&gt;You can add directories, files and components to your installer 
    by right clicking a tree node, selecting &lt;strong&gt;Add&lt;/strong&gt; and then 
    choosing an item to add.&lt;/p&gt;&lt;p&gt;&lt;img alt="Setup Files editor add menu" src="http://community.sharpdevelop.net/photos/mattward/images/original/SetupFilesEditorAddMenu.aspx" /&gt;&lt;/p&gt;&lt;h2&gt;Adding Directories&lt;/h2&gt;&lt;p&gt;To add a directory and all its contents recursively to your 
    setup, select the tree node where you want your directory added to, 
    then right click and select &lt;strong&gt;Add Directory&lt;/strong&gt;.&lt;/p&gt;&lt;p&gt;&lt;img alt="Add directories menu item" src="http://community.sharpdevelop.net/photos/mattward/images/original/SetupFilesEditorAddDirectoryMenuItem.aspx" /&gt;&lt;/p&gt;&lt;p&gt;This opens the &lt;strong&gt;Browser for Folder&lt;/strong&gt; dialog. Select the 
    directory and then click &lt;strong&gt;OK&lt;/strong&gt; to have that directory and all 
    its contents added to the setup package. Every file added will have 
    its own component.&lt;/p&gt;&lt;h2&gt;Future Improvements&lt;/h2&gt;&lt;p&gt;The WiX integration is not completely finished. Here is a list 
    of items that will hopefully be added at some point.&lt;/p&gt;&lt;ul&gt;&lt;li&gt;Improve the WiX dialog designer. Add support for all the WiX 
      controls.&lt;/li&gt;&lt;li&gt;&lt;p&gt;Improve the files editor.&lt;/p&gt;&lt;ul&gt;&lt;li&gt;Drag and drop support.&lt;/li&gt;&lt;li&gt;Directory vs installer diff. Shows missing and new 
          files.&lt;/li&gt;&lt;/ul&gt;&lt;/li&gt;&lt;li&gt;Add support for WiX include files (.wxi).&lt;/li&gt;&lt;li&gt;&lt;p&gt;Add GUI Editors for:&lt;/p&gt;&lt;ul&gt;&lt;li&gt;Features&lt;/li&gt;&lt;li&gt;Properties&lt;/li&gt;&lt;li&gt;Binaries&lt;/li&gt;&lt;li&gt;Icons&lt;/li&gt;&lt;li&gt;Sequences&lt;/li&gt;&lt;li&gt;Error and UI Text.&lt;/li&gt;&lt;/ul&gt;&lt;/li&gt;&lt;/ul&gt;&lt;h2&gt;Alternatives&lt;/h2&gt;&lt;p&gt;There are a few other applications and plug-ins available that 
    can be used to create WiX installers instead of SharpDevelop. Here 
    is a list of the ones I am aware of.&lt;/p&gt;&lt;h2&gt;Votive&lt;/h2&gt;&lt;p&gt;&lt;a href="http://wix.sourceforge.net/downloadv3.html"&gt;Votive&lt;/a&gt; 
    is a Visual Studio plug-in that you can use to create WiX setup 
    packages from inside Visual Studio.&lt;/p&gt;&lt;p&gt;Just a few days ago, September 15th, 
    &lt;a href="http://blogs.msdn.com/jrock/default.aspx"&gt;Justin 
    Rockwood&lt;/a&gt; released 
    &lt;a href="http://blogs.msdn.com/jrock/archive/2006/09/15/757144.aspx"&gt;Votive version 3&lt;/a&gt;, which supports Visual Studio 2005. It does 
    not have a dialog designer, but that is on its list of features 
    that will be added in the future.&lt;/p&gt;&lt;h2&gt;WiX Edit&lt;/h2&gt;&lt;p&gt;&lt;a href="http://wixedit.sourceforge.net"&gt;WiX Edit&lt;/a&gt; is a 
    standalone WiX Editor application, created by Jasper Keuper, that 
    you can use to create WiX setup packages. It includes a dialog 
    designer along with a whole host of other features, that 
    SharpDevelop does not have. In fact you can create an installer and 
    never look at any XML.&lt;/p&gt;&lt;h2&gt;WixTrim&lt;/h2&gt;&lt;p&gt;&lt;a href="http://zelenkov.com/twix/download/"&gt;WixTrim&lt;/a&gt; is a 
    WiX Visual Editor, created by Oleg Zelenkov, that supports a very 
    advanced dialog designer amongst other features. The source code 
    for the editor is also available from 
    &lt;a href="http://www.gotdotnet.com/Community/UserSamples/Details.aspx?SampleGuid=424F1B93-78BF-47EE-9EAB-B0F72A18A231"&gt;GotDotNet&lt;/a&gt;. Unfortunately, WixTrim is not under active 
    development like the previous two.&lt;/p&gt;&lt;h2&gt;WiX Tutorial&lt;/h2&gt;&lt;p&gt;If you want to learn more about WiX then a fantastic WiX 
    tutorial, created by Gabor Deak Jahn, is available 
    &lt;a href="http://www.tramontana.co.hu/wix/"&gt;online&lt;/a&gt;.&lt;/p&gt;&lt;img src="http://community.sharpdevelop.net/aggbug.aspx?PostID=11656" width="1" height="1"&gt;</content><author><name>MattWard</name><uri>http://community.sharpdevelop.net/members/MattWard.aspx</uri></author><category term="WiX" scheme="http://community.sharpdevelop.net/blogs/mattward/archive/tags/WiX/default.aspx" /></entry><entry><title>Incremental Search</title><link rel="alternate" type="text/html" href="http://community.sharpdevelop.net/blogs/mattward/archive/2006/09/09/IncrementalSearchInSharpDevelop21.aspx" /><id>http://community.sharpdevelop.net/blogs/mattward/archive/2006/09/09/IncrementalSearchInSharpDevelop21.aspx</id><published>2006-09-09T15:11:00Z</published><updated>2006-09-09T15:11:00Z</updated><content type="html">&lt;p&gt;SharpDevelop 2.1 now supports incremental searching. For those 
    of you who have used Visual Studio, the incremental search works in 
    a &lt;a href="http://msdn2.microsoft.com/en-us/library/f27e8wzh.aspx"&gt;
    similar way&lt;/a&gt;. First you enter incremental search mode, then type 
    in the search text. As you type in each character the document is 
    searched from the current cursor position and the first match it 
    finds is highlighted.&lt;/p&gt;&lt;h2&gt;Features&lt;/h2&gt;&lt;ul&gt;&lt;li&gt;&lt;strong&gt;Ctrl+E&lt;/strong&gt; enables incremental searching. The search will 
      start from the current cursor position and move down the 
      document.&lt;/li&gt;&lt;li&gt;&lt;strong&gt;Ctrl+Shift+E&lt;/strong&gt; enables reverse incremental searching. 
      The search will start from the current position and move up the 
      document&lt;/li&gt;&lt;li&gt;As each character is typed in the corresponding matching text 
      is highlighted in the document.&lt;/li&gt;&lt;li&gt;Any text selected before the incremental search is start will 
      become the first part of the searched for text.&lt;/li&gt;&lt;li&gt;If the string is not found an error message is displayed in 
      the status bar.&lt;/li&gt;&lt;li&gt;Pressing the &lt;strong&gt;Backspace&lt;/strong&gt; key removes the last character 
      from the search string.&lt;/li&gt;&lt;li&gt;Pressing the &lt;strong&gt;Escape&lt;/strong&gt; or &lt;strong&gt;Enter&lt;/strong&gt; key stops the 
      incremental search.&lt;/li&gt;&lt;li&gt;If the search text contains only lower case characters the 
      search will be case insensitive. &lt;/li&gt;&lt;li&gt;If the search text contains an upper case character then the 
      search is case sensitive.&lt;/li&gt;&lt;/ul&gt;&lt;h2&gt;Searching Incrementally&lt;/h2&gt;&lt;p&gt;Position the cursor at the location where you want the search to 
    start from.&lt;/p&gt;&lt;p&gt;Enable the incremental search either by selecting the 
    &lt;strong&gt;Incremental Search&lt;/strong&gt; from the &lt;strong&gt;Search&lt;/strong&gt; menu or by using 
    the keyboard shortcut &lt;strong&gt;Ctrl+E&lt;/strong&gt;.&lt;/p&gt;&lt;p&gt;&lt;img alt="Incremental search menu item" src="http://community.sharpdevelop.net/photos/mattward/images/original/SearchIncrementalSearchMenuItem.aspx" /&gt;&lt;/p&gt;&lt;p&gt;The mouse cursor over the text editor will then be changed to 
    the Incremental Search icon &lt;img alt="Incremental search cursor" src="http://community.sharpdevelop.net/photos/mattward/images/original/IncrementalSearchCursor.aspx" /&gt; to indicate 
    that you have enabled the search.&lt;/p&gt;&lt;p&gt;The status bar text will change to &amp;quot;Incremental 
    Search&amp;quot;.&lt;/p&gt;&lt;p&gt;&lt;img alt="Incremental search enabled in text editor" src="http://community.sharpdevelop.net/photos/mattward/images/original/IncrementalSearchEnabledInTextEditor.aspx" /&gt;&lt;/p&gt;&lt;p&gt;Type in a character and the first match below the current cursor 
    position will be highlighted. The search text is also displayed in 
    the status bar.&lt;/p&gt;&lt;p&gt;&lt;img alt="Incremental search matching first character" src="http://community.sharpdevelop.net/photos/mattward/images/original/IncrementalSearchFirstCharMatched.aspx" /&gt;&lt;/p&gt;&lt;p&gt;As you type in characters the search text is changed and 
    matching text is highlighted. If the search text cannot be found 
    the status bar text will show an error message.&lt;/p&gt;&lt;p&gt;&lt;img alt="Search text not found" src="http://community.sharpdevelop.net/photos/mattward/images/original/IncrementalSearchTextNotFound.aspx" /&gt;&lt;/p&gt;&lt;p&gt;The search is case insensitive if all the characters of the 
    search text are lower case. If any character is upper case then the 
    search will be case sensitive.&lt;/p&gt;&lt;p&gt;If the first character typed in does not match anything below 
    the cursor but can be found above the cursor position, at the start 
    of the document, then the match will be highlighted and the status 
    bar will show a warning message informing you that the end of the 
    document has been passed. In the screenshot below the cursor was 
    put at the end of the document and then the incremental search was 
    started.&lt;/p&gt;&lt;p&gt;&lt;img alt="Passed end of document warning message" src="http://community.sharpdevelop.net/photos/mattward/images/original/IncrementalSearchPassedEndOfDocument.aspx" /&gt;&lt;/p&gt;&lt;p&gt;To stop the incremental search press the &lt;strong&gt;Escape&lt;/strong&gt; or 
    &lt;strong&gt;Enter&lt;/strong&gt; key.&lt;/p&gt;&lt;h2&gt;Reverse Incremental Search&lt;/h2&gt;&lt;p&gt;The reverse incremental search will search from the current 
    cursor position to the start of the document.&lt;/p&gt;&lt;p&gt;Enable the reverse incremental search either by selecting the 
    &lt;strong&gt;Reverse Incremental Search&lt;/strong&gt; from the &lt;strong&gt;Search&lt;/strong&gt; menu or by 
    using the keyboard shortcut &lt;strong&gt;Ctrl+Shift+E&lt;/strong&gt;.&lt;/p&gt;&lt;p&gt;&lt;img alt="Reverse incremental search menu item" src="http://community.sharpdevelop.net/photos/mattward/images/original/SearchReverseIncrementalSearchMenuItem.aspx" /&gt;&lt;/p&gt;&lt;p&gt;The mouse cursor will then be changed to the Reverse Incremental 
    Search icon &lt;img alt="Reverse incremental search cursor" src="http://community.sharpdevelop.net/photos/mattward/images/original/ReverseIncrementalSearchCursor.aspx" /&gt; to 
    indicate that you have enabled the search. The status bar text will 
    also be changed to &amp;quot;Reverse Incremental Search&amp;quot;.&lt;/p&gt;&lt;p&gt;As you type a character the matching text will be highlighted 
    and the search text will be shown in the status bar.&lt;/p&gt;&lt;p&gt;To stop searching press the &lt;strong&gt;Escape&lt;/strong&gt; or &lt;strong&gt;Enter&lt;/strong&gt; 
    key.&lt;/p&gt;&lt;h2&gt;Visual Studio Comparison&lt;/h2&gt;&lt;p&gt;The differences between the SharpDevelop&amp;#39;s and Visual 
    Studio&amp;#39;s incremental search.&lt;/p&gt;&lt;table class="article"&gt;&lt;tr&gt;&lt;th&gt;Feature&lt;/th&gt;&lt;th&gt;SharpDevelop&lt;/th&gt;&lt;th&gt;Visual Studio&lt;/th&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;Shortcuts&lt;/td&gt;&lt;td&gt;Ctrl+E, Ctrl+Shift+E&lt;/td&gt;&lt;td&gt;Ctrl+I, Ctrl+Shift+I&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;Case sensitive search&lt;/td&gt;&lt;td&gt;An upper case character in the search string makes the 
        search case sensitive.&lt;/td&gt;&lt;td&gt;Select the Match case option in the Find dialog.&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;&lt;ul&gt;&lt;/ul&gt;&lt;img src="http://community.sharpdevelop.net/aggbug.aspx?PostID=11390" width="1" height="1"&gt;</content><author><name>MattWard</name><uri>http://community.sharpdevelop.net/members/MattWard.aspx</uri></author><category term="Search" scheme="http://community.sharpdevelop.net/blogs/mattward/archive/tags/Search/default.aspx" /></entry><entry><title>New WiX Installer for SharpDevelop 2.1</title><link rel="alternate" type="text/html" href="http://community.sharpdevelop.net/blogs/mattward/archive/2006/09/04/NewWixInstallerForSharpDevelop21.aspx" /><id>http://community.sharpdevelop.net/blogs/mattward/archive/2006/09/04/NewWixInstallerForSharpDevelop21.aspx</id><published>2006-09-04T22:11:00Z</published><updated>2006-09-04T22:11:00Z</updated><content type="html">&lt;p&gt;&lt;a href="http://chrison.net"&gt;Chris&lt;/a&gt; just &lt;a href="http://community.sharpdevelop.net/forums/thread/11216.aspx"&gt;
    announced&lt;/a&gt; in the forums that the 
    &lt;a href="http://build.sharpdevelop.net/"&gt;build server&lt;/a&gt; is now up 
    and running for SharpDevelop 2.1. This includes a new installer for 
    SharpDevelop using &lt;a href="http://wix.sourceforge.net"&gt;WiX&lt;/a&gt; 
    rather than &lt;a href="http://nsis.sourceforge.net/"&gt;NSIS&lt;/a&gt;. If 
    there are any problems with this installer please report them in 
    the &lt;a href="http://community.sharpdevelop.net/forums/"&gt;
    forum&lt;/a&gt;.&lt;/p&gt;
&lt;h2&gt;Installing&lt;/h2&gt;
&lt;p&gt;The installer is now an MSI file and not an executable as it was 
    previously. To install, download the MSI file and then double click 
    it to install, or right click the file and select 
    &lt;strong&gt;Install&lt;/strong&gt;.&lt;/p&gt;
&lt;p&gt;If you install under an account with Administrator privileges 
    SharpDevelop will be installed for &lt;strong&gt;All Users&lt;/strong&gt;.&lt;/p&gt;
&lt;p&gt;You can install SharpDevelop under a non-privileged account, 
    however the following things will not be done:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;NGen&lt;/strong&gt; is not run on SharpDevelop.exe.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;NUnit&lt;/strong&gt; is not installed in the &lt;strong&gt;GAC&lt;/strong&gt;. Without this 
      the &lt;strong&gt;Unit Testing&lt;/strong&gt; window cannot be used.&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;Uninstalling&lt;/h2&gt;
&lt;p&gt;Open the &lt;strong&gt;Control Panel&lt;/strong&gt;.&lt;/p&gt;
&lt;p&gt;Select &lt;strong&gt;Add or Remove Programs&lt;/strong&gt;.&lt;/p&gt;
&lt;p&gt;Select &lt;strong&gt;SharpDevelop 2.1&lt;/strong&gt;.&lt;/p&gt;
&lt;p&gt;Click the &lt;strong&gt;Remove&lt;/strong&gt; button.&lt;/p&gt;
&lt;h2&gt;Upgrading&lt;/h2&gt;
&lt;p&gt;The new installer now supports upgrades and will upgrade an old SharpDevelop 2.1 if it finds one. To upgrade simply run the new installer without uninstalling the previous version of SharpDevelop.&lt;br /&gt;&lt;/p&gt;
&lt;p&gt;You cannot install an older version over the top of an existing 
    installation (i.e. downgrade).&lt;/p&gt;
&lt;p&gt;You can install SharpDevelop 2 alongside SharpDevelop 2.1.&lt;/p&gt;
&lt;h2&gt;What does the Installer do?&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;Installs the SharpDevelop files.&lt;/li&gt;
&lt;li&gt;Adds a desktop shortcut to the SharpDevelop executable.&lt;/li&gt;
&lt;li&gt;Adds program menu shortcuts for SharpDevelop and a link to 
      the SharpDevelop website.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;NGens&lt;/strong&gt; the SharpDevelop executable (Admin only).&lt;/li&gt;
&lt;li&gt;Installs &lt;strong&gt;NUnit&lt;/strong&gt; into the GAC (Admin only).&lt;/li&gt;
&lt;li&gt;
        Registers file associations for:
        
&lt;ul&gt;
&lt;li&gt;.booproj&lt;/li&gt;
&lt;li&gt;.cmbx&lt;/li&gt;
&lt;li&gt;.csproj&lt;/li&gt;
&lt;li&gt;.prjx&lt;/li&gt;
&lt;li&gt;.sdaddin&lt;/li&gt;
&lt;li&gt;.sln&lt;/li&gt;
&lt;li&gt;.vbproj&lt;/li&gt;
&lt;li&gt;.wixproj&lt;/li&gt;
&lt;li&gt;.xfrm&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;Future Improvements&lt;/h2&gt;
&lt;p&gt;The following improvements should hopefully be added to the 
    installer at some point.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Optional file assocation with SharpDevelop.&lt;/li&gt;
&lt;li&gt;Choose UI language.&lt;/li&gt;
&lt;li&gt;Choose name of program group.&lt;/li&gt;
&lt;li&gt;Option to install source code.&lt;/li&gt;
&lt;li&gt;Check if optional components (e.g. FxCop, NCover) are 
      installed and advise the user to install them to activate certain 
      features inside SharpDevelop.&lt;/li&gt;
&lt;/ul&gt;&lt;img src="http://community.sharpdevelop.net/aggbug.aspx?PostID=11222" width="1" height="1"&gt;</content><author><name>MattWard</name><uri>http://community.sharpdevelop.net/members/MattWard.aspx</uri></author><category term="Installer" scheme="http://community.sharpdevelop.net/blogs/mattward/archive/tags/Installer/default.aspx" /><category term="WiX" scheme="http://community.sharpdevelop.net/blogs/mattward/archive/tags/WiX/default.aspx" /></entry><entry><title>Go To XML Schema Definition</title><link rel="alternate" type="text/html" href="http://community.sharpdevelop.net/blogs/mattward/archive/2006/08/09/GoToXmlSchemaDefinition.aspx" /><id>http://community.sharpdevelop.net/blogs/mattward/archive/2006/08/09/GoToXmlSchemaDefinition.aspx</id><published>2006-08-09T20:14:00Z</published><updated>2006-08-09T20:14:00Z</updated><content type="html">The XML Editor in SharpDevelop 2.1 now can has Go To XML Schema Definition support....(&lt;a href="http://community.sharpdevelop.net/blogs/mattward/archive/2006/08/09/GoToXmlSchemaDefinition.aspx"&gt;read more&lt;/a&gt;)&lt;img src="http://community.sharpdevelop.net/aggbug.aspx?PostID=10551" width="1" height="1"&gt;</content><author><name>MattWard</name><uri>http://community.sharpdevelop.net/members/MattWard.aspx</uri></author><category term="XmlEditor" scheme="http://community.sharpdevelop.net/blogs/mattward/archive/tags/XmlEditor/default.aspx" /></entry><entry><title>XPath Queries</title><link rel="alternate" type="text/html" href="http://community.sharpdevelop.net/blogs/mattward/archive/2006/08/05/TestingXPathQueriesInSharpDevelop.aspx" /><id>http://community.sharpdevelop.net/blogs/mattward/archive/2006/08/05/TestingXPathQueriesInSharpDevelop.aspx</id><published>2006-08-05T13:44:00Z</published><updated>2006-08-05T13:44:00Z</updated><content type="html">SharpDevelop 2.1 now has an XPath Query window where you can run an XPath query on the active XML document and the matched nodes will be highlighted....(&lt;a href="http://community.sharpdevelop.net/blogs/mattward/archive/2006/08/05/TestingXPathQueriesInSharpDevelop.aspx"&gt;read more&lt;/a&gt;)&lt;img src="http://community.sharpdevelop.net/aggbug.aspx?PostID=10411" width="1" height="1"&gt;</content><author><name>MattWard</name><uri>http://community.sharpdevelop.net/members/MattWard.aspx</uri></author><category term="XmlEditor" scheme="http://community.sharpdevelop.net/blogs/mattward/archive/tags/XmlEditor/default.aspx" /></entry><entry><title>Using the Component Inspector</title><link rel="alternate" type="text/html" href="http://community.sharpdevelop.net/blogs/mattward/archive/2006/06/20/UsingTheComponentInspector.aspx" /><id>http://community.sharpdevelop.net/blogs/mattward/archive/2006/06/20/UsingTheComponentInspector.aspx</id><published>2006-06-20T16:14:00Z</published><updated>2006-06-20T16:14:00Z</updated><content type="html">&lt;b&gt;Starting the Component Inspector&lt;/b&gt;&lt;br&gt;&lt;br&gt;The Component Inspector can either be run as a separate application or inside SharpDevelop. The standalone Component Inspector application can be found in the bin\Tools\ComponentInspector folder. The Component Inspector integrated into SharpDevelop can be viewed by selecting the menu option Tools | Component Inspector. &lt;br&gt;&lt;br&gt;&lt;img src="/photos/mattward/images/7952/original.aspx"&gt;&lt;br&gt;&lt;br&gt;The user interfaces are essentially the same for both the standalone Component Inspector and the integrated version so the rest of the information presented here will specifically refer to the integrated Component Inspector.&lt;br&gt;&lt;br&gt;&lt;b&gt;Opening an Assembly&lt;/b&gt;&lt;br&gt;&lt;br&gt;You can open an Assembly into the Component Inspector by either selecting the menu option Inspector | Open Assembly and then browsing to the file, or by dragging the assembly from Windows Explorer onto the Component Inspector. The opened assembly is then displayed in the Assemblies/Types View and its methods, fields, properties and events can be browsed.&lt;br&gt;&lt;br&gt;&lt;img src="/photos/mattward/images/9000/original.aspx"&gt;&lt;br&gt;&lt;br&gt;Previously opened assemblies are remembered by the Component Inspector and it will also show all assemblies that have been opened by SharpDevelop.&lt;br&gt;&lt;br&gt;&lt;b&gt;Creating an Object&lt;/b&gt;&lt;br&gt;&lt;br&gt;To create an object, select a class in the Assembly View, right click and select Create Object, or, if it is a control, drag it to the design surface. When an object has been created it appears in the Objects panel. The screenshot below shows two created objects, System.Xml.XmlDocument and NAnt.Core.Tasks.AttribTask.&lt;br&gt;&lt;br&gt;&lt;img src="/photos/mattward/images/9007/original.aspx"&gt;&lt;br&gt;&lt;br&gt;&lt;b&gt;Creating an Object with Overloaded Constructors&lt;/b&gt;&lt;br&gt;&lt;br&gt;If you try to create an object that has several constructors you will be prompted to choose one. If you picked one that requires no parameters then the object will be created. If it requires parameters the selected constructor will be displayed in the Parameters panel where you can supply the parameters. Alternatively you can select the constructor required from the Assemblies panel and click the Create Object button in the Parameters panel.&lt;br&gt;&lt;br&gt;When the constructor requires parameters you can specify values in the Parameters panel. Clicking the Create Object button will then create an object and display it in the Objects panel. The screenshot below shows one of the System.Net.Uri class constructors selected, the url and UriKind have been entered into the Parameters panel before the object was created.&lt;br&gt;&lt;br&gt;&lt;img src="/photos/mattward/images/9001/original.aspx"&gt;&lt;br&gt;&lt;br&gt;The Parameters panel also allows you to use objects already created and being displayed in the Objects panel. The screenshot below shows the use of the previously created Uri object being passed in to construct another Uri object.&lt;br&gt;&lt;br&gt;&lt;img src="/photos/mattward/images/9002/original.aspx"&gt;&lt;br&gt;&lt;br&gt;&lt;b&gt;Adding an Object to a Collection&lt;/b&gt;&lt;br&gt;&lt;br&gt;Once you have created a collection object, a type that implements IList, for example the System.Collections.Specialized.StringCollection class, you can then create an object and it to the collection. To add the object to the collection, select the newly created object in the Objects panel, then cut and paste the object into the collection object.&lt;br&gt;&lt;br&gt;&lt;b&gt;Creating a Control&lt;/b&gt;&lt;br&gt;&lt;br&gt;If you have a class that is derived from System.Windows.Forms.Control it will be created and displayed on the design surface as well as being added to the Objects panel. To create a control object, select the class in the Assemblies panel, then either drag it to the design surface, or right click and select Create Object, or click the Create Object in the Parameters panel. The screenshot below shows a System.Windows.Forms.Form object created and displayed on the design surface.&lt;br&gt;&lt;br&gt;&lt;img src="/photos/mattward/images/9003/original.aspx"&gt;&lt;br&gt;&lt;br&gt;&lt;b&gt;Running an Application&lt;/b&gt;&lt;br&gt;&lt;br&gt;As well as being able to create objects from an assembly you can also run a .NET application from inside the Component Inspector. An assembly that can be executed is displayed with bold text in the Assemblies panel. Select the assembly, right click and select Create Object in the same way that you would create an object. When the application has been started the object passed to the System.Windows.Forms.Application.Run method is added to the Objects panel and can be inspected.&lt;br&gt;&lt;br&gt;&lt;b&gt;Inspecting Objects&lt;/b&gt;&lt;br&gt;&lt;br&gt;Once an object has been created you can modify its fields, properties, call its methods and monitor its events.&lt;br&gt;&lt;br&gt;&lt;b&gt;Setting a Field &lt;/b&gt;&lt;br&gt;&lt;br&gt;Browse to the field in the Objects panel and then you can modify the field value from the Parameters panel. Set the field to the value you want and then click the Set Field button. &lt;br&gt;&lt;br&gt;&lt;b&gt;Setting a Property&lt;/b&gt;&lt;br&gt;&lt;br&gt;Changing the value of a property is done in the same way as with a field, select the property in the Objects panel, modify the value in the Parameters panel and then click the Set Prop button.&lt;br&gt;&lt;br&gt;&lt;b&gt;Invoking a Method&lt;/b&gt;&lt;br&gt;&lt;br&gt;Created objects can have their methods invoked or executed. From the Objects panel, select the method, enter any parameters required in the Parameters panel, and then click the Invoke Method button. If the method has a return value the result will be shown as the method node's value.&lt;br&gt;&lt;br&gt;&lt;b&gt;Removing an Object&lt;/b&gt;&lt;br&gt;&lt;br&gt;To remove an object select it from the Objects panel, right click and select the Delete menu option. This can be used to remove an object from a collection or from the top level objects displayed in the Objects panel.&lt;br&gt;&lt;br&gt;&lt;b&gt;Event Logging&lt;/b&gt;&lt;br&gt;&lt;br&gt;You can log an individual event or all events for an object. Events being monitored are added to the Events Being Logged Panel. &lt;br&gt;&lt;br&gt;&lt;img src="/photos/mattward/images/9005/original.aspx"&gt;&lt;br&gt;&lt;br&gt;Log entries are added to the Event Log panel.&lt;br&gt;&lt;br&gt;&lt;img src="/photos/mattward/images/9004/original.aspx"&gt;&lt;br&gt;&lt;br&gt;To log an individual event, select the event in the Objects panel, right click and select the Event Logging menu option. &lt;br&gt;&lt;br&gt;To log all events for an object, select the object (not an event) in the Objects panel, right click and select the Event Logging menu option. All the events will then be added to the Events Being Logged panel.&lt;br&gt;&lt;br&gt;The "Inc" column is the incarnation number and tells you what events occur due to a single action. The MouseDown event usually causes a Click event