hits counter

Compiling .NET 1.1 Projects In Visual Studio 2008

After having put my .NET 1.1 application running on the .NET 2.0 runtime (^), I’m planning on migrating it to .NET 2.0, but not all at once.

Because I don’t want to have 2 solutions (one on Visual Studio 2003 for the .NET 1.1 assemblies and another on Visual Studio 2008 for the .NET 2.0 assemblies) I decide to try using MSBee and have only one Visual Studio 2008 solution.

MSBee has a CodePlex project. You can download it from there or from Microsoft Downloads. Because the build on Microsoft Downloads seemed to be the most stable one, that was the one I downloaded and installed. The package comes with a Word document that explains all that needs to be done.

Before you can install and use MSBee you’ll need to install the .NET 1.1 SDK.

Having everything installed, I just opened the Visual Studio 2003 solution in Visual Studio 2008 and let it convert the solution and projects (near 30).

After the conversion, for building the projects with the .NET 1.1 C# compiler, the project files need to be edited to add the override the default targets with the MSBee ones by adding the MSBee imports after the default imports for the language:

<Import Project="$(MSBuildBinPath)\Microsoft.CSharp.targets" />
<Import Project="$(MSBuildExtensionsPath)\MSBee\MSBuildExtras.FX1_1.CSharp.targets" />

Another change needed (for Visual Studio 2008 - I don't know if it was needed for Visual Studio 2005) is the tools version. MSBee needs version 2.0. To change that you'll have to change the ToolsVersion attribute of the project’s root element:

<Project DefaultTargets="Build" ToolsVersion="2.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">

MSBee likes has own idea about output paths and I had set up custom output paths on my project. There’s information about this on the documentation but I decided to simply comment that out of the $(MSBuildExtensionsPath)\MSBee\MSBuildExtras.FX1_1.Common.targets file:

<!-- Paulo
<Choose>
  <When Condition=" '$(BaseFX1_1OutputPath)' == '' ">
    <PropertyGroup>
      <OutputPath>bin\FX1_1\</OutputPath>
    </PropertyGroup>
  </When>
  <Otherwise>
    <PropertyGroup>
      <OutputPath>$(BaseFX1_1OutputPath)</OutputPath>
      <OutputPath Condition=" !HasTrailingSlash('$(OutputPath)') ">$(OutputPath)\</OutputPath>
    </PropertyGroup>
  </Otherwise>
</Choose>
-->

<!-- Paulo
<PropertyGroup>
  <BaseIntermediateOutputPath>obj\FX1_1\</BaseIntermediateOutputPath>
  <IntermediateOutputPath Condition=" '$(PlatformName)' == 'AnyCPU' ">$(BaseIntermediateOutputPath)$(Configuration)\</IntermediateOutputPath>
  <IntermediateOutputPath Condition=" '$(PlatformName)' != 'AnyCPU' ">$(BaseIntermediateOutputPath)$(PlatformName)\$(Configuration)\</IntermediateOutputPath>

  <OutputPath Condition=" '$(PlatformName)' == 'AnyCPU' ">$(OutputPath)$(Configuration)\</OutputPath>
  <OutputPath Condition=" '$(PlatformName)' != 'AnyCPU' ">$(OutputPath)$(PlatformName)\$(Configuration)\</OutputPath>
  
  <- Once OutputPath is determined, set OutDir to its value. ->
  <OutDir>$(OutputPath)</OutDir>
</PropertyGroup>
-->

This all seemed to work fine on my old Windows XP machine without any third party Visual Studio plug-ins, but when I tried it on my Windows Vista X64 machine, I came across some problems:

  • License Compiler
    <p align="justify">Because I'm using <a title="Infragistics - User Interface Components" href="http://www.infragistics.com/" target="_blank">Infragistics</a>' controls, there's a licences.licx file and the build will compile it. And that proved to be a problem.</p>
    
    <p align="justify">MSBee copies all the files it needs to the build process to a temporary folder, builds it in there and then copies the result to the output path.</p>
    
    <p align="justify">LC.exe seemed to never be able to find all the assemblies it needed. Searching seemed to me to be an old issue (even from the .NET 1.1 times) and the solution always pointed to not compile the license file. So, I commented that part out of the <span style="font-family: consolas, &#39;Courier New&#39;, courier, monospace">$(MSBuildExtensionsPath)\MSBee\MSBuildExtras.FX1_1.Common.targets</span> file:</p>
    
    <pre style="font-family: consolas, &#39;Courier New&#39;, courier, monospace; overflow: auto" class="code"><span style="color: blue">&lt;</span><span style="color: #a31515">Target
    </span><span style="color: red">Name</span><span style="color: blue">=</span>&quot;<span style="color: blue">CompileLicxFiles</span>&quot;&#160; <span style="color: red">Condition</span><span style="color: blue">=</span>&quot;<span style="color: blue">'@(_LicxFile)'!=''</span>&quot;
    <span style="color: red">DependsOnTargets</span><span style="color: blue">=</span>&quot;<span style="color: blue">$(CompileLicxFilesDependsOn)</span>&quot;
    <span style="color: red">Inputs</span><span style="color: blue">=</span>&quot;<span style="color: blue">$(MSBuildAllProjects);@(_LicxFile);@(ReferencePath);@(ReferenceDependencyPaths)</span>&quot;
    <span style="color: red">Outputs</span><span style="color: blue">=</span>&quot;<span style="color: blue">$(IntermediateOutputPath)$(TargetFileName).licenses</span>&quot;<span style="color: blue">&gt;
    

    <!-- <LC Sources="@(_LicxFile)" LicenseTarget="$(TargetFileName)" OutputDirectory="$(IntermediateOutputPath)" OutputLicense="$(IntermediateOutputPath)$(TargetFileName).licenses" ReferencedAssemblies="@(ReferencePath);@(ReferenceDependencyPaths)" ToolPath="$(TargetFrameworkSDKDirectory)bin&quot;>

    &lt;Output TaskParameter=&quot;OutputLicense&quot; ItemName=&quot;CompiledLicenseFile&quot;/&gt;
    &lt;Output TaskParameter=&quot;OutputLicense&quot; ItemName=&quot;FileWrites&quot;/&gt;
    

    </LC> --> </Target>

  • Resource Generator
    <p align="justify">Although this worked fine on the command line, inside <strong>Visual Studio</strong> <span style="font-family: consolas, &#39;Courier New&#39;, courier, monospace">ResGen.exe</span> would throw some error and needed to be closed.</p>
    
    <p align="justify">Looking at the <a title="Windows Application Log" href="http://technet.microsoft.com/library/ms157312.aspx" target="_blank">Windows Application Log</a> I found out this:</p>
    
    <div align="justify">
      <p style="font-family: consolas, &#39;Courier New&#39;, courier, monospace; overflow: auto" class="code">Faulting application Resgen.exe, version 1.1.4322.573, time stamp 0x3e559b5f, faulting module MockWeaver.dll, version 0.0.0.0, time stamp 0x4adb072e, exception code 0xc0000005, fault offset 0x00018fac, process id 0x4a50, application start time 0x01ca53c14488a2fb. </p>
    </div>
    
    <p align="justify"><strong>MockWeaver.dll</strong> belongs to <a title="Typemock Isolator - Isolate any .NET dependencies to make unit testing easy" href="http://www.typemock.com/" target="_blank">Isolator</a> and I just disable it when building inside <strong>Visual Studio</strong>. I was hoping to start using Isolator on this project, but, for now, I can't.</p>
    

I hope this can be of some help and, if you need more, you’ll probably find it at the MSBee’s CodePlex forum.

The bottom line is: You don’t need Visual Studio 2003!

No Comments