<?xml version="1.0" encoding="UTF-8" ?>
<?xml-stylesheet type="text/xsl" href="http://community.sharpdevelop.net/utility/FeedStylesheets/rss.xsl" media="screen"?><rss version="2.0" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:slash="http://purl.org/rss/1.0/modules/slash/" xmlns:wfw="http://wellformedweb.org/CommentAPI/"><channel><title>Matt Ward</title><link>http://community.sharpdevelop.net/blogs/mattward/default.aspx</link><description /><dc:language>en</dc:language><generator>CommunityServer 2007.1 SP2 (Build: 31113.47)</generator><item><title>Debugging IronPython Code in SharpDevelop</title><link>http://community.sharpdevelop.net/blogs/mattward/archive/2009/05/30/DebuggingIronPythonCode.aspx</link><pubDate>Sat, 30 May 2009 12:40:00 GMT</pubDate><guid isPermaLink="false">1b90d1c1-04e6-45b0-b51d-b665527d49b9:26587</guid><dc:creator>MattWard</dc:creator><slash:comments>2</slash:comments><wfw:commentRss xmlns:wfw="http://wellformedweb.org/CommentAPI/">http://community.sharpdevelop.net/blogs/mattward/rsscomments.aspx?PostID=26587</wfw:commentRss><wfw:comment xmlns:wfw="http://wellformedweb.org/CommentAPI/">http://community.sharpdevelop.net/blogs/mattward/commentapi.aspx?PostID=26587</wfw:comment><comments>http://community.sharpdevelop.net/blogs/mattward/archive/2009/05/30/DebuggingIronPythonCode.aspx#comments</comments><description>&lt;p&gt;With &lt;a href="http://build.sharpdevelop.net/BuildArtefacts/"&gt;
    SharpDevelop 3.1&lt;/a&gt; you can now debug IronPython code with the 
    IronPython Interpreter (ipy.exe).&lt;/p&gt;
&lt;p&gt;Before you start make sure the debugger is set to use the 
    &lt;b&gt;Just My Code&lt;/b&gt; feature. From the Tools menu select Options and 
    then click the Debugging category.&lt;/p&gt;
&lt;p&gt;&lt;img alt="Debugger options for debugging IronPython code" src="http://community.sharpdevelop.net/photos/mattward/images/original/DebuggingOptionsWhenDebuggingIronPythonCode.aspx" /&gt;&lt;/p&gt;
&lt;p&gt;Ensure that the &lt;b&gt;Just My Code&lt;/b&gt; feature is checked and that 
    the &lt;b&gt;Step over code without symbols&lt;/b&gt; is not checked. If the 
    Step over code without symbols option is selected then stepping 
    will not work properly and lines of code will be skipped over.&lt;/p&gt;
&lt;p&gt;There are two ways to debug your code. You can use the Python 
    menu or modify the project options. We will look at both of these 
    alternatives. First open your IronPython project into SharpDevelop. 
    Open your main file and make sure it is the active text editor 
    window. Set a breakpoint somewhere in your code. Then from the 
    Python menu select Run.&lt;/p&gt;
&lt;p&gt;&lt;img alt="Python menu option to run with debugger" src="http://community.sharpdevelop.net/photos/mattward/images/original/PythonRunWithDebuggerMenuItem.aspx" /&gt;&lt;/p&gt;
&lt;p&gt;This will start ipy.exe which will run your code and the 
    debugger should stop the execution at the breakpoint.&lt;/p&gt;
&lt;p&gt;&lt;img alt="Debugging IronPython code" src="http://community.sharpdevelop.net/photos/mattward/images/original/DebuggingIronPythonCode.aspx" /&gt;&lt;/p&gt;
&lt;p&gt;From this point you can do the usual debugging activities such 
    as stepping through your code, viewing the callstack, adding items 
    to the watch window, etc.&lt;/p&gt;
&lt;p&gt;If you want to use a different ipy.exe then this can be 
    specified in the Python Options dialog (Tools menu | Options).&lt;/p&gt;
&lt;p&gt;&lt;img alt="Python options dialog" src="http://community.sharpdevelop.net/photos/mattward/images/original/PythonToolsOptionsDialog.aspx" /&gt;&lt;/p&gt;
&lt;p&gt;To enable debugging when you press F5 or select the Debug Run 
    menu option you can modify the project options. From the Projects 
    menu select Project Options and then open the Debug tab. Here you 
    should change the Start Action to &lt;b&gt;Start external program&lt;/b&gt; and 
    use the browse button to locate ipy.exe. In the Start Options add 
    the following command line arguments, changing the name of your 
    main file as required.&lt;/p&gt;
&lt;pre&gt;-D ${ProjectDir}\Program.py&lt;/pre&gt;
&lt;p&gt;Once these changes are saved you can then press F5 and ipy.exe 
    will be run under the debugger instead of running the compiled 
    executable.3&lt;/p&gt;
&lt;h2&gt;Issues&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;No support for debugging the executable produced by the 
      IronPython compiler since it does not produce debug symbols (i.e. 
      .pdb files).&lt;/li&gt;
&lt;li&gt;
        When using ipy.exe you need to add references to .NET 
        assemblies explicitly in your code except for System which is 
        included by default. For example:
&lt;pre&gt;import clr &lt;br /&gt;clr.AddReference(&amp;quot;System.Windows.Forms&amp;quot;) &lt;br /&gt;&lt;/pre&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;Thanks&lt;/h2&gt;
&lt;p&gt;Thanks to 
    &lt;a href="http://community.sharpdevelop.net/blogs/dsrbecky/"&gt;David 
    Srbecky&lt;/a&gt;, SharpDevelop&amp;#39;s debugger expert and maintainer, 
    for reviewing the code changes I wanted to make to the debugger and 
    making sure nothing was broken. Adding support for debugging 
    IronPython was straightforward and required 10-15 lines of new code 
    thanks to the code already written by David.&lt;/p&gt;
&lt;p&gt;Thanks also to &lt;a href="http://devhawk.net/"&gt;Harry Pierson&lt;/a&gt; 
    (IronPython Program Manager at Microsoft) who has written a great 
    set of blog posts on 
    &lt;a href="http://devhawk.net/CategoryView,category,Debugger.aspx"&gt;
    creating an IronPython debugger in IronPython&lt;/a&gt; which gave me the 
    reason why SharpDevelop&amp;#39;s debugger was not working when 
    debugging IronPython code.&lt;/p&gt;&lt;img src="http://community.sharpdevelop.net/aggbug.aspx?PostID=26587" width="1" height="1"&gt;</description><category domain="http://community.sharpdevelop.net/blogs/mattward/archive/tags/Python/default.aspx">Python</category></item><item><title>IronPython 2.0 Forms Designer</title><link>http://community.sharpdevelop.net/blogs/mattward/archive/2009/05/12/IronPython2FormsDesigner.aspx</link><pubDate>Tue, 12 May 2009 19:50:00 GMT</pubDate><guid isPermaLink="false">1b90d1c1-04e6-45b0-b51d-b665527d49b9:26404</guid><dc:creator>MattWard</dc:creator><slash:comments>0</slash:comments><wfw:commentRss xmlns:wfw="http://wellformedweb.org/CommentAPI/">http://community.sharpdevelop.net/blogs/mattward/rsscomments.aspx?PostID=26404</wfw:commentRss><wfw:comment xmlns:wfw="http://wellformedweb.org/CommentAPI/">http://community.sharpdevelop.net/blogs/mattward/commentapi.aspx?PostID=26404</wfw:comment><comments>http://community.sharpdevelop.net/blogs/mattward/archive/2009/05/12/IronPython2FormsDesigner.aspx#comments</comments><description>&lt;p&gt;Support for designing Windows Forms in IronPython is now 
    available in SharpDevelop 3.1. The 
    &lt;a href="http://community.sharpdevelop.net/blogs/mattward/archive/2007/10/21/IronPythonIntegrationInSharpDevelop22.aspx"&gt;
    original IronPython forms designer&lt;/a&gt; was removed when 
    SharpDevelop 3.0 began supporting 
    &lt;a href="http://www.codeplex.com/IronPython"&gt;IronPython 2.0&lt;/a&gt; 
    which had removed support for generating IronPython code from 
    &lt;a href="http://msdn.microsoft.com/en-us/library/y2k85ax6.aspx"&gt;
    Microsoft&amp;#39;s CodeDOM&lt;/a&gt;. The forms designer has now been 
    re-implemented to use the IronPython 
    &lt;a href="http://en.wikipedia.org/wiki/Abstract_syntax_tree"&gt;
    abstract syntax tree&lt;/a&gt; (AST) and no longer relies on the 
    CodeDOM.  &lt;/p&gt;
&lt;h2&gt;Creating a Windows Application&lt;/h2&gt;
&lt;p&gt;To create a Windows Application 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. Select the Python category to show the available project 
    templates. Select the Windows Application project template, enter a 
    name and location and click the Create button.&lt;/p&gt;
&lt;p&gt;&lt;img alt="New Python Project Dialog" src="http://community.sharpdevelop.net/photos/mattward/images/original/NewPythonWinFormsProject.aspx" /&gt;&lt;/p&gt;
&lt;h2&gt;Designing Windows Forms&lt;/h2&gt;
&lt;p&gt;The Windows Forms designer is not yet complete so be warned that 
    it could generate form code that will no longer compile.&lt;/p&gt;
&lt;p&gt;The designer can be opened by opening a form in the text editor 
    and selecting the Design tab at the bottom of the editor.&lt;/p&gt;
&lt;p&gt;&lt;img alt="Python main form before opening the designer" src="http://community.sharpdevelop.net/photos/mattward/images/original/PythonMainFormBeforeOpeningInDesigner.aspx" /&gt;&lt;/p&gt;
&lt;p&gt;Once open in the designer you can add controls to the form by 
    dragging the controls 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 alt="Main form designed in designer" src="http://community.sharpdevelop.net/photos/mattward/images/original/PythonMainFormInDesigner.aspx" /&gt;&lt;/p&gt;
&lt;p&gt;Click the Source tab at the bottom of the editor to view the 
    generated code in the InitializeComponents method.&lt;/p&gt;
&lt;p&gt;&lt;img alt="Generated form code" src="http://community.sharpdevelop.net/photos/mattward/images/original/PythonMainFormGeneratedCode.aspx" /&gt;&lt;/p&gt;
&lt;h2&gt;Limitations&lt;/h2&gt;
&lt;p&gt;The IronPython forms designer is not yet complete and the 
    following are some of the known limitations.&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;No support for project or local form resources.&lt;/li&gt;
&lt;li&gt;No support for icons.&lt;/li&gt;
&lt;li&gt;Incomplete support for ToolStripItems and menu strips.&lt;/li&gt;
&lt;li&gt;Incomplete support for ListViewItems.&lt;/li&gt;
&lt;li&gt;No support for TreeViewItems.&lt;/li&gt;
&lt;li&gt;Incomplete support for non-visual components (e.g. 
      Timers).&lt;/li&gt;
&lt;li&gt;Controls needed to be fully namespace qualified.&lt;/li&gt;
&lt;/ol&gt;
&lt;h2&gt;Forms Designer Internals&lt;/h2&gt;
&lt;p&gt;For those interested in how the forms designer actually works at 
    a high level we will now look at what the IronPython forms designer 
    does when loading and then generating code for a form. &lt;/p&gt;
&lt;p&gt;To show the form in the designer the following steps are 
    executed.&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;The form&amp;#39;s code is parsed and an IronPython AST 
      (PythonAst object) is created.&lt;/li&gt;
&lt;li&gt;The AST is then visited and each control is added to the 
      forms designer and the control&amp;#39;s properties are set.&lt;/li&gt;
&lt;li&gt;The form&amp;#39;s properties are set in the designer and the 
      form is displayed.&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;To generate the code after the form has been designed the 
    following steps are executed.&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;The form is obtained from the forms designer.&lt;/li&gt;
&lt;li&gt;Each of the child components of the form have their 
      properties checked to see if they need to be serialized. This can 
      be done by getting all the 
      &lt;a href="http://msdn.microsoft.com/en-us/library/system.componentmodel.typedescriptor.getproperties.aspx"&gt;
      property descriptors&lt;/a&gt; and then checking the 
      &lt;a href="http://msdn.microsoft.com/en-us/library/system.componentmodel.propertydescriptor.shouldserializevalue.aspx"&gt;
      ShouldSerializeValue&lt;/a&gt; method. If they do need to be serialized 
      then code is generated for them and added to a StringBuilder.&lt;/li&gt;
&lt;li&gt;After all the child components are added the code for the 
      form is generated.&lt;/li&gt;
&lt;li&gt;Finally the generated code is inserted into the text editor 
      inside the InitializeComponent method, replacing any existing 
      code.&lt;/li&gt;
&lt;/ol&gt;&lt;img src="http://community.sharpdevelop.net/aggbug.aspx?PostID=26404" width="1" height="1"&gt;</description><category domain="http://community.sharpdevelop.net/blogs/mattward/archive/tags/Python/default.aspx">Python</category></item><item><title>Converting C# and VB.NET Code to IronPython</title><link>http://community.sharpdevelop.net/blogs/mattward/archive/2009/05/11/ConvertingCSharpVBNetCodeToIronPython.aspx</link><pubDate>Mon, 11 May 2009 19:07:00 GMT</pubDate><guid isPermaLink="false">1b90d1c1-04e6-45b0-b51d-b665527d49b9:26394</guid><dc:creator>MattWard</dc:creator><slash:comments>2</slash:comments><wfw:commentRss xmlns:wfw="http://wellformedweb.org/CommentAPI/">http://community.sharpdevelop.net/blogs/mattward/rsscomments.aspx?PostID=26394</wfw:commentRss><wfw:comment xmlns:wfw="http://wellformedweb.org/CommentAPI/">http://community.sharpdevelop.net/blogs/mattward/commentapi.aspx?PostID=26394</wfw:comment><comments>http://community.sharpdevelop.net/blogs/mattward/archive/2009/05/11/ConvertingCSharpVBNetCodeToIronPython.aspx#comments</comments><description>&lt;p&gt;SharpDevelop 3.1 now supports converting C# and VB.NET code to 
    IronPython. It can convert a single file or an entire project. The 
    code to convert between these languages is still under development 
    and has some limitations. &lt;/p&gt;
&lt;h2&gt;Converting an Individual File&lt;/h2&gt;
&lt;p&gt;To convert a C# or VB.NET file, open it in SharpDevelop&amp;#39;s 
    text editor, then from &lt;b&gt;Tools&lt;/b&gt; menu select &lt;b&gt;Convert code to 
    Python&lt;/b&gt;.&lt;/p&gt;
&lt;p&gt;&lt;img alt="Convert code to Python menu option." src="http://community.sharpdevelop.net/photos/mattward/images/original/ConvertCodeToPythonMenuItem.aspx" /&gt;&lt;/p&gt;
&lt;p&gt;The code conversion is limited to converting classes so it will 
    not convert an arbitary piece of code that is not inside a 
    class.&lt;/p&gt;
&lt;p&gt;&lt;img alt="C# code before conversion." src="http://community.sharpdevelop.net/photos/mattward/images/original/CSharpCodeBeforeConversionToPython.aspx" /&gt;&lt;/p&gt;
&lt;p&gt;&lt;img alt="C# code after conversion to Python" src="http://community.sharpdevelop.net/photos/mattward/images/original/ConvertedCSharpClassAsPython.aspx" /&gt;&lt;/p&gt;
&lt;h2&gt;Converting a Project&lt;/h2&gt;
&lt;p&gt;To convert a C# or VB.NET project, open it in SharpDevelop, then 
    from the &lt;b&gt;Project&lt;/b&gt; menu select &lt;b&gt;Convert From C# to 
    Python&lt;/b&gt;.&lt;/p&gt;
&lt;p&gt;&lt;img alt="Convert from C# project to Python project menu option." src="http://community.sharpdevelop.net/photos/mattward/images/original/ProjectConvertFromCSharpToPythonMenuItem.aspx" /&gt;&lt;/p&gt;
&lt;p&gt;Once converted the project will most likely not compile straight 
    away due to limitations in the implementation. At the time of 
    writing converting a project has the following limitations:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Project&amp;#39;s Main File is not set.&lt;/li&gt;
&lt;li&gt;No code generated to call the project&amp;#39;s Main entry 
      method.&lt;/li&gt;
&lt;li&gt;Namespace imports do include all the used classes.&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;Code Conversion Internals&lt;/h2&gt;
&lt;p&gt;Converting code to IronPython was originally supported in 
    &lt;a href="http://community.sharpdevelop.net/blogs/mattward/archive/2007/10/21/IronPythonIntegrationInSharpDevelop22.aspx"&gt;
    SharpDevelop 2.2&lt;/a&gt; and was based on converting code to a 
    &lt;a href="http://msdn.microsoft.com/en-us/library/y2k85ax6.aspx"&gt;
    Microsoft CodeDOM&lt;/a&gt; and then getting IronPython 1.0 to generate 
    the Python code. In IronPython 2.0 this CodeDOM support was removed 
    so the code conversion feature was removed from SharpDevelop 3.0 
    since that was using IronPython 2.0. In SharpDevelop 3.1 the code 
    conversion has been rewritten to no longer use the CodeDOM support. 
    It now works by executing the following simple steps:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;The C# or VB.NET code is parsed using SharpDevelop&amp;#39;s 
      parsing library 
      &lt;a href="http://laputa.sharpdevelop.net/NRefactoryTutorialVideo.aspx"&gt;
      NRefactory&lt;/a&gt; and an 
      &lt;a href="http://en.wikipedia.org/wiki/Abstract_syntax_tree"&gt;
      abstract syntax tree (AST)&lt;/a&gt; is generated.&lt;/li&gt;
&lt;li&gt;A &lt;a href="http://en.wikipedia.org/wiki/Visitor_pattern"&gt;
      visitor&lt;/a&gt; class then walks this AST and generates Python code 
      which is added to a StringBuilder.&lt;/li&gt;
&lt;li&gt;Once the visit is complete the generated Python code is then 
      displayed or saved to disk.&lt;/li&gt;
&lt;/ol&gt;&lt;img src="http://community.sharpdevelop.net/aggbug.aspx?PostID=26394" width="1" height="1"&gt;</description></item><item><title>NUnit 2.5 Support</title><link>http://community.sharpdevelop.net/blogs/mattward/archive/2009/05/10/NUnit25Support.aspx</link><pubDate>Sun, 10 May 2009 16:46:00 GMT</pubDate><guid isPermaLink="false">1b90d1c1-04e6-45b0-b51d-b665527d49b9:26381</guid><dc:creator>MattWard</dc:creator><slash:comments>0</slash:comments><wfw:commentRss xmlns:wfw="http://wellformedweb.org/CommentAPI/">http://community.sharpdevelop.net/blogs/mattward/rsscomments.aspx?PostID=26381</wfw:commentRss><wfw:comment xmlns:wfw="http://wellformedweb.org/CommentAPI/">http://community.sharpdevelop.net/blogs/mattward/commentapi.aspx?PostID=26381</wfw:comment><comments>http://community.sharpdevelop.net/blogs/mattward/archive/2009/05/10/NUnit25Support.aspx#comments</comments><description>&lt;p&gt;SharpDevelop 3.1 now supports &lt;a href="http://nunit.org"&gt;NUnit 
    2.5&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;A summary of which NUnit version is supported by SharpDevelop is 
    shown in the table below.&lt;/p&gt;
&lt;table class="article "&gt;

&lt;tr&gt;
&lt;td&gt;SharpDevelop 3.1&lt;/td&gt;
&lt;td&gt;NUnit 2.5&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;SharpDevelop 3.0&lt;/td&gt;
&lt;td&gt;NUnit 2.4.8&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;SharpDevelop 2.2.1&lt;/td&gt;
&lt;td&gt;NUnit 2.4.7&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;SharpDevelop 1.1&lt;/td&gt;
&lt;td&gt;NUnit 2.2&lt;/td&gt;
&lt;/tr&gt;

&lt;/table&gt;
&lt;h2&gt;NUnit 2.5 Changes&lt;/h2&gt;
&lt;p&gt;NUnit 2.5 has changed quite substantially compared with the 
    previous 2.4.8 release, as outlined in the 
    &lt;a href="http://nunit.com/index.php?p=releaseNotes&amp;amp;r=2.5"&gt;NUnit 
    2.5 release notes&lt;/a&gt;. The problems that we had when migrating 
    SharpDevelop&amp;#39;s unit tests to NUnit 2.5 were as follows.&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;&lt;b&gt;Assert.IsInstanceOfType has been replaced by 
        Assert.IsInstanceOf.&lt;/b&gt;
&lt;p&gt;Your code will still compile and work if 
        Assert.IsInstanceOfType is used but you will get compiler 
        warnings.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;&lt;b&gt;NUnit.Framework.SyntaxHelpers namespace no longer exists.&lt;/b&gt;
&lt;p&gt;All classes that were in this namespace have been moved to 
        the NUnit.Framework namespace.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;&lt;b&gt;The Has.Count constraint no longer takes an integer 
        parameter.&lt;/b&gt;
&lt;p&gt;To fix this problem replace code such as:&lt;/p&gt;
&lt;pre&gt;Assert.That(classesCollection, Has.Count(1));&lt;/pre&gt;
&lt;p&gt;With the following:&lt;/p&gt;
&lt;pre&gt;Assert.That(classesCollection.Has.Count.EqualTo(1));&lt;/pre&gt;
&lt;/li&gt;
&lt;li&gt;&lt;b&gt;Overriding a [TestFixtureSetUp] method in a derived class 
        using the new keyword no longer works.&lt;/b&gt;
&lt;p&gt;Some of the SharpDevelop unit tests were overriding an 
        abstract base test class [TestFixtureSetUp] method in a derived 
        class by using the new keyword, as shown below.&lt;/p&gt;
&lt;p&gt;Base class:&lt;/p&gt;
&lt;pre&gt;[TestFixtureSetUp] &lt;br /&gt;public void SetUpFixture()  &lt;br /&gt;{ &lt;br /&gt;    // Setup code. &lt;br /&gt;}&lt;/pre&gt;
&lt;p&gt;Derived class:&lt;/p&gt;
&lt;pre&gt;[TestFixtureSetUp] &lt;br /&gt;public new void SetUpFixture()  &lt;br /&gt;{     &lt;br /&gt;    // Extra setup code. &lt;br /&gt;    base.SetUpFixture(); &lt;br /&gt;}&lt;/pre&gt;
&lt;p&gt;In NUnit 2.4.8 the SetUpFixture method in the derived class 
        would be called when running the tests allowing it to execute 
        some extra setup steps. In NUnit 2.5 the base class 
        SetUpFixture method is called instead and the derived class 
        method is never called. To resolve the problem we changed the 
        base class so it used a virtual method and allowed the derived 
        class to override this to execute its extra setup steps.&lt;/p&gt;
&lt;p&gt;Base class:&lt;/p&gt;
&lt;pre&gt;[TestFixtureSetUp] &lt;br /&gt;public void SetUpFixture()  &lt;br /&gt;{ &lt;br /&gt;    BeforeSetUpFixture(); &lt;br /&gt;    // Setup code. &lt;br /&gt;} &lt;br /&gt; &lt;br /&gt;public virtual void BeforeSetUpFixture() &lt;br /&gt;{ &lt;br /&gt;}&lt;/pre&gt;
&lt;p&gt;Derived class:&lt;/p&gt;
&lt;pre&gt;public override void BeforeSetUpFixture() &lt;br /&gt;{ &lt;br /&gt;     // Extra setup code. &lt;br /&gt;}&lt;/pre&gt;
&lt;/li&gt;
&lt;/ol&gt;&lt;img src="http://community.sharpdevelop.net/aggbug.aspx?PostID=26381" width="1" height="1"&gt;</description><category domain="http://community.sharpdevelop.net/blogs/mattward/archive/tags/UnitTests/default.aspx">UnitTests</category></item><item><title>Using the Python Standard Library</title><link>http://community.sharpdevelop.net/blogs/mattward/archive/2009/03/01/UsingPythonStandardLibrary.aspx</link><pubDate>Sun, 01 Mar 2009 14:43:00 GMT</pubDate><guid isPermaLink="false">1b90d1c1-04e6-45b0-b51d-b665527d49b9:25410</guid><dc:creator>MattWard</dc:creator><slash:comments>2</slash:comments><wfw:commentRss xmlns:wfw="http://wellformedweb.org/CommentAPI/">http://community.sharpdevelop.net/blogs/mattward/rsscomments.aspx?PostID=25410</wfw:commentRss><wfw:comment xmlns:wfw="http://wellformedweb.org/CommentAPI/">http://community.sharpdevelop.net/blogs/mattward/commentapi.aspx?PostID=25410</wfw:comment><comments>http://community.sharpdevelop.net/blogs/mattward/archive/2009/03/01/UsingPythonStandardLibrary.aspx#comments</comments><description>&lt;p&gt;Here is a short walkthrough on how to use the 
    &lt;a href="http://docs.python.org/library/"&gt;Python Standard 
    Library&lt;/a&gt; with 
    &lt;a href="http://www.sharpdevelop.net/OpenSource/SD/Download/"&gt;
    SharpDevelop 3.0&lt;/a&gt; and IronPython 2.0.&lt;/p&gt;&lt;h2&gt;Prerequisites&lt;/h2&gt;&lt;p&gt;You will need to have SharpDevelop 3.0 and Python 2.5 installed 
    on your machine. These can be downloaded from the following 
    locations.&lt;/p&gt;&lt;ul&gt;&lt;li&gt;&lt;a href="http://www.sharpdevelop.net/OpenSource/SD/Download/#SharpDevelop30"&gt;SharpDevelop 
      3.0&lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href="http://www.python.org/download/releases/2.5.4/"&gt;Python 
      2.5&lt;/a&gt;&lt;/li&gt;&lt;/ul&gt;&lt;p&gt;Note that using Python 2.6 is not supported. The following 
    section assumes that Python 2.5 was installed into the C:\Python25 
    folder.&lt;/p&gt;&lt;h2&gt;Using the Python Standard Library&lt;/h2&gt;&lt;p&gt;First we will create an IronPython console application in 
    SharpDevelop. From the &lt;b&gt;File&lt;/b&gt; menu select &lt;b&gt;New&lt;/b&gt; and then 
    &lt;b&gt;Solution&lt;/b&gt;. In the New Project window select the &lt;b&gt;Python&lt;/b&gt; 
    category and select the &lt;b&gt;Console Application&lt;/b&gt; template.&lt;/p&gt;&lt;p&gt;&lt;img src="http://community.sharpdevelop.net/photos/mattward/images/original/NewPythonConsoleProject.aspx" alt="New Python Console Application template" /&gt;&lt;/p&gt;&lt;p&gt;Give the project a name, select its location and click the 
    &lt;b&gt;Create&lt;/b&gt; button.&lt;/p&gt;&lt;p&gt;To use the Python Standard Library the project needs a reference 
    to IronPython.dll, which should be added by default, and a 
    reference to IronPython.Modules.dll. Open the &lt;b&gt;Projects&lt;/b&gt; 
    window, if it is not already open, by selecting &lt;b&gt;Projects&lt;/b&gt; 
    from the &lt;b&gt;View&lt;/b&gt; menu. Right click the project&amp;#39;s 
    references and select &lt;b&gt;Add Reference&lt;/b&gt;. In the &lt;b&gt;Add 
    Reference&lt;/b&gt; dialog first add a reference to &lt;b&gt;mscorlib&lt;/b&gt;, this 
    reference is needed since we are going to use the 
    System.Console class to pause the console output. Then select the 
    &lt;b&gt;.NET Assembly Browser&lt;/b&gt; tab and click the &lt;b&gt;Browse&lt;/b&gt; 
    button. Locate the IronPython.Modules.dll file and select it. This 
    file should be in the following folder:&lt;/p&gt;&lt;p&gt;C:\Program 
    Files\SharpDevelop\3.0\AddIns\AddIns\BackendBindings\PythonBinding&lt;/p&gt;&lt;p&gt;Click OK to close the Add Reference dialog.&lt;/p&gt;&lt;p&gt;In the Program.py file change the code to the following:&lt;/p&gt;&lt;pre&gt;# Add Python Standard Library to search path. &lt;br /&gt;import sys &lt;br /&gt;sys.path.append(&amp;quot;c:\python25\lib&amp;quot;) &lt;br /&gt; &lt;br /&gt;# Use Python Standard Library os module. &lt;br /&gt;import os &lt;br /&gt;print os.getcwd() &lt;br /&gt; &lt;br /&gt;# Wait for a key press before closing the console window. &lt;br /&gt;import System &lt;br /&gt;print &amp;quot;Press any key to continue...&amp;quot; &lt;br /&gt;System.Console.ReadKey(True) &lt;/pre&gt;&lt;p&gt;The sys.path.append line adds the Python Standard Library to the 
    search path. After that the os module is imported and the os.getcwd 
    method is called to get the current working directory and this is 
    output to the console window. The last three lines of code are just 
    used to pause the console window so we can see the output.&lt;/p&gt;&lt;p&gt;Compile the above code by selecting &lt;b&gt;Build Solution&lt;/b&gt; from 
    the &lt;b&gt;Build&lt;/b&gt; menu.&lt;/p&gt;&lt;p&gt;Finally run the application by selecting &lt;b&gt;Run&lt;/b&gt; from the 
    &lt;b&gt;Debug&lt;/b&gt; menu.&lt;/p&gt;&lt;p&gt;&lt;img src="http://community.sharpdevelop.net/photos/mattward/images/original/PythonConsoleAppOutputWindow.aspx" alt="Output from Python Console application." /&gt;&lt;/p&gt;&lt;img src="http://community.sharpdevelop.net/aggbug.aspx?PostID=25410" width="1" height="1"&gt;</description><category domain="http://community.sharpdevelop.net/blogs/mattward/archive/tags/Python/default.aspx">Python</category></item><item><title>WiX 3.0 AddIn for SharpDevelop 2.2</title><link>http://community.sharpdevelop.net/blogs/mattward/archive/2008/11/18/Wix3AddInForSharpDevelop2.aspx</link><pubDate>Tue, 18 Nov 2008 19:53:00 GMT</pubDate><guid isPermaLink="false">1b90d1c1-04e6-45b0-b51d-b665527d49b9:24167</guid><dc:creator>MattWard</dc:creator><slash:comments>0</slash:comments><wfw:commentRss xmlns:wfw="http://wellformedweb.org/CommentAPI/">http://community.sharpdevelop.net/blogs/mattward/rsscomments.aspx?PostID=24167</wfw:commentRss><wfw:comment xmlns:wfw="http://wellformedweb.org/CommentAPI/">http://community.sharpdevelop.net/blogs/mattward/commentapi.aspx?PostID=24167</wfw:comment><comments>http://community.sharpdevelop.net/blogs/mattward/archive/2008/11/18/Wix3AddInForSharpDevelop2.aspx#comments</comments><description>&lt;p&gt;If you want to use WiX 3.0 with SharpDevelop 2.2 now you can. 
    SharpDevelop 2.2 will still ship with WiX 2.0 support however the 
    WiX 3.0 addin has been backported. This WiX 3.0 
    addin for SharpDevelop 2.2 can be downloaded at the end of this 
    post. It was built and tested 
    using &lt;a href="http://wix.sourceforge.net/releases/3.0.4714.0/"&gt;WiX 
    3.0.4714&lt;/a&gt; which is the most recent release at the current time.&lt;/p&gt;&lt;h2&gt;Installing&lt;/h2&gt;&lt;p&gt;The simplest way to use the addin is as follows.&lt;/p&gt;&lt;ol&gt;&lt;li&gt;Download the wix3-binaries.zip file from 
      &lt;a href="http://wix.sourceforge.net/releases/3.0.4714.0/"&gt;
      SourceForge&lt;/a&gt;.&lt;/li&gt;&lt;li&gt;In SharpDevelop&amp;#39;s WiX addin folder 
      SharpDevelop\2.2\AddIns\AddIns\BackendBindings\WixBinding rename 
      the original &lt;b&gt;WixBinding.addin&lt;/b&gt; file to 
      WixBinding.addin-bak.&lt;/li&gt;&lt;li&gt;Copy the contents of the &lt;b&gt;bin&lt;/b&gt; folder in the 
      Wix3Binding.zip file to 
      SharpDevelop\2.2\AddIns\AddIns\BackendBindings\Wix3Binding.&lt;/li&gt;&lt;li&gt;Copy the contents of the &lt;b&gt;doc&lt;/b&gt; folder in the 
      wix3-binaries.zip file to the SharpDevelop\2.2\data\schemas 
      folder. This updates the WiX schemas for use in the XML 
      editor.&lt;/li&gt;&lt;li&gt;Rename the folder SharpDevelop\2.2\Tools\Wix to 
      SharpDevelop\2.2\Tools\Wix-bak&lt;/li&gt;&lt;li&gt;Copy the contents of the wix3-binaries.zip file to the 
      SharpDevelop\2.2\Tools\Wix folder.&lt;/li&gt;&lt;li&gt;Restart SharpDevelop.&lt;/li&gt;&lt;/ol&gt;&lt;h2&gt;Updating to Newer WiX Versions&lt;/h2&gt;&lt;ol&gt;&lt;li&gt;Download the wix3-binaries.zip file from wix.sf.net &lt;/li&gt;&lt;li&gt;Copy the contents of the wix-binaries.zip file to the folder 
      SharpDevelop\2.2\Tools\Wix.&lt;/li&gt;&lt;li&gt;Copy the contents of the doc folder to the 
      SharpDevelop\2.2\data\schemas folder.&lt;/li&gt;&lt;li&gt;If there are any problems try re-compiling the source code 
      and check the unit tests still work.&lt;/li&gt;&lt;/ol&gt;&lt;h2&gt;Compiling the Source Code&lt;/h2&gt;&lt;ol&gt;&lt;li&gt;Copy the contents of the Wix3Binding zip file into the folder 
      SharpDevelop\2.2\src\AddIns\BackendBindings\Wix3Binding.&lt;/li&gt;&lt;li&gt;Run msbuild WixBinding.sln.&lt;/li&gt;&lt;/ol&gt;&lt;p&gt;&lt;a href="http://community.sharpdevelop.net/blogs/mattward/Wix/Wix3Binding.zip"&gt;Download 
    Wix3Binding.zip&lt;/a&gt;&lt;/p&gt;&lt;img src="http://community.sharpdevelop.net/aggbug.aspx?PostID=24167" width="1" height="1"&gt;</description><category domain="http://community.sharpdevelop.net/blogs/mattward/archive/tags/WiX/default.aspx">WiX</category></item><item><title>XML Editor Reuse</title><link>http://community.sharpdevelop.net/blogs/mattward/archive/2008/08/31/XmlEditorReuse.aspx</link><pubDate>Sun, 31 Aug 2008 14:00:00 GMT</pubDate><guid isPermaLink="false">1b90d1c1-04e6-45b0-b51d-b665527d49b9:23223</guid><dc:creator>MattWard</dc:creator><slash:comments>1</slash:comments><wfw:commentRss xmlns:wfw="http://wellformedweb.org/CommentAPI/">http://community.sharpdevelop.net/blogs/mattward/rsscomments.aspx?PostID=23223</wfw:commentRss><wfw:comment xmlns:wfw="http://wellformedweb.org/CommentAPI/">http://community.sharpdevelop.net/blogs/mattward/commentapi.aspx?PostID=23223</wfw:comment><comments>http://community.sharpdevelop.net/blogs/mattward/archive/2008/08/31/XmlEditorReuse.aspx#comments</comments><description>&lt;p&gt;It is always good to see that someone else finds the code that 
    you have written useful enough to be reused in another application. 
    Here we take a look at where SharpDevelop&amp;#39;s XML Editor has 
    been reused. The XML Editor was originally added to SharpDevelop 
    1.0 back in April 2005.&lt;/p&gt;&lt;h2&gt;MonoDevelop&lt;/h2&gt;&lt;p&gt;Some time ago I ported SharpDevelop&amp;#39;s XML Editor so it 
    could be used from inside &lt;a href="http://www.monodevelop.com"&gt;
    MonoDevelop&lt;/a&gt;. Currently there is an 
    &lt;a href="http://md-xed.sourceforge.net/"&gt;addin available for 
    MonoDevelop 1.0&lt;/a&gt;. MonoDevelop 2.0 now ships with this XML Editor 
    after &lt;a href="http://mjhutchinson.com/"&gt;Michael Hutchinson&lt;/a&gt; 
    from Novell integrated it in March this year. I also believe that 
    it is being used to help provide at least some part of the 
    autocompletion for ASP.NET. It will be interesting to see how 
    Michael builds on and improves the XML Editor code.&lt;/p&gt;&lt;h2&gt;Kaxaml&lt;/h2&gt;&lt;p&gt;&lt;a href="http://www.kaxaml.com"&gt;Kaxaml&lt;/a&gt; is a lightweight XAML 
    Editor written by &lt;a href="http://www.notstatic.com"&gt;Robby 
    Ingebretsen&lt;/a&gt;. Kaxaml version 1.0 and 2.0 use a modified version 
    of SharpDevelop&amp;#39;s XML Editor. Robby has replaced the user 
    interface part so the autocompletion popup window now uses WPF. He 
    has also modified it so the autocompletion popup window behaves the 
    same as Visual Studio&amp;#39;s XML Editor. For example, SharpDevelop 
    automatically inserts the equals sign and double quotes an 
    attribute name is autocompleted whilst Visual Studio will 
    autocomplete just the attribute name and then automatically insert 
    the double quotes after the equals sign is typed in.&lt;/p&gt;&lt;h2&gt;Intellisense for Microsoft Expression Blend 2.5&lt;/h2&gt;&lt;p&gt;&lt;a href="http://blogs.telerik.com/StefanDobrev/Posts/08-08-04/IntelliSense_for_Expression_Blend.aspx"&gt;Stefan Dobrev&lt;/a&gt; has written an 
    &lt;a href="http://code.msdn.microsoft.com/BlendSense"&gt;addin to 
    provide XML autocompletion&lt;/a&gt; for the as yet unreleased Expression 
    Blend 2.5. This addin uses the XML Editor code from Kaxaml to 
    provide the autocompletion. Stefan has modified this code slightly 
    to add support for the Expression Blend&amp;#39;s code editor.&lt;/p&gt;&lt;img src="http://community.sharpdevelop.net/aggbug.aspx?PostID=23223" width="1" height="1"&gt;</description><category domain="http://community.sharpdevelop.net/blogs/mattward/archive/tags/XmlEditor/default.aspx">XmlEditor</category></item><item><title>IronPython 2.0 Beta Integration</title><link>http://community.sharpdevelop.net/blogs/mattward/archive/2008/08/20/IronPython2BetaIntegration.aspx</link><pubDate>Wed, 20 Aug 2008 20:27:00 GMT</pubDate><guid isPermaLink="false">1b90d1c1-04e6-45b0-b51d-b665527d49b9:23125</guid><dc:creator>MattWard</dc:creator><slash:comments>0</slash:comments><wfw:commentRss xmlns:wfw="http://wellformedweb.org/CommentAPI/">http://community.sharpdevelop.net/blogs/mattward/rsscomments.aspx?PostID=23125</wfw:commentRss><wfw:comment xmlns:wfw="http://wellformedweb.org/CommentAPI/">http://community.sharpdevelop.net/blogs/mattward/commentapi.aspx?PostID=23125</wfw:comment><comments>http://community.sharpdevelop.net/blogs/mattward/archive/2008/08/20/IronPython2BetaIntegration.aspx#comments</comments><description>&lt;p&gt;Support for 
    &lt;a href="http://www.codeplex.com/IronPython/Release/ProjectReleases.aspx?ReleaseId=14353"&gt;IronPython 2.0 Beta 4&lt;/a&gt; is now available with SharpDevelop 3.&lt;/p&gt;&lt;h2&gt;Missing Features&lt;/h2&gt;&lt;p&gt;Some of the features have been disabled compared to the 
    &lt;a href="http://community.sharpdevelop.net/blogs/mattward/archive/2007/10/21/IronPythonIntegrationInSharpDevelop22.aspx"&gt;IronPython integration in SharpDevelop 2&lt;/a&gt;.&lt;/p&gt;&lt;ul&gt;&lt;li&gt;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;Both of the above features involve converting code to and from a 
    Code DOM. Support for the Code DOM is reduced in IronPython 2 so 
    the above features have been temporarily disabled.&lt;/p&gt;&lt;h2&gt;Compiling&lt;/h2&gt;&lt;p&gt;IronPython 2.0 beta 4 re-introduced support for compiling python 
    code to a .NET executable or dll and so SharpDevelop supports this. 
    There is however one limitation. The working folder needs to be set 
    to the folder containing the compiled dll or executable otherwise 
    it will not be able to locate any local assembly references that 
    are not in the GAC, for example IronPython.dll.&lt;/p&gt;&lt;h2&gt;IronPython Console&lt;/h2&gt;&lt;p&gt;There&amp;#39;s now an IronPython console which can be used to type 
    in IronPython expressions and have them evaluated interactively. It 
    is currently missing code completion which will be implemented 
    shortly. From the &lt;b&gt;View&lt;/b&gt; menu select &lt;b&gt;Tools&lt;/b&gt; and then 
    &lt;b&gt;Python Console&lt;/b&gt;.&lt;/p&gt;&lt;p&gt;&lt;img src="http://community.sharpdevelop.net/photos/mattward/images/original/IronPython2BetaConsole.aspx" alt="IronPython Console Window" /&gt;&lt;/p&gt;&lt;img src="http://community.sharpdevelop.net/aggbug.aspx?PostID=23125" width="1" height="1"&gt;</description><category domain="http://community.sharpdevelop.net/blogs/mattward/archive/tags/Python/default.aspx">Python</category></item><item><title>Attach to Process</title><link>http://community.sharpdevelop.net/blogs/mattward/archive/2008/08/20/AttachToProcess.aspx</link><pubDate>Wed, 20 Aug 2008 20:16:00 GMT</pubDate><guid isPermaLink="false">1b90d1c1-04e6-45b0-b51d-b665527d49b9:23124</guid><dc:creator>MattWard</dc:creator><slash:comments>0</slash:comments><wfw:commentRss xmlns:wfw="http://wellformedweb.org/CommentAPI/">http://community.sharpdevelop.net/blogs/mattward/rsscomments.aspx?PostID=23124</wfw:commentRss><wfw:comment xmlns:wfw="http://wellformedweb.org/CommentAPI/">http://community.sharpdevelop.net/blogs/mattward/commentapi.aspx?PostID=23124</wfw:comment><comments>http://community.sharpdevelop.net/blogs/mattward/archive/2008/08/20/AttachToProcess.aspx#comments</comments><description>&lt;p&gt;SharpDevelop 3 supports attaching the debugger to a running 
    process. &lt;/p&gt;&lt;p&gt;From the &lt;b&gt;Debug&lt;/b&gt; menu select &lt;b&gt;Attach to Process&lt;/b&gt;.&lt;/p&gt;&lt;p&gt;&lt;img src="http://community.sharpdevelop.net/photos/mattward/images/original/DebugAttachToProcessMenuItem.aspx" alt="Attach to Process menu item" /&gt;&lt;/p&gt;&lt;p&gt;The &lt;b&gt;Attach to Process&lt;/b&gt; dialog will show the managed 
    processes by default. Select the process and then either double 
    click or click the &lt;b&gt;Attach&lt;/b&gt; button to attach to the 
    process.&lt;/p&gt;&lt;p&gt;&lt;img src="http://community.sharpdevelop.net/photos/mattward/images/original/AttachToProcessDialog.aspx" alt="Attach to Process dialog" /&gt;&lt;/p&gt;&lt;p&gt;When you have finished debugging you can detach from the process 
    by selecting &lt;b&gt;Detach&lt;/b&gt; from the &lt;b&gt;Debug&lt;/b&gt; menu.&lt;/p&gt;&lt;p&gt;&lt;img src="http://community.sharpdevelop.net/photos/mattward/images/original/DebugDetachMenuItem.aspx" alt="Detach menu item" /&gt;&lt;/p&gt;&lt;img src="http://community.sharpdevelop.net/aggbug.aspx?PostID=23124" width="1" height="1"&gt;</description><category domain="http://community.sharpdevelop.net/blogs/mattward/archive/tags/Debugger/default.aspx">Debugger</category></item><item><title>WiX 3.0 Integration</title><link>http://community.sharpdevelop.net/blogs/mattward/archive/2008/01/02/Wix3Integration.aspx</link><pubDate>Wed, 02 Jan 2008 23:28:00 GMT</pubDate><guid isPermaLink="false">1b90d1c1-04e6-45b0-b51d-b665527d49b9:20371</guid><dc:creator>MattWard</dc:creator><slash:comments>0</slash:comments><wfw:commentRss xmlns:wfw="http://wellformedweb.org/CommentAPI/">http://community.sharpdevelop.net/blogs/mattward/rsscomments.aspx?PostID=20371</wfw:commentRss><wfw:comment xmlns:wfw="http://wellformedweb.org/CommentAPI/">http://community.sharpdevelop.net/blogs/mattward/commentapi.aspx?PostID=20371</wfw:comment><comments>http://community.sharpdevelop.net/blogs/mattward/archive/2008/01/02/Wix3Integration.aspx#comments</comments><description>&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;</description><category domain="http://community.sharpdevelop.net/blogs/mattward/archive/tags/WiX/default.aspx">WiX</category></item><item><title>Porting an AddIn from SharpDevelop 2.2 to 3.0</title><link>http://community.sharpdevelop.net/blogs/mattward/archive/2007/12/09/PortingAnAddInFromSD22ToSD3.aspx</link><pubDate>Sun, 09 Dec 2007 17:28:00 GMT</pubDate><guid isPermaLink="false">1b90d1c1-04e6-45b0-b51d-b665527d49b9:20160</guid><dc:creator>MattWard</dc:creator><slash:comments>0</slash:comments><wfw:commentRss xmlns:wfw="http://wellformedweb.org/CommentAPI/">http://community.sharpdevelop.net/blogs/mattward/rsscomments.aspx?PostID=20160</wfw:commentRss><wfw:comment xmlns:wfw="http://wellformedweb.org/CommentAPI/">http://community.sharpdevelop.net/blogs/mattward/commentapi.aspx?PostID=20160</wfw:comment><comments>http://community.sharpdevelop.net/blogs/mattward/archive/2007/12/09/PortingAnAddInFromSD22ToSD3.aspx#comments</comments><description>&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;</description><category domain="http://community.sharpdevelop.net/blogs/mattward/archive/tags/Porting/default.aspx">Porting</category></item><item><title>IronPython AddIn Internals</title><link>http://community.sharpdevelop.net/blogs/mattward/archive/2007/11/18/IronPythonAddInInternals.aspx</link><pubDate>Sun, 18 Nov 2007 15:54:00 GMT</pubDate><guid isPermaLink="false">1b90d1c1-04e6-45b0-b51d-b665527d49b9:19803</guid><dc:creator>MattWard</dc:creator><slash:comments>0</slash:comments><wfw:commentRss xmlns:wfw="http://wellformedweb.org/CommentAPI/">http://community.sharpdevelop.net/blogs/mattward/rsscomments.aspx?PostID=19803</wfw:commentRss><wfw:comment xmlns:wfw="http://wellformedweb.org/CommentAPI/">http://community.sharpdevelop.net/blogs/mattward/commentapi.aspx?PostID=19803</wfw:comment><comments>http://community.sharpdevelop.net/blogs/mattward/archive/2007/11/18/IronPythonAddInInternals.aspx#comments</comments><description>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;</description><enclosure url="http://community.sharpdevelop.net/blogs/mattward/attachment/19803.ashx" length="741997" type="application/zip" /><category domain="http://community.sharpdevelop.net/blogs/mattward/archive/tags/Python/default.aspx">Python</category></item><item><title>IronPython Integration In SharpDevelop 2.2</title><link>http://community.sharpdevelop.net/blogs/mattward/archive/2007/10/21/IronPythonIntegrationInSharpDevelop22.aspx</link><pubDate>Sun, 21 Oct 2007 16:02:00 GMT</pubDate><guid isPermaLink="false">1b90d1c1-04e6-45b0-b51d-b665527d49b9:19421</guid><dc:creator>MattWard</dc:creator><slash:comments>10</slash:comments><wfw:commentRss xmlns:wfw="http://wellformedweb.org/CommentAPI/">http://community.sharpdevelop.net/blogs/mattward/rsscomments.aspx?PostID=19421</wfw:commentRss><wfw:comment xmlns:wfw="http://wellformedweb.org/CommentAPI/">http://community.sharpdevelop.net/blogs/mattward/commentapi.aspx?PostID=19421</wfw:comment><comments>http://community.sharpdevelop.net/blogs/mattward/archive/2007/10/21/IronPythonIntegrationInSharpDevelop22.aspx#comments</comments><description>&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;</description><enclosure url="http://community.sharpdevelop.net/blogs/mattward/attachment/19421.ashx" length="558193" type="application/zip" /><category domain="http://community.sharpdevelop.net/blogs/mattward/archive/tags/Python/default.aspx">Python</category></item><item><title>New Features in SharpDevelop 2.1</title><link>http://community.sharpdevelop.net/blogs/mattward/archive/2007/03/05/NewFeaturesInSharpDevelop21.aspx</link><pubDate>Mon, 05 Mar 2007 18:27:00 GMT</pubDate><guid isPermaLink="false">1b90d1c1-04e6-45b0-b51d-b665527d49b9:15586</guid><dc:creator>MattWard</dc:creator><slash:comments>6</slash:comments><wfw:commentRss xmlns:wfw="http://wellformedweb.org/CommentAPI/">http://community.sharpdevelop.net/blogs/mattward/rsscomments.aspx?PostID=15586</wfw:commentRss><wfw:comment xmlns:wfw="http://wellformedweb.org/CommentAPI/">http://community.sharpdevelop.net/blogs/mattward/commentapi.aspx?PostID=15586</wfw:comment><comments>http://community.sharpdevelop.net/blogs/mattward/archive/2007/03/05/NewFeaturesInSharpDevelop21.aspx#comments</comments><description>&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;</description></item><item><title>Creating an Installer with SharpDevelop</title><link>http://community.sharpdevelop.net/blogs/mattward/archive/2007/01/08/CreatingAnInstallerWithSharpDevelop.aspx</link><pubDate>Mon, 08 Jan 2007 21:30:00 GMT</pubDate><guid isPermaLink="false">1b90d1c1-04e6-45b0-b51d-b665527d49b9:14533</guid><dc:creator>MattWard</dc:creator><slash:comments>0</slash:comments><wfw:commentRss xmlns:wfw="http://wellformedweb.org/CommentAPI/">http://community.sharpdevelop.net/blogs/mattward/rsscomments.aspx?PostID=14533</wfw:commentRss><wfw:comment xmlns:wfw="http://wellformedweb.org/CommentAPI/">http://community.sharpdevelop.net/blogs/mattward/commentapi.aspx?PostID=14533</wfw:comment><comments>http://community.sharpdevelop.net/blogs/mattward/archive/2007/01/08/CreatingAnInstallerWithSharpDevelop.aspx#comments</comments><description>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;</description><category domain="http://community.sharpdevelop.net/blogs/mattward/archive/tags/WiX/default.aspx">WiX</category></item></channel></rss>