C# 如何将附加dll添加到Roslyn analyzer NuGet包?
简而言之:我在代码分析器中引用了其他dll。单元测试都很好&而我用F5调试分析器。但当这个分析器作为NuGet包安装到RealProject时,它找不到额外的dll&崩溃 #可选阅读-问题的详细版本: 我已经编写了我的代码分析器(比如说C# 如何将附加dll添加到Roslyn analyzer NuGet包?,c#,visual-studio,dll,nuget,roslyn-code-analysis,C#,Visual Studio,Dll,Nuget,Roslyn Code Analysis,简而言之:我在代码分析器中引用了其他dll。单元测试都很好&而我用F5调试分析器。但当这个分析器作为NuGet包安装到RealProject时,它找不到额外的dll&崩溃 #可选阅读-问题的详细版本: 我已经编写了我的代码分析器(比如说MyAnalyzer)。它发现了一些禁止在客户端代码中使用的类型。它的代码修复程序将这些类型替换为自定义dll中允许的替换类型(比如myCustom.dll)。我已将此dll作为依赖项添加到分析器解决方案的MyAnalyzer.codefixproject和MyA
MyAnalyzer
)。它发现了一些禁止在客户端代码中使用的类型。它的代码修复程序将这些类型替换为自定义dll中允许的替换类型(比如myCustom.dll
)。我已将此dll作为依赖项添加到分析器解决方案的MyAnalyzer.codefix
project和MyAnalyzer.Test
单元测试项目中
当F5(在特殊打开的VisualStudio实例上)启动时,它工作正常&成功通过了所有单元测试
但当我:
- 构建分析器的NuGet包(通过构建
——VS模板中用于生成分析器NuGet包的特殊项目)MyAnalyzer.package
- 然后将其复制到NuGet本地提要(在NuGet manager中注册为包源的本地路径)
- &然后由NuGet manager将这个NuGet包从本地提要安装到real project
myCustom.dll
中的某个类型替换某些类型,我的分析器无法找到myCustom.dll
&抛出异常:
System.IO.FileNotFoundException : Could not load file or assembly 'myCustom, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null' or one of its dependencies. The system cannot find the file specified.
我可能以错误的方式添加对dll的引用(不使用分析器)?或者(这只是我的假设)NuGet包的任何依赖也应该是NuGet包
#其他信息(可能很重要):
生成输出看起来正常:具有生成输出的文件夹包含我引用的dll
我照样复制了它以获取本地提要文件夹
但安装包后出现的已安装包的缓存文件夹不包含该myCustom.dll
。它只包含(少数小文件除外):
C:\Users\user1\.nuget\packages\myanalyzer\0.0.1\myanalyzer.0.0.1.nupkg
&2个DLL:
C:\Users\user1\.nuget\packages\myanalyzer\0.0.1\analyzers\dotnet\cs\myanalyzer.dll
C:\Users\user1\.nuget\packages\myanalyzer\0.0.1\analyzers\dotnet\cs\myanalyzer.codefix.dll
当我试图手动将我的dll放在那个里时,analyzer仍然抛出异常
当我试图手动将我的dll放到cahe文件夹中时,
analyzer仍然抛出异常
这不是一个正确的方法。该问题描述了您在全局缓存下有一些错误的nuget旧版本。由于您没有将新版本更改为另一个版本,因此旧的错误nuget软件包与新版本相同,nuget软件包管理器始终首先在全局缓存下安装该版本,如果它通过nuget软件包管理器UI找不到相同版本的nuget软件包,它将下载特定版本,与nuget软件包不同的版本将馈送到全局缓存C:\Users\xxx\.nuget\packages\
,然后将其安装到项目中
您应该尝试以下步骤进行仔细检查:
1)在本地提要下检查新打包的nuget软件包myanalyzer
。您可以使用7zip
工具解压缩myanalyzer.0.0.1.nupkg
检查myCustom.dll
是否位于文件夹myanalyzers.0.0.1\analyzers\dotnet\cs\
下
同样,我发现错误是
Could not load file or assembly 'MyCustomDll, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null' or one of its dependencies.
我很好奇为什么dll不正确。错误是您使用了MyCustomDll.dll
,而不是MyCustom.dll
。您应该检查分析程序文件,并确保使用正确命名的文件
然后,重新打包新的nuget项目,确保新版本的nuget包是正确的
2)删除C:\Users\xxx\.nuget\packages\myanalyzer
下的缓存文件夹
如果使用packages.config
numget管理格式,还应删除解决方案文件夹\packages\myanalyzer.0.1
下的文件夹
3)之后,在软件包管理器界面下重新安装正确的版本
更新
很抱歉,我忽略了analyzer nuget项目的打包步骤
实际上,如果DLL被当前nuget项目引用,则“打包”按钮没有义务自动将这些DLL打包到nupkg
文件中
您必须手动打包,无论您如何打包,都必须修改csproj文件
解决方案
使用您的目标或其他目标是在myanalyzer.package.csproj
文件下添加这些:
<ItemGroup>
<None Include ="$(TargetDir)mycustom.dll" pack="true" PackagePath="analyzers/dotnet/cs"></None>
</ItemGroup>
然后,重新打包项目,清理nuget缓存,然后安装新缓存
我想知道,为什么所有DLL在安装的NuGet软件包中都出现两次: 在packages\myanalyzer\0.0.1\analyzers\dotnet\cs中作为单独的文件& 作为.nupkg文件中存档的一部分。或已安装软件包的所有内容 文件夹,除了.nupkg文件,刚刚解包.nupkg
nupkg
文件是您的nuget包的原始版本。它是由您的pack-nuget项目生成的。包含nupkg的文件夹是本地nuget提要
该文件夹类似于nuget.org
source。包含它的这个文件夹是nuget软件包源(nuget从这个路径下载nuget文件,然后下载nupkg,并将其解压缩到C:\Users\xxx\.nuget\packages
)
除外,C:\Users\xxx\.nuget\packages
是
因此它从lo恢复下载的nuget软件包