Roslyn分析器缺少装配警告

时间:2018-04-26 15:40:32

标签: c# msbuild roslyn core analyzer

创建面向.Net Standard 2.0的Roslyn分析器包后,当我在另一个项目中引用该包时,收到以下错误:

'C:\ Users \ username.nuget \ packages \ analyzer4 \ 1.0.0.1 \ analyzers \ dotnet \ cs \ Analyzer4.dll'取决于'netstandard,Version = 2.0.0.0,Culture = neutral,PublicKeyToken = cc7b13ffcd2ddd51'但未找到。除非将缺少的组件添加为分析器参考,否则分析仪可能无法正常运行。

使用Analyzer的项目重新编译是here。这个repro是一个vanilla .Net Core 2.0控制台应用程序,引用了分析器,没有任何其他代码。分析器本身只是通过在Visual Studio中创建默认的Analyzer项目来构建,更改它以使其以netstandard2.0而不是netstandard1.3为目标,然后在发布模式下构建以生成.nupkg文件。正如repro演示的那样,分析仪可以正常工作,但会生成警告。

在Github上的各个地方都讨论过这个警告,例如here,但在这些情况下,分析器作者故意剥离了一些本地库代码。在这种情况下,分析仪不会引用任何其他库。

我不清楚将分析器添加为“分析器参考”的确切含义,而不仅仅是常规项目参考。我确实尝试过改变

<PackageReference Include="Analyzer4" Version="1.0.0.1" />

<Analyzer Include="..\LocalPackages\Analyzer4.1.0.0.1.nupkg" />

但是这导致了另一条错误消息(“ PE图像不包含托管元数据”)。

任何人都可以解释这个错误意味着什么,理想情况下如何解决它?

2 个答案:

答案 0 :(得分:4)

有关此问题的一些背景信息是here。当分析仪依赖于另一个组件时,两者都必须列为分析器,但核心系统组件通常有例外。不幸的是,似乎还没有将.Net标准2.0添加到例外列表中;据推测,这将在未来的某个时刻发生。我能够进行代码更改,将分析器定位到.Net Standard 1.3,从而避免出现警告。

将其他程序集(例如Newtonsoft.Json)添加到分析器中时,也会出现此问题。对此的一个解决方案就是不这样做;例如,StyleCop消除了对Newtonsoft.Json的依赖,只是直接在其程序集中包含LightJson的代码。其他解决方案可能是(1)手动复制你所依赖的dll(如果需要,从你的packages文件夹中取出)到.nupkg文件中,认识到.nupkg实际上只是一个.zip文件;或者(2)使用像ILMerge这样的工具将依赖项合并到DLL中。我还没有尝试过这些方法,所以如果其他人可以逐步解释如何将其整合到分析器的构建中,我会将其标记为正确的答案。

答案 1 :(得分:2)

您可以在Source Generators Cookbook中使用此方法(感谢@mbabramo提供链接!)。

<ItemGroup>
<PackageReference Include="Analyzer4" Version="1.0.0.1" />
</ItemGroup>

成为:

<ItemGroup>
<PackageReference Include="Analyzer4" Version="1.0.0.1" PrivateAssets="all" GeneratePathProperty="true" />
<None Include="$(PkgAnalyzer4)\lib\netstandard2.0\*.dll" Pack="true" PackagePath="analyzers/dotnet/cs" Visible="false" />
</ItemGroup>

这应该将软件包dll添加到分析仪的文件夹中,并且应该可以正常工作。