2015-02-08 9 views
6

Ich mache ein Werkzeug, und mit Roslyn, um eine Lösungsdatei zu laden und dann Holen Sie sich die Kompilation für die enthaltenen Projekte.Kompilierung fehlschlägt mit SLN-Datei mit Roslyn geladen, kompiliert aber in Visual Studio

Aber einige Fehler auftreten (5000 +) ... das sind einige von ihnen:

  • CS0518: Vordefinierte Typ 'System.String' ist nicht definiert oder importiert
  • CS0246: Der Typ oder Namespace Namen ‚System‘ konnte nicht gefunden werden (möglicherweise fehlt eine using-Direktive oder ein Assemblyverweis?)

Der folgende Code zwei Versuche bekommen hat:

  • # 1 - versuchen, sofort zu kompilieren - was ich in einem ersten Moment versuchte ... diese 5000+ Fehler
  • # 2 bekommen hat - Kompilieren Zugabe System verweist - was ich zu machen versucht, Arbeit und es hat funktioniert ... aber nicht

Der Code erwartet:

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 verwendet: 1.0.0.0-beta2

Die Frage ist:

Da ich eine gültige Lösung Datei gespeichert mit Visual Studio 2012, Targeting .Net Framework v4.5 und Kompilieren mit Erfolg in der IDE ... geladen haben Warum muss ich Systemverweise hinzufügen, damit es funktioniert?.

Ich erwartete, dass es mit den Referenzen bereits kommt ... das System verweist auf die korrekte .Net Framework Version. Es bedeutet, dass auch # 2 wird nicht immer funktionieren, weil ich finden Sie das korrekte .Net Framework Version Dateien, anstatt mit denen des Tools Ich bin derzeit kompilieren.

EDIT

Hier ist der csproj Dateiinhalt:

<?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> 
+0

Welche Art von Projekten? Welche Fehler? – SLaks

+0

C# -Projekte (csproj) ... alle Fehler sind Referenzfehler ... Ich habe die Frage bearbeitet und ein paar hinzugefügt. –

+0

Ansatz Nummer eins * sollte * funktionieren. Wenn Sie debuggen, erhalten die Projekte irgendwelche Referenzen? Sind irgendwelche der Projekte Portable Class Libraries? –

Antwort

2

ich endlich eine Antwort gefunden ... I 4.6 Vorschau .Net Framework wurde mit dem Werkzeug zu machen.

Ich deinstalliert Visual Studio 2015 bereits, aber nicht das Framework 4.6.

So habe ich es versehentlich beim Erstellen des Tool-Projekts verwendet, indem Sie das .Net Framework 4.5.3 in Visual Studio 2013 (es erscheint in VS2013 nach der Installation von VS2015 CTP).

Durch Umschalten des Frameworks auf 4.5 es funktioniert und lädt die MetadataReferences korrekt.