需要构建针对.NET Standard \ Core而不是.NET Portable的Roslyn分析器

问题描述:

我正在使用Visual Studio 2017附带的默认Roslyn SDK模板。它们创建的项目的目标.NET Framework Portable。我假设Roslyn可扩展性项目可以以.NET Standard \ Core而不是Portable为目标,并且正在寻找我可以学习的模板或Roslyn Analyzer \ Refactoring项目的样本。需要构建针对.NET Standard Core而不是.NET Portable的Roslyn分析器

+0

这里有什么问题,要么开始一个新项目并引用分析器,然后从vsix调用它,或者修改CSProj文件,并替换便携式库 –

+1

试过了,但它并不那么直截了当。你知道一个我可以看一看的例子,它在哪里成功完成? –

+0

我知道我成功工作的唯一项目就是这里的一个,我不认为我的公司会允许分享。但我跟着这个[回答](https://*.com/a/23135170/1938988) –

我开始研究一个新的Roslyn项目,并逐个建立了一些东西,而不是使用模板。 https://github.com/IKoshelev/Roslyn.AutoLogging/commit/1f88e3e49141e0fa425c51fdcb3457a7c3d6dcaa

我总算有以下目标:

重构项目 - .NET标准1.3(这个.dll将被分发,版本保持在最低限度)

单元测试项目 - .NET核2.0

VSIX项目 - .NET框架4.6(我相信,只有完整的Visual Studio支持VSIX,所以这是好的)

更新版本罗斯林的现在有点复杂了,即如果你想在Visual Studio 2015中使用你的扩展,你将不得不使用PCL库。本文结尾处的更多信息article on Roslyn

从默认分析仪模板转换的分析仪样品可用here。有用于比较的原始分析器以及针对.NET标准的TestAnalyzerStandard

步骤,使其工作:

  • 创建新的.NET标准库
  • 图书馆必须针对.NET 1.3标准。如果您希望将分析器作为VS内的扩展运行(扩展目标.NET 4.6),则这是必需的。标准版本和完整框架版本之间的映射可用here。此外,如果您尝试定位低于1.3的版本,您将无法包含所需的分析器软件包。
  • 添加nuget包为Microsoft.Composition最新版本。这需要Microsoft.CodeAnalysis.CSharp.Workspaces。如果您尝试首先添加工作区,则会出现引用的组合包不兼容的错误。
  • 添加的NuGet包Microsoft.CodeAnalysis.CSharp(我使用的是最新的1. *版本)
  • 添加的NuGet包Microsoft.CodeAnalysis.Csharp.Workspaces(版本应该匹配的Microsoft.CodeAnalysis.CSharp版本)。
  • 此时您可以从便携式项目复制代码并构建它。应该没有错误(如果VS仍然显示红色波形,则可能必须关闭并重新打开解决方案)。
  • 为了使VS推广工作,刚打开source.extension.vsixmanifest,去资产标签和更改参考.NET标准库
  • 创建.nuget包只执行nuget pack Diagnostic.nuspec .Diagnostic.nuspec适用于Nuget 2.x.如果您在VS 2017中通过包管理控制台使用nuget,则必须将<file src="*.dll" ..."更改为<file src="bin\*\netstandard1.3\*.dll" ...

这些步骤是我使用分析器进行实验的结果(我以前使用的是创建针对完整框架而不是便携库的DLL)。他们绝不是官方

+0

我已经下载了引用的项目,删除了该分析仪的便携式版本只剩下核心版本,并试图构建它。到目前为止,VSIX不起作用,并且块没有包含dll。 –

+0

我在Visual Studio 2017(15.2)中测试了vsix和nuget包,它们都工作正常。我从便携式分析器中删除了引用,并更新了'.csproj'文件以指向'Diagnostic.nuspec'进行打包。您现在可以通过右键单击'TestAnalyzerStandard' - >'Pack'直接从Visual Studio构建nuget包。 Nuget包将出现在Debug(或Release)文件夹中。我还在'TestAnalyzerStandard \ Publish'文件夹中包含了构建的vsix扩展和nuget包,以便您可以看到我的机器上生成了什么。 – nejcs

+0

我将不得不在稍后检查(抱歉,现在非常忙碌)。我授予赏金。 –