Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Compilation fails with sln file loaded with Roslyn, but compiles in Visual Studio

I'm making a tool, and using Roslyn to load a solution file and then to get the compilation for the contained projects.

But some errors arise (5000+)... these are few of them:

  • CS0518: Predefined type 'System.String' is not defined or imported
  • CS0246: The type or namespace name 'System' could not be found (are you missing a using directive or an assembly reference?)

The following code has got two tries:

  • #1 - trying to compile right away - what I tried in a first moment... this one has got 5000+ errors
  • #2 - compiling adding system references - what I tried to make it work, and it did work... but not as expected

The code:

var workspace = MSBuildWorkspace.Create();
var solution = await workspace.OpenSolutionAsync(@"C:\Projects\MyLib\MyLib.sln");

var sortedProject = solution
    .GetProjectDependencyGraph()
    .GetTopologicallySortedProjects()
    .Select(solution.GetProject);

foreach (var project in sortedProject)
{
    // 
    // #1 - trying to compile right away
    //
    var compilation1 = await project.GetCompilationAsync();
    var diag1 = compilation1.GetDiagnostics();

    // 
    // #2 - compiling adding system references
    // 
    var assemblyPath = Path.GetDirectoryName(typeof(object).Assembly.Location);
    var project2 = project.AddMetadataReferences(
        new[]
                    {
                        MetadataReference.CreateFromFile(
                            Path.Combine(assemblyPath, "mscorlib.dll")),
                        MetadataReference.CreateFromFile(
                            Path.Combine(assemblyPath, "System.dll")),
                        MetadataReference.CreateFromFile(
                            Path.Combine(assemblyPath, "System.Core.dll")),
                    });

    var compilation2 = await project2.GetCompilationAsync();
    var diag2 = compilation2.GetDiagnostics();
}

Roslyn version being used: 1.0.0.0-beta2

The question is:

Since I have loaded a valid solution file, saved with Visual Studio 2012, targeting .Net Framework v4.5 and compiling with success in the IDE... why do I have to add system references to make it work?.

I expected it to come with the references already... the system references to the correct .Net Framework version. It means that even #2 won't work always, because I'd have to locate the correct .Net Framework version files, instead of using the ones of the tool I am currently compiling.

EDIT

Here is the csproj file contents:

<?xml version="1.0" encoding="utf-8"?>
<Project ToolsVersion="4.0" DefaultTargets="Build" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
  <Import Project="$(MSBuildExtensionsPath)\$(MSBuildToolsVersion)\Microsoft.Common.props" Condition="Exists('$(MSBuildExtensionsPath)\$(MSBuildToolsVersion)\Microsoft.Common.props')" />
  <PropertyGroup>
    <Configuration Condition=" '$(Configuration)' == '' ">Debug</Configuration>
    <Platform Condition=" '$(Platform)' == '' ">AnyCPU</Platform>
    <ProjectGuid>{E8757858-B17B-43D4-AA13-412E552386DC}</ProjectGuid>
    <OutputType>Library</OutputType>
    <AppDesignerFolder>Properties</AppDesignerFolder>
    <RootNamespace>DataStructures</RootNamespace>
    <AssemblyName>DataStructures</AssemblyName>
    <TargetFrameworkVersion>v4.5</TargetFrameworkVersion>
    <FileAlignment>512</FileAlignment>
    <SolutionDir Condition="$(SolutionDir) == '' Or $(SolutionDir) == '*Undefined*'">..\</SolutionDir>
    <RestorePackages>true</RestorePackages>
  </PropertyGroup>
  <PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Debug|AnyCPU' ">
    <DebugSymbols>true</DebugSymbols>
    <DebugType>full</DebugType>
    <Optimize>false</Optimize>
    <OutputPath>bin\Debug.net45\</OutputPath>
    <DefineConstants>TRACE;DEBUG;net45</DefineConstants>
    <ErrorReport>prompt</ErrorReport>
    <WarningLevel>4</WarningLevel>
  </PropertyGroup>
  <PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Release|AnyCPU' ">
    <DebugType>pdbonly</DebugType>
    <Optimize>true</Optimize>
    <OutputPath>bin\Release.net45\</OutputPath>
    <DefineConstants>TRACE;net45</DefineConstants>
    <ErrorReport>prompt</ErrorReport>
    <WarningLevel>4</WarningLevel>
    <DocumentationFile>bin\Release.net45\DataStructures.XML</DocumentationFile>
  </PropertyGroup>
  <PropertyGroup>
    <SignAssembly>true</SignAssembly>
  </PropertyGroup>
  <PropertyGroup>
    <AssemblyOriginatorKeyFile>masb.public.snk</AssemblyOriginatorKeyFile>
  </PropertyGroup>
  <ItemGroup>
    <Reference Include="System" />
    <Reference Include="System.Core" />
    <Reference Include="System.Xml.Linq" />
    <Reference Include="System.Data.DataSetExtensions" />
    <Reference Include="Microsoft.CSharp" />
    <Reference Include="System.Data" />
    <Reference Include="System.Xml" />
  </ItemGroup>
  <ItemGroup>
    <Compile Include="Continuous\ContinuousSet.cs" />
    <Compile Include="Continuous\ContinuousSetEqualityComparer.cs" />
    <Compile Include="Continuous\Interval.cs" />
    <Compile Include="Continuous\ISetOperator.cs" />
    <Compile Include="Continuous\PointState.cs" />
    <Compile Include="Continuous\RedundancyType.cs" />
    <Compile Include="EnumerableExtensions.cs" />
    <Compile Include="DictionaryExtensions.cs" />
    <Compile Include="IImmutable.cs" />
    <Compile Include="IImmutablePrototype.cs" />
    <Compile Include="Immutable\FuncCached.cs" />
    <Compile Include="Immutable\IImmutableSpecificTreeBuilderWithContext.cs" />
    <Compile Include="Immutable\IImmutableTreeBuilderWithContext.cs" />
    <Compile Include="Immutable\IMayBeImmutable.cs" />
    <Compile Include="Immutable\ImmutableSpecificTreeBuilderWithContext.cs" />
    <Compile Include="Immutable\ImmutableTreeBuilderWithContext.cs" />
    <Compile Include="Immutable\ImmutableTreeBuilderWithContextExtensions.cs" />
    <Compile Include="Immutable\IReadableForest.cs" />
    <Compile Include="Immutable\IImmutableSpecificTreeBuilder.cs" />
    <Compile Include="Immutable\IImmutableTreeBuilder.cs" />
    <Compile Include="Immutable\ImmutableCollection.cs" />
    <Compile Include="Immutable\ImmutableForestExtensions.cs" />
    <Compile Include="Immutable\ImmutableSpecificTreeBuilder.cs" />
    <Compile Include="Immutable\ImmutableTreeBuilder.cs" />
    <Compile Include="Immutable\ImmutableTreeBuilderExtensions.cs" />
    <Compile Include="Immutable\TreeBuildingContextBase.cs" />
    <Compile Include="Immutable\TreeBuildingContext.cs" />
    <Compile Include="Immutable\Tree\Branch.cs" />
    <Compile Include="Immutable\Tree\INodeFactory.cs" />
    <Compile Include="Immutable\Tree\INonRoot.cs" />
    <Compile Include="Immutable\Tree\Node.cs" />
    <Compile Include="Immutable\ImmutableForest.cs" />
    <Compile Include="Immutable\Tree\IBranch.cs" />
    <Compile Include="Immutable\Tree\ILeaf.cs" />
    <Compile Include="Immutable\Tree\INode.cs" />
    <Compile Include="Immutable\Tree\IRoot.cs" />
    <Compile Include="Immutable\Tree\Leaf.cs" />
    <Compile Include="Immutable\Tree\NodeExtensions.cs" />
    <Compile Include="Immutable\Tree\NonRoot.cs" />
    <Compile Include="Immutable\Tree\Root.cs" />
    <Compile Include="Immutable\Tree\RootBranch.cs" />
    <Compile Include="Immutable\Tree\RootLeaf.cs" />
    <Compile Include="Immutable\ImmutableTree.cs" />
    <Compile Include="Immutable\Tree\Visitor.cs" />
    <Compile Include="JetBrains.Annotations\JetBrains.Annotations.cs" />
    <Compile Include="Monads\IOption.cs" />
    <Compile Include="Monads\None.cs" />
    <Compile Include="Monads\OptionExtensions.cs" />
    <Compile Include="Monads\Some.cs" />
    <Compile Include="Properties\AssemblyInfo.cs" />
    <Compile Include="SystemExtensions\ObjectExtensions.cs" />
  </ItemGroup>
  <ItemGroup>
    <None Include="masb.public.snk" />
  </ItemGroup>
  <Import Project="$(MSBuildToolsPath)\Microsoft.CSharp.targets" />
  <Import Project="$(SolutionDir)\.nuget\NuGet.targets" Condition="Exists('$(SolutionDir)\.nuget\NuGet.targets')" />
  <Target Name="EnsureNuGetPackageBuildImports" BeforeTargets="PrepareForBuild">
    <PropertyGroup>
      <ErrorText>This project references NuGet package(s) that are missing on this computer. Enable NuGet Package Restore to download them.  For more information, see http://go.microsoft.com/fwlink/?LinkID=322105. The missing file is {0}.</ErrorText>
    </PropertyGroup>
    <Error Condition="!Exists('$(SolutionDir)\.nuget\NuGet.targets')" Text="$([System.String]::Format('$(ErrorText)', '$(SolutionDir)\.nuget\NuGet.targets'))" />
  </Target>
  <!-- To modify your build process, add your task inside one of the targets below and uncomment it. 
       Other similar extension points exist, see Microsoft.Common.targets.
  <Target Name="BeforeBuild">
  </Target>
  <Target Name="AfterBuild">
  </Target>
  -->
</Project>
like image 578
Miguel Angelo Avatar asked Feb 08 '15 02:02

Miguel Angelo


1 Answers

I finally found an answer... I was using .Net Framework 4.6 preview to make the tool.

I uninstalled Visual Studio 2015 already, but not the framework 4.6.

So I mistakenly used it when creating the tool project, by selecting the .Net framework 4.5.3 in Visual Studio 2013 (it appears inside VS2013 after installing VS2015 CTP).

By switching the framework to 4.5 it works and loads the MetadataReferences correctly.

like image 118
Miguel Angelo Avatar answered Nov 08 '22 03:11

Miguel Angelo