2017-09-26 10 views
1

Je l'erreur suivante de mon cas de test d'analyse Roslyn du projet suivantComment écrire un analyseur de Roslyn qui fait référence à un projet standard dotnet 2.0

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

collection prévue pour être vide, mais a trouvé {Test0.cs (5,2): erreur CS0012: Le type 'Attribut' est défini dans un assembly qui n'est pas référencé . Vous devez ajouter une référence à l'assembly 'netstandard, Version = 2.0.0.0, Culture = neutre, PublicKeyToken = cc7b13ffcd2ddd51'.}.

Les références de métadonnées actuelles dans DiagnosticVerifier.Helper.cs sont

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); 

L'une des références

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

fait référence à un sous-projet Weingartner.Json.Migration

enter image description here

ce projet est un projet 2.0 dotnetstandard

<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> 

Cependant quand je lance le cas de test de l'analyseur je reçois l'erreur d'exécution que je doit faire référence netstandard

collection prévue pour être vide, mais found {Test0.cs (5,2): erreur CS0012: Le type 'Attribut' est défini dans un assembly qui n'est pas référencé . Vous devez ajouter une référence à l'assembly 'netstandard, Version = 2.0.0.0, Culture = neutre, PublicKeyToken = cc7b13ffcd2ddd51'.}. à FluentAssertions.Execution.XUnit2TestFramework.Throw (String un message) à FluentAssertions.Execution.AssertionScope.FailWith (message String, Object [] args) à FluentAssertions.Execution.GivenSelector 1.FailWith(String message, Object[] args) at FluentAssertions.Collections.CollectionAssertions 2.BeEmpty (String parce que, objet [] becauseArgs) à TestHelper.DiagnosticVerifier.CreateProject (String [] sources, la langue Chaîne ) à TestHelper.DiagnosticVerifier.GetDocuments (String [] sources, le langage String) à TestHelper.DiagnosticVerifier.GetSortedDiagnostics (String [] sources, Langage de chaîne, analyseur DiagnosticAnalyzer) à TestHelper.DiagnosticVerifier.VerifyDiagnostics (St cycle [] sources, langue à cordes analyseur DiagnosticAnalyzer, DiagnosticResult [] prévu) à TestHelper.DiagnosticVerifier.VerifyCSharpDiagnostic (source String, DiagnosticResult [] expected) à Weingartner.Json.Migration.Roslyn.Spec.DataContractAnalyzerSpec.ShouldCreateDiagnosticIfMigratableTypeDoesntHaveDataContractAttributeSet (

Je suppose qu'il me manque quelque chose au moment où je crée le projet. Je ne peux pas voir une API pour spécifier quelle version de l'infrastructure que je cible, mais l'API est assez grande, alors peut-être que j'ai raté quelque chose.

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; 
    } 

Répondre

2

Transforme la réponse était aussi évidente que le message d'erreur. Juste une référence à 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)