Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/325.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 如何将附加dll添加到Roslyn analyzer NuGet包?_C#_Visual Studio_Dll_Nuget_Roslyn Code Analysis - Fatal编程技术网

C# 如何将附加dll添加到Roslyn analyzer NuGet包?

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

简而言之:我在代码分析器中引用了其他dll。单元测试都很好&而我用F5调试分析器。但当这个分析器作为NuGet包安装到RealProject时,它找不到额外的dll&崩溃

#可选阅读-问题的详细版本:

我已经编写了我的代码分析器(比如说
MyAnalyzer
)。它发现了一些禁止在客户端代码中使用的类型。它的代码修复程序将这些类型替换为自定义dll中允许的替换类型(比如
myCustom.dll
)。我已将此dll作为依赖项添加到分析器解决方案的
MyAnalyzer.codefix
project和
MyAnalyzer.Test
单元测试项目中

当F5(在特殊打开的VisualStudio实例上)启动时,它工作正常&成功通过了所有单元测试

但当我:

  • 构建分析器的NuGet包(通过构建
    MyAnalyzer.package
    ——VS模板中用于生成分析器NuGet包的特殊项目)
  • 然后将其复制到NuGet本地提要(在NuGet manager中注册为包源的本地路径)
  • &然后由NuGet manager将这个NuGet包从本地提要安装到real project
诊断正常,但当我尝试使用codefix时,它应该用
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软件包