<?xml version="1.0" encoding="utf-8"?>
<rss xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:pingback="http://madskills.com/public/xml/rss/module/pingback/" xmlns:trackback="http://madskills.com/public/xml/rss/module/trackback/" xmlns:wfw="http://wellformedweb.org/CommentAPI/" xmlns:slash="http://purl.org/rss/1.0/modules/slash/" xmlns:dc="http://purl.org/dc/elements/1.1/" version="2.0">
  <channel>
    <title>Sayed Ibrahim Hashimi - MSBuild, Web Deploy (MSDeploy), ASP.NET - Visual</title>
    <link>http://sedodream.com/</link>
    <description>MSBuild, C#, Visual Studio and more</description>
    <language>en-us</language>
    <copyright>Sayed Ibrahim Hashimi</copyright>
    <lastBuildDate>Fri, 19 Mar 2010 04:16:06 GMT</lastBuildDate>
    <generator>newtelligence dasBlog 2.3.9074.18820</generator>
    <managingEditor>sayed.hashimi@gmail.com</managingEditor>
    <webMaster>sayed.hashimi@gmail.com</webMaster>
    <item>
      <trackback:ping>http://sedodream.com/Trackback.aspx?guid=451c1d2e-3949-4e56-b226-14108cc5d184</trackback:ping>
      <pingback:server>http://sedodream.com/pingback.aspx</pingback:server>
      <pingback:target>http://sedodream.com/PermaLink,guid,451c1d2e-3949-4e56-b226-14108cc5d184.aspx</pingback:target>
      <dc:creator>Ibrahim</dc:creator>
      <wfw:comment>http://sedodream.com/CommentView,guid,451c1d2e-3949-4e56-b226-14108cc5d184.aspx</wfw:comment>
      <wfw:commentRss>http://sedodream.com/SyndicationService.asmx/GetEntryCommentsRss?guid=451c1d2e-3949-4e56-b226-14108cc5d184</wfw:commentRss>
      <body xmlns="http://www.w3.org/1999/xhtml">
        <p>
I recently answered a question on stackoverflow.com <a href="http://stackoverflow.com/questions/2472183/replace-sln-with-msbuild-and-wrap-contained-projects-into-targets">Replace
.sln with MSBuild and wrap contained projects into targets</a> and wanted to share
that content here as well. I’ll expand a bit more on it here.
</p>
        <p>
A couple common questions that I’m frequently asked include
</p>
        <ol>
          <li>
Should I use solution files for public builds 
</li>
          <li>
How can I replace a solution file with an MSBuild file 
</li>
        </ol>
        <p>
My answer for 1 is that I never use .sln files for any public build. I always create
my own build file and use that. My take on solution files is that they are for developer
convince for use in Visual Studio only. If you disagree, you are not alone.
</p>
        <p>
Replacing a solution file with an MSBuild file is pretty easy, you just create an
MSBuild file to build your projects. You will do that by using the <a href="http://msdn.microsoft.com/en-us/library/z7f65y0d.aspx">MSBuild
task</a>. Now if you want to create a reusable .targets file (or set of .targets files)
then this is a bit more involved, but makes it easier on you in the long haul.
</p>
        <p>
I wrote about 20 pages on creating reusable .targets files in my <a href="http://rads.stackoverflow.com/amzn/click/0735626286">book</a>,
but I'll get you started here with the basics here. I believe that the key to creating
reusable build scripts (i.e. .targets files) is three elements:
</p>
        <ul>
          <li>
Place behavior (<em>i.e. targets</em>) into separate files 
</li>
          <li>
Place data (<em>i.e. properties and items, these are called .proj files</em>) into
their own files 
</li>
          <li>
Extensibility 
</li>
          <li>
.targets files should validate assumptions 
</li>
        </ul>
        <p>
The idea is that you want to place all of your targets into separate files and then
these files will be imported by the files which will be driving the build process.
These are the files which contain the data. Since you import the .targets files you
get all the targets as if they had been defined inline. There will be a silent contract
between the .proj and .targets files. This contract is defined in properties and items
which both use. This is what needs to be validated.
</p>
        <p>
The idea here is not new. This pattern is followed by .csproj (and other projects
generated by Visual Studio). If you take a look your .csproj file you will not find
a single target, just properties and items. Then towards the bottom of the file it
imports Microsoft.csharp.targets (<em>may differ depending on project type</em>).
This project file (<em>along with others that it imports</em>) contains all the targets
which actually perform the build.
</p>
        <p>
So it's layed out like this:
</p>
        <ul>
          <li>
SharedBuild.targets 
</li>
          <li>
MyProduct.proj 
</li>
        </ul>
        <p>
Where <strong>MyProdcut.proj</strong> might look like:
</p>
        <pre class="brush: xml;">&lt;?xml version="1.0" encoding="utf-8"?&gt;
&lt;Project DefaultTargets="Build" xmlns="http://schemas.microsoft.com/developer/msbuild/2003"&gt;
  &lt;!-- This uses a .targets file to off load performing the build --&gt;
  &lt;PropertyGroup&gt;
    &lt;Configuration Condition=" '$(Configuration)'=='' "&gt;Release&lt;/Configuration&gt;
    &lt;OutputPath Condition=" '$(OutputPath)'=='' "&gt;$(MSBuildProjectDirectory)\BuildArtifacts\bin\&lt;/OutputPath&gt;
  &lt;/PropertyGroup&gt;

  &lt;ItemGroup&gt;
    &lt;Projects Include="$(MSBuildProjectDirectory)\..\ClassLibrary1\ClassLibrary1.csproj"/&gt;
    &lt;Projects Include="$(MSBuildProjectDirectory)\..\ClassLibrary2\ClassLibrary2.csproj"/&gt;
    &lt;Projects Include="$(MSBuildProjectDirectory)\..\ClassLibrary3\ClassLibrary3.csproj"/&gt;
    &lt;Projects Include="$(MSBuildProjectDirectory)\..\WindowsFormsApplication1\WindowsFormsApplication1.csproj"/&gt;
  &lt;/ItemGroup&gt;

  &lt;Import Project="SharedBuild.targets"/&gt;
&lt;/Project&gt;</pre>
        <p>
And <strong>SharedBuild.targets</strong> might look like:
</p>
        <pre class="brush: xml;">&lt;Project  DefaultTargets="Build" xmlns="http://schemas.microsoft.com/developer/msbuild/2003"&gt;
  &lt;!-- This represents a re-usable build file --&gt;
  &lt;Target Name="SharedBuild_Validate"&gt;
    &lt;!-- See http://sedodream.com/2009/06/30/ElementsOfReusableMSBuildScriptsValidation.aspx for more info
         about this validation pattern
    --&gt;
    &lt;ItemGroup&gt;
      &lt;_RequiredProperties Include ="Configuration"&gt;
          &lt;Value&gt;$(Configuration)&lt;/Value&gt;
      &lt;/_RequiredProperties&gt;    
      &lt;_RequiredProperties Include ="OutputPath"&gt;
          &lt;Value&gt;$(OutputPath)&lt;/Value&gt;
      &lt;/_RequiredProperties&gt;
      
      &lt;_RequiredItems Include="Projects"&gt;
        &lt;RequiredValue&gt;%(Projects.Identity)&lt;/RequiredValue&gt;
        &lt;RequiredFilePath&gt;%(Projects.Identity)&lt;/RequiredFilePath&gt;
      &lt;/_RequiredItems&gt;
    &lt;/ItemGroup&gt;

    &lt;!-- Raise an error if any value in _RequiredProperties is missing --&gt;
    &lt;Error Condition="'%(_RequiredProperties.Value)'==''"
           Text="Missing required property [%(_RequiredProperties.Identity)]"/&gt;

    &lt;!-- Raise an error if any value in _RequiredItems is empty --&gt;
    &lt;Error Condition="'%(_RequiredItems.RequiredValue)'==''"
           Text="Missing required item value [%(_RequiredItems.Identity)]" /&gt;

    &lt;!-- Validate any file/directory that should exist --&gt;
    &lt;Error Condition="'%(_RequiredItems.RequiredFilePath)' != '' and !Exists('%(_RequiredItems.RequiredFilePath)')"
           Text="Unable to find expeceted path [%(_RequiredItems.RequiredFilePath)] on item [%(_RequiredItems.Identity)]" /&gt;
  &lt;/Target&gt;

  &lt;PropertyGroup&gt;
    &lt;BuildDependsOn&gt;
      SharedBuild_Validate;
      BeforeBuild;
      CoreBuild;
      AfterBuild;
    &lt;/BuildDependsOn&gt;
  &lt;/PropertyGroup&gt;
  &lt;Target Name="Build" DependsOnTargets="$(BuildDependsOn)"/&gt;
  &lt;Target Name="BeforeBuild"/&gt;
  &lt;Target Name="AfterBuild"/&gt;
  &lt;Target Name="CoreBuild"&gt;
    &lt;!-- Make sure output folder exists --&gt;
    &lt;PropertyGroup&gt;
      &lt;_FullOutputPath&gt;$(OutputPath)$(Configuration)\&lt;/_FullOutputPath&gt;
    &lt;/PropertyGroup&gt;
    &lt;MakeDir Directories="$(_FullOutputPath)"/&gt;
    &lt;MSBuild Projects="@(Projects)"
             BuildInParallel="true"
             Properties="OutputPath=$(_FullOutputPath)"/&gt;
  &lt;/Target&gt;
&lt;/Project&gt;</pre>
        <p>
Don't look too much at the <code>SharedBuild_Validate</code> target yet. I put that
there for completeness but don't focus on it. You can find more info on that at my
blog at <a href="http://sedodream.com/2009/06/30/ElementsOfReusableMSBuildScriptsValidation.aspx">http://sedodream.com/2009/06/30/ElementsOfReusableMSBuildScriptsValidation.aspx</a>.
</p>
        <p>
The important parts to notice are the extensibility points. Even though this is a
very basic file, it has all the components of a reusable .targets file. You can customize
it's behavior by passing in different properties and items to build. You can extend
it's behavior by overriding a target (<code>BeforeBuild</code>, <code>AfterBuild</code> or
even <code>CoreBuild</code>) and you can inject your own targets into the build with:
</p>
        <pre class="brush: xml;">&lt;Project ...&gt;
   ...
  &lt;Import Project="SharedBuild.targets"/&gt;
  &lt;PropertyGroup&gt;
    &lt;BuildDependsOn&gt;
      $(BuildDependsOn);
      CustomAfterBuild
    &lt;/BuildDependsOn&gt;
  &lt;/PropertyGroup&gt;
  &lt;Target Name="CustomAfterBuild"&gt;
    &lt;!-- Insert stuff here --&gt;
  &lt;/Target&gt;
&lt;/Project&gt;</pre>
        <p>
So this is the basics on how to create reusable build scripts which can help you easily
create .proj files to replace your .sln files. I also recently answered. a related
question <a href="http://stackoverflow.com/questions/2454663/make-a-target-run-once-at-the-solution-level-in-msbuild">Make
a target run once at the Solution level in MSBuild</a>. 
</p>
        <p align="left">
          <font size="3">This samples for this are using <strong><u>Visual Studio 2010 RC</u></strong> You
can download the samples for this at </font>
          <a title="http://sedotech.com/Content/files/ReplaceSlnFile.zip" href="http://sedotech.com/Content/files/ReplaceSlnFile.zip">
            <font size="3">http://sedotech.com/Content/files/ReplaceSlnFile.zip</font>
          </a>
          <font size="3">
          </font>
        </p>
        <p>
Sayed Ibrahim Hashimi
</p>
      </body>
      <title>Replacing solution files with MSBuild Files</title>
      <guid isPermaLink="false">http://sedodream.com/PermaLink,guid,451c1d2e-3949-4e56-b226-14108cc5d184.aspx</guid>
      <link>http://sedodream.com/2010/03/19/ReplacingSolutionFilesWithMSBuildFiles.aspx</link>
      <pubDate>Fri, 19 Mar 2010 04:16:06 GMT</pubDate>
      <description>&lt;p&gt;
I recently answered a question on stackoverflow.com &lt;a href="http://stackoverflow.com/questions/2472183/replace-sln-with-msbuild-and-wrap-contained-projects-into-targets"&gt;Replace
.sln with MSBuild and wrap contained projects into targets&lt;/a&gt; and wanted to share
that content here as well. I’ll expand a bit more on it here.
&lt;/p&gt;
&lt;p&gt;
A couple common questions that I’m frequently asked include
&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;
Should I use solution files for public builds 
&lt;/li&gt;
&lt;li&gt;
How can I replace a solution file with an MSBuild file 
&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;
My answer for 1 is that I never use .sln files for any public build. I always create
my own build file and use that. My take on solution files is that they are for developer
convince for use in Visual Studio only. If you disagree, you are not alone.
&lt;/p&gt;
&lt;p&gt;
Replacing a solution file with an MSBuild file is pretty easy, you just create an
MSBuild file to build your projects. You will do that by using the &lt;a href="http://msdn.microsoft.com/en-us/library/z7f65y0d.aspx"&gt;MSBuild
task&lt;/a&gt;. Now if you want to create a reusable .targets file (or set of .targets files)
then this is a bit more involved, but makes it easier on you in the long haul.
&lt;/p&gt;
&lt;p&gt;
I wrote about 20 pages on creating reusable .targets files in my &lt;a href="http://rads.stackoverflow.com/amzn/click/0735626286"&gt;book&lt;/a&gt;,
but I'll get you started here with the basics here. I believe that the key to creating
reusable build scripts (i.e. .targets files) is three elements:
&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;
Place behavior (&lt;em&gt;i.e. targets&lt;/em&gt;) into separate files 
&lt;/li&gt;
&lt;li&gt;
Place data (&lt;em&gt;i.e. properties and items, these are called .proj files&lt;/em&gt;) into
their own files 
&lt;/li&gt;
&lt;li&gt;
Extensibility 
&lt;/li&gt;
&lt;li&gt;
.targets files should validate assumptions 
&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;
The idea is that you want to place all of your targets into separate files and then
these files will be imported by the files which will be driving the build process.
These are the files which contain the data. Since you import the .targets files you
get all the targets as if they had been defined inline. There will be a silent contract
between the .proj and .targets files. This contract is defined in properties and items
which both use. This is what needs to be validated.
&lt;/p&gt;
&lt;p&gt;
The idea here is not new. This pattern is followed by .csproj (and other projects
generated by Visual Studio). If you take a look your .csproj file you will not find
a single target, just properties and items. Then towards the bottom of the file it
imports Microsoft.csharp.targets (&lt;em&gt;may differ depending on project type&lt;/em&gt;).
This project file (&lt;em&gt;along with others that it imports&lt;/em&gt;) contains all the targets
which actually perform the build.
&lt;/p&gt;
&lt;p&gt;
So it's layed out like this:
&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;
SharedBuild.targets 
&lt;/li&gt;
&lt;li&gt;
MyProduct.proj 
&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;
Where &lt;strong&gt;MyProdcut.proj&lt;/strong&gt; might look like:
&lt;/p&gt;
&lt;pre class="brush: xml;"&gt;&amp;lt;?xml version=&amp;quot;1.0&amp;quot; encoding=&amp;quot;utf-8&amp;quot;?&amp;gt;
&amp;lt;Project DefaultTargets=&amp;quot;Build&amp;quot; xmlns=&amp;quot;http://schemas.microsoft.com/developer/msbuild/2003&amp;quot;&amp;gt;
  &amp;lt;!-- This uses a .targets file to off load performing the build --&amp;gt;
  &amp;lt;PropertyGroup&amp;gt;
    &amp;lt;Configuration Condition=&amp;quot; '$(Configuration)'=='' &amp;quot;&amp;gt;Release&amp;lt;/Configuration&amp;gt;
    &amp;lt;OutputPath Condition=&amp;quot; '$(OutputPath)'=='' &amp;quot;&amp;gt;$(MSBuildProjectDirectory)\BuildArtifacts\bin\&amp;lt;/OutputPath&amp;gt;
  &amp;lt;/PropertyGroup&amp;gt;

  &amp;lt;ItemGroup&amp;gt;
    &amp;lt;Projects Include=&amp;quot;$(MSBuildProjectDirectory)\..\ClassLibrary1\ClassLibrary1.csproj&amp;quot;/&amp;gt;
    &amp;lt;Projects Include=&amp;quot;$(MSBuildProjectDirectory)\..\ClassLibrary2\ClassLibrary2.csproj&amp;quot;/&amp;gt;
    &amp;lt;Projects Include=&amp;quot;$(MSBuildProjectDirectory)\..\ClassLibrary3\ClassLibrary3.csproj&amp;quot;/&amp;gt;
    &amp;lt;Projects Include=&amp;quot;$(MSBuildProjectDirectory)\..\WindowsFormsApplication1\WindowsFormsApplication1.csproj&amp;quot;/&amp;gt;
  &amp;lt;/ItemGroup&amp;gt;

  &amp;lt;Import Project=&amp;quot;SharedBuild.targets&amp;quot;/&amp;gt;
&amp;lt;/Project&amp;gt;&lt;/pre&gt;
&lt;p&gt;
And &lt;strong&gt;SharedBuild.targets&lt;/strong&gt; might look like:
&lt;/p&gt;
&lt;pre class="brush: xml;"&gt;&amp;lt;Project  DefaultTargets=&amp;quot;Build&amp;quot; xmlns=&amp;quot;http://schemas.microsoft.com/developer/msbuild/2003&amp;quot;&amp;gt;
  &amp;lt;!-- This represents a re-usable build file --&amp;gt;
  &amp;lt;Target Name=&amp;quot;SharedBuild_Validate&amp;quot;&amp;gt;
    &amp;lt;!-- See http://sedodream.com/2009/06/30/ElementsOfReusableMSBuildScriptsValidation.aspx for more info
         about this validation pattern
    --&amp;gt;
    &amp;lt;ItemGroup&amp;gt;
      &amp;lt;_RequiredProperties Include =&amp;quot;Configuration&amp;quot;&amp;gt;
          &amp;lt;Value&amp;gt;$(Configuration)&amp;lt;/Value&amp;gt;
      &amp;lt;/_RequiredProperties&amp;gt;    
      &amp;lt;_RequiredProperties Include =&amp;quot;OutputPath&amp;quot;&amp;gt;
          &amp;lt;Value&amp;gt;$(OutputPath)&amp;lt;/Value&amp;gt;
      &amp;lt;/_RequiredProperties&amp;gt;
      
      &amp;lt;_RequiredItems Include=&amp;quot;Projects&amp;quot;&amp;gt;
        &amp;lt;RequiredValue&amp;gt;%(Projects.Identity)&amp;lt;/RequiredValue&amp;gt;
        &amp;lt;RequiredFilePath&amp;gt;%(Projects.Identity)&amp;lt;/RequiredFilePath&amp;gt;
      &amp;lt;/_RequiredItems&amp;gt;
    &amp;lt;/ItemGroup&amp;gt;

    &amp;lt;!-- Raise an error if any value in _RequiredProperties is missing --&amp;gt;
    &amp;lt;Error Condition=&amp;quot;'%(_RequiredProperties.Value)'==''&amp;quot;
           Text=&amp;quot;Missing required property [%(_RequiredProperties.Identity)]&amp;quot;/&amp;gt;

    &amp;lt;!-- Raise an error if any value in _RequiredItems is empty --&amp;gt;
    &amp;lt;Error Condition=&amp;quot;'%(_RequiredItems.RequiredValue)'==''&amp;quot;
           Text=&amp;quot;Missing required item value [%(_RequiredItems.Identity)]&amp;quot; /&amp;gt;

    &amp;lt;!-- Validate any file/directory that should exist --&amp;gt;
    &amp;lt;Error Condition=&amp;quot;'%(_RequiredItems.RequiredFilePath)' != '' and !Exists('%(_RequiredItems.RequiredFilePath)')&amp;quot;
           Text=&amp;quot;Unable to find expeceted path [%(_RequiredItems.RequiredFilePath)] on item [%(_RequiredItems.Identity)]&amp;quot; /&amp;gt;
  &amp;lt;/Target&amp;gt;

  &amp;lt;PropertyGroup&amp;gt;
    &amp;lt;BuildDependsOn&amp;gt;
      SharedBuild_Validate;
      BeforeBuild;
      CoreBuild;
      AfterBuild;
    &amp;lt;/BuildDependsOn&amp;gt;
  &amp;lt;/PropertyGroup&amp;gt;
  &amp;lt;Target Name=&amp;quot;Build&amp;quot; DependsOnTargets=&amp;quot;$(BuildDependsOn)&amp;quot;/&amp;gt;
  &amp;lt;Target Name=&amp;quot;BeforeBuild&amp;quot;/&amp;gt;
  &amp;lt;Target Name=&amp;quot;AfterBuild&amp;quot;/&amp;gt;
  &amp;lt;Target Name=&amp;quot;CoreBuild&amp;quot;&amp;gt;
    &amp;lt;!-- Make sure output folder exists --&amp;gt;
    &amp;lt;PropertyGroup&amp;gt;
      &amp;lt;_FullOutputPath&amp;gt;$(OutputPath)$(Configuration)\&amp;lt;/_FullOutputPath&amp;gt;
    &amp;lt;/PropertyGroup&amp;gt;
    &amp;lt;MakeDir Directories=&amp;quot;$(_FullOutputPath)&amp;quot;/&amp;gt;
    &amp;lt;MSBuild Projects=&amp;quot;@(Projects)&amp;quot;
             BuildInParallel=&amp;quot;true&amp;quot;
             Properties=&amp;quot;OutputPath=$(_FullOutputPath)&amp;quot;/&amp;gt;
  &amp;lt;/Target&amp;gt;
&amp;lt;/Project&amp;gt;&lt;/pre&gt;
&lt;p&gt;
Don't look too much at the &lt;code&gt;SharedBuild_Validate&lt;/code&gt; target yet. I put that
there for completeness but don't focus on it. You can find more info on that at my
blog at &lt;a href="http://sedodream.com/2009/06/30/ElementsOfReusableMSBuildScriptsValidation.aspx"&gt;http://sedodream.com/2009/06/30/ElementsOfReusableMSBuildScriptsValidation.aspx&lt;/a&gt;.
&lt;/p&gt;
&lt;p&gt;
The important parts to notice are the extensibility points. Even though this is a
very basic file, it has all the components of a reusable .targets file. You can customize
it's behavior by passing in different properties and items to build. You can extend
it's behavior by overriding a target (&lt;code&gt;BeforeBuild&lt;/code&gt;, &lt;code&gt;AfterBuild&lt;/code&gt; or
even &lt;code&gt;CoreBuild&lt;/code&gt;) and you can inject your own targets into the build with:
&lt;/p&gt;
&lt;pre class="brush: xml;"&gt;&amp;lt;Project ...&amp;gt;
   ...
  &amp;lt;Import Project=&amp;quot;SharedBuild.targets&amp;quot;/&amp;gt;
  &amp;lt;PropertyGroup&amp;gt;
    &amp;lt;BuildDependsOn&amp;gt;
      $(BuildDependsOn);
      CustomAfterBuild
    &amp;lt;/BuildDependsOn&amp;gt;
  &amp;lt;/PropertyGroup&amp;gt;
  &amp;lt;Target Name=&amp;quot;CustomAfterBuild&amp;quot;&amp;gt;
    &amp;lt;!-- Insert stuff here --&amp;gt;
  &amp;lt;/Target&amp;gt;
&amp;lt;/Project&amp;gt;&lt;/pre&gt;
&lt;p&gt;
So this is the basics on how to create reusable build scripts which can help you easily
create .proj files to replace your .sln files. I also recently answered. a related
question &lt;a href="http://stackoverflow.com/questions/2454663/make-a-target-run-once-at-the-solution-level-in-msbuild"&gt;Make
a target run once at the Solution level in MSBuild&lt;/a&gt;. 
&lt;/p&gt;
&lt;p align="left"&gt;
&lt;font size="3"&gt;This samples for this are using &lt;strong&gt;&lt;u&gt;Visual Studio 2010 RC&lt;/u&gt;&lt;/strong&gt; You
can download the samples for this at &lt;/font&gt;&lt;a title="http://sedotech.com/Content/files/ReplaceSlnFile.zip" href="http://sedotech.com/Content/files/ReplaceSlnFile.zip"&gt;&lt;font size="3"&gt;http://sedotech.com/Content/files/ReplaceSlnFile.zip&lt;/font&gt;&lt;/a&gt;&lt;font size="3"&gt; &lt;/font&gt;
&lt;/p&gt;
&lt;p&gt;
Sayed Ibrahim Hashimi
&lt;/p&gt;</description>
      <comments>http://sedodream.com/CommentView,guid,451c1d2e-3949-4e56-b226-14108cc5d184.aspx</comments>
      <category>MSBuild</category>
      <category>Visual</category>
      <category>Visual Studio</category>
      <category>Visual Studio 2010</category>
    </item>
  </channel>
</rss>