2017-09-26 140 views
1

我從羅斯林儀測試情況下,下面的錯誤從以下項目如何編寫引用DOTNET標準2.0項目

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

預計集合是空的,但發現羅斯林分析儀{Test0.cs(5,2):錯誤 CS0012:'屬性'類型在不是 引用的程序集中定義。您必須添加對組件'netstandard的引用, Version = 2.0.0.0,Culture = neutral,PublicKeyToken = cc7b13ffcd2ddd51'。}。

DiagnosticVerifier.Helper.cs的當前元數據的引用是

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

其中引用

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

指子項目Weingartner.Json.Migration的

enter image description here

這個項目是一個dotnetstandard 2.0項目

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

然而,當我運行分析儀的測試案例,我感到我應該引用netstandard

預計集合是空的運行時錯誤,但發現{Test0.cs(5,2):錯誤 CS0012:類型'屬性'是在不是 引用的程序集中定義的。您必須添加對組件'netstandard的引用, Version = 2.0.0.0,Culture = neutral,PublicKeyToken = cc7b13ffcd2ddd51'。}。 在FluentAssertions.Execution.XUnit2TestFramework.Throw(字符串 消息)在 FluentAssertions.Execution.AssertionScope.FailWith(字符串消息, 對象[]參數)在 FluentAssertions.Execution.GivenSelector 1.FailWith(String message, Object[] args) at FluentAssertions.Collections.CollectionAssertions 2.BeEmpty(字符串 因爲,對象[] becauseArgs)在 TestHelper.DiagnosticVerifier.CreateProject(字符串[]來源,字符串 語言)在TestHelper.DiagnosticVerifier.GetDocuments(字符串[] 源,在 TestHelper.DiagnosticVerifier.GetSortedDiagnostics字符串語言)(字符串[]來源, String language,DiagnosticAnalyzer分析器) TestHelper.DiagnosticVerifier.VerifyDiagnostics(St在 TestHelper.DiagnosticVerifier.VerifyCSharpDiagnostic(字符串源環[]來源, 字符串的語言,DiagnosticAnalyzer分析器,DiagnosticResult [] 預期), 預期DiagnosticResult [])在 Weingartner.Json.Migration.Roslyn.Spec.DataContractAnalyzerSpec.ShouldCreateDiagnosticIfMigratableTypeDoesntHaveDataContractAttributeSet ()

我的猜測是我在創建項目時忽略了一些東西。我看不到一個API來指定我定位的框架的版本,但API非常大,所以我可能錯過了一些東西。

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

回答

2

原來,答案與錯誤消息一樣明顯。只是對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)