2017-09-26 2 views
1

ich aus dem folgende Projekt die folgenden Fehler von meinem Roslyn Analysator Testfall habeWie ein roslyn Analysator schreiben, die ein Dotnet-Standard 2.0 Projekt verweist

https://github.com/Weingartner/Migrations.Json.Net

Erwartete Sammlung leer zu sein, aber gefunden {Test0.cs (5,2): Fehler CS0012: Der Typ 'Attribut' ist in einer Baugruppe definiert, die nicht auf verweist. Sie müssen einen Verweis auf den Netstandard der Baugruppe hinzufügen, Version = 2.0.0.0, Culture = neutral, PublicKeyToken = cc7b13ffcd2ddd51.}.

Die aktuellen Metadaten-Referenzen in DiagnosticVerifier.Helper.cs sind

private static readonly MetadataReference CorlibReference = MetadataReference.CreateFromFile(typeof(object).Assembly.Location); 
private static readonly MetadataReference SystemReference = MetadataReference.CreateFromFile(typeof(System.Uri).Assembly.Location); 
private static readonly MetadataReference SystemCoreReference = MetadataReference.CreateFromFile(typeof(Enumerable).Assembly.Location); 
private static readonly MetadataReference CSharpSymbolsReference = MetadataReference.CreateFromFile(typeof(CSharpCompilation).Assembly.Location); 
private static readonly MetadataReference CodeAnalysisReference = MetadataReference.CreateFromFile(typeof(Compilation).Assembly.Location); 
private static readonly MetadataReference SystemRuntimeReference = MetadataReference.CreateFromFile(Assembly.Load("System.Runtime, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a").Location); 
private static readonly MetadataReference MigrationReference = MetadataReference.CreateFromFile(typeof(MigratableAttribute).Assembly.Location); 
private static readonly MetadataReference SerializationReference = MetadataReference.CreateFromFile(typeof(DataMemberAttribute).Assembly.Location); 
private static readonly MetadataReference JsonNetReference = MetadataReference.CreateFromFile(typeof(Newtonsoft.Json.JsonConvert).Assembly.Location); 

eine der Referenzen

private static readonly MetadataReference MigrationReference = 
    MetadataReference 
     .CreateFromFile(typeof(MigratableAttribute).Assembly.Location); 

einem Teilprojekt betrifft Weingartner.Json.Migration

enter image description here

dieses Projekt ist ein dotnetstandard 2.0 Projekt

<Project Sdk="Microsoft.NET.Sdk"> 

    <PropertyGroup> 
    <TargetFramework>netstandard2.0</TargetFramework> 
    <RootNamespace>Weingartner.Json.Migration</RootNamespace> 
    <AssemblyName>Weingartner.Json.Migration</AssemblyName> 
    </PropertyGroup> 

    <ItemGroup> 
    <PackageReference Include="Newtonsoft.Json" Version="10.0.3" /> 
    </ItemGroup> 

    <ItemGroup> 
    <ProjectReference Include="..\Weingartner.Json.Migration.Common_\Weingartner.Json.Migration.Common.csproj" /> 
    </ItemGroup> 

</Project> 

Jedoch, wenn ich den Analysator Testfall ich den Laufzeitfehler ausführen, die ich netstandard

Erwartete Sammlung leer sein verweisen, aber gefunden {Test0.cs (5,2): Fehler CS0012: Der Typ 'Attribut' ist in einer Baugruppe definiert, die nicht ist. Sie müssen einen Verweis auf den Netstandard der Baugruppe hinzufügen, Version = 2.0.0.0, Culture = neutral, PublicKeyToken = cc7b13ffcd2ddd51.}. bei FluentAssertions.Execution.XUnit2TestFramework.Throw (String message) an FluentAssertions.Execution.AssertionScope.FailWith (String-Nachricht, Object [] args) bei FluentAssertions.Execution.GivenSelector 1.FailWith(String message, Object[] args) at FluentAssertions.Collections.CollectionAssertions 2.BeEmpty (String weil, Object [] becauseArgs) bei TestHelper.DiagnosticVerifier.CreateProject (String [] Quellen, String Sprache) bei TestHelper.DiagnosticVerifier.GetDocuments (String [] Quellen, String Sprache) bei TestHelper.DiagnosticVerifier.GetSortedDiagnostics (String [] Quellen, String Sprache, DiagnosticAnalyzer Analyzer) bei TestHelper.DiagnosticVerifier.VerifyDiagnostics (St Ring [] Quellen, String Sprache, DiagnosticAnalyzer analyzer, Diagnostic [] erwartet) bei TestHelper.DiagnosticVerifier.VerifyCSharpDiagnostic (String Quelle, Diagnostic [] erwartet) bei Weingartner.Json.Migration.Roslyn.Spec.DataContractAnalyzerSpec.ShouldCreateDiagnosticIfMigratableTypeDoesntHaveDataContractAttributeSet()

Meine Vermutung ist, dass mir etwas an dem Punkt fehlt, an dem ich das Projekt erstelle. Ich kann keine API sehen, um anzugeben, auf welche Version des Frameworks ich abziele, aber die API ist ziemlich groß, vielleicht habe ich etwas verpasst.

private static Project CreateProject(string[] sources, string language = LanguageNames.CSharp) 
    { 
     string fileNamePrefix = DefaultFilePathPrefix; 
     string fileExt = language == LanguageNames.CSharp ? CSharpDefaultFileExt : VisualBasicDefaultExt; 

     var projectId = ProjectId.CreateNewId(debugName: TestProjectName); 

     var solution = new AdhocWorkspace() 
      .CurrentSolution 
      .AddProject(projectId, TestProjectName, TestProjectName, language) 
      .AddMetadataReference(projectId, CorlibReference) 
      .AddMetadataReference(projectId, SystemReference) 
      .AddMetadataReference(projectId, SystemCoreReference) 
      .AddMetadataReference(projectId, CSharpSymbolsReference) 
      .AddMetadataReference(projectId, CodeAnalysisReference) 
      .AddMetadataReference(projectId, SystemRuntimeReference) 
      .AddMetadataReference(projectId, MigrationReference) 
      .AddMetadataReference(projectId, SerializationReference) 
      .AddMetadataReference(projectId, JsonNetReference); 
     var compilationOptions = solution 
      .GetProject(projectId) 
      .CompilationOptions 
      .WithOutputKind(OutputKind.DynamicallyLinkedLibrary); 
     solution = solution 
      .WithProjectCompilationOptions(projectId, compilationOptions); 

     int count = 0; 
     foreach (var source in sources) 
     { 
      var newFileName = fileNamePrefix + count + "." + fileExt; 
      var documentId = DocumentId.CreateNewId(projectId, debugName: newFileName); 
      solution = solution.AddDocument(documentId, newFileName, SourceText.From(source)); 
      count++; 
     } 
     var project = solution.GetProject(projectId); 
     var diangostics = project.GetCompilationAsync().Result.GetDiagnostics(); 
     diangostics.Should().BeEmpty(); 
     return project; 
    } 

Antwort

2

Es stellte sich heraus, die Antwort war so offensichtlich wie die Fehlermeldung. Nur ein Verweis auf den netstandard.

diff --git a/Weingartner.Json.Migration.Roslyn.Spec/Helpers/DiagnosticVerifier.Helper.cs b/Weingartner.Json.Migration.Roslyn.Spec/Helpers/DiagnosticVerifier.Helper.cs 
index da3b933..ba6cc7c 100644 
--- a/Weingartner.Json.Migration.Roslyn.Spec/Helpers/DiagnosticVerifier.Helper.cs 
+++ b/Weingartner.Json.Migration.Roslyn.Spec/Helpers/DiagnosticVerifier.Helper.cs 
@@ -28,6 +28,7 @@ namespace TestHelper 
     private static readonly MetadataReference CSharpSymbolsReference = MetadataReference.CreateFromFile(typeof(CSharpCompilation).Assembly.Location); 
     private static readonly MetadataReference CodeAnalysisReference = MetadataReference.CreateFromFile(typeof(Compilation).Assembly.Location); 
     private static readonly MetadataReference SystemRuntimeReference = MetadataReference.CreateFromFile(Assembly.Load("System.Runtime, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a").Location); 
+  private static readonly MetadataReference NetStandard = MetadataReference.CreateFromFile(Assembly.Load("netstandard, Version=2.0.0.0").Location); 
     private static readonly MetadataReference MigrationReference = MetadataReference.CreateFromFile(typeof(MigratableAttribute).Assembly.Location); 
     private static readonly MetadataReference SerializationReference = MetadataReference.CreateFromFile(typeof(DataMemberAttribute).Assembly.Location); 
     private static readonly MetadataReference JsonNetReference = MetadataReference.CreateFromFile(typeof(Newtonsoft.Json.JsonConvert).Assembly.Location); 
@@ -169,6 +170,7 @@ namespace TestHelper 
       .AddMetadataReference(projectId, SystemRuntimeReference) 
       .AddMetadataReference(projectId, MigrationReference) 
       .AddMetadataReference(projectId, SerializationReference) 
+    .AddMetadataReference(projectId, NetStandard) 
       .AddMetadataReference(projectId, JsonNetReference); 
      var compilationOptions = solution 
       .GetProject(projectId) 
Verwandte Themen