C# 在同一解决方案中使用Roslyn代码分析器

C# 在同一解决方案中使用Roslyn代码分析器,c#,.net,.net-core,roslyn,C#,.net,.net Core,Roslyn,我有一个由几个.NET核心项目组成的解决方案。我有一些只适用于此解决方案的代码分析任务,因此将它们放在单独的回购/解决方案中是没有意义的。使用适当的模板,我为分析器创建了三个项目: 例如,分析器 示例.Analyzer.Test Example.Analyzer.Vsix Example.Analyzer.Vsix未编译,因为Visual Studio需要.NET Framework,但我将.NET Core作为跨平台使用的目标。现在,我忽略了那个项目,但我打算删除它。Example.Ana

我有一个由几个.NET核心项目组成的解决方案。我有一些只适用于此解决方案的代码分析任务,因此将它们放在单独的回购/解决方案中是没有意义的。使用适当的模板,我为分析器创建了三个项目:

  • 例如,分析器
  • 示例.Analyzer.Test
  • Example.Analyzer.Vsix
Example.Analyzer.Vsix未编译,因为Visual Studio需要.NET Framework,但我将.NET Core作为跨平台使用的目标。现在,我忽略了那个项目,但我打算删除它。Example.Analyzer和Example.Analyzer.Test都是目标netcoreapp3.0,以及解决方案中的所有其他项目


我已经编写了分析器,测试通过了。但是,我不确定如何实际使用其他项目中的这些分析器。我曾尝试通过ProjectReference将Example.Analyzer添加为依赖项,但这似乎无法启用Analyzer。

根据我对它的了解,有两种方法可以将Analyzer支持添加到项目中:通过vsix或nuget包(如在项目中)

将此包安装为nuget dependency表明,有一个特定的属性来标识依赖项内容的类型:

运行时;建设;本地人;内容文件;分析仪

如您所见,资产类型之一是分析器。 不幸的是,似乎不支持为项目依赖项设置“IncludeAssets”属性,即使它在“属性”窗格中可见

我建议您尝试nuget reference,而不是project reference

要从项目中获取nuget包,只需右键单击它并选择“发布”。
此外,需要本地nuget存储库源才能将您的新nuget放到那里。

事实上,昨天我想为我正在开发的产品创建一组分析器,但在另一个解决方案中这样做是没有意义的,只为了我可以使用它们而放在一个私有的nuget上。我找到了一个完美的解决方案:

  • 在将要分析的项目中,添加对包含分析器的项目的引用
  • 编辑项目文件,找到刚刚创建的ProjectReference标记,并添加属性ReferenceOutputAssembly=false,OutputItemType=Analyzer。它应该类似于这样:
  • 
    假的
    分析器
    
    这就是所需要的一切。现在,一旦您的解决方案构建完成,您的新分析器就应该可以工作了。唯一需要注意的是,VisualStudio似乎在缓存分析器,因此如果您更改它,可能需要关闭并重新打开VS,新的/更改的分析器才能工作

    尽管我很想,但我不能完全相信这一点。昨天我自己确实非常接近这个解决方案,但今天早上我发现了一个简化了一点的解决方案(这就是我从上面的最终解决方案中得到的,我的解决方案还有一些“不必要的”行)


    在我的案例中,我做的一件事是利用我的项目文件夹中的“”文件添加此项目引用。这样,在该文件夹中创建的所有项目都将自动使用我创建的分析器。

    谢谢。在做了大量的研究之后,我得出了相同的结论:VSIX和NuGet是唯一的选择。那会有点麻烦,但我能做到。首先,我爱你。这应该在官方文件中。其次,对于那些想将其他分析仪与自己的分析仪捆绑在一起的人来说,当其他分析器是依赖项且您自己的分析器项目作为NuGet包包含时,可以有效地镜像被引用的其他分析器的功能:将
    设置为
    true
    。是我还是以这种方式导入的分析器不显示扭曲的线条(但它们在dotnet build中确实显示为警告)?您能确认它是否与dotnet build命令一起工作吗