.NET Standard库引用致使的FileNotFoundException探究

微软近几年推出.NET Standard,将.NET Framework,.NET Core,Xamarin等目标平台的api进行标准化和统一化,极大地方便了类库编写人员的工做。简单的说,类库编写人员在发布库的时候,只须要基于.NET Standard进行发布,那么编写的程序能够在各个目标平台上都能到运行。api

.NET Standard是一种标准,只要符合这个标准的平台均可以运行基于此标准api构建的程序。工具

感受挺好用的,可是实际上用起来就有一些坑了。好比说这个常见的FileNotFoundException,当有这个状况的时候,常常出现:测试

主程序的目标平台是某个具体平台(不是.NET Standard,好比说是.NET Framework 4.0),随后为了引入新的特性,升级了Framework为4.6.1,它而且引用了一个.NET Standard类库,刚好,这个类库还引用了其余的package。(即传递引用A->B->C的形式,其中A是.NET Framework程序,B是nuget包,C是B引用的nuget包。)在此状况下,若是F5启动程序,就会报FileNotFoundException。code

测试条件
Visual Studio 2015 Community
测试用包:UnifiedConfig v1.1.6get

提示未找到System.IO.FileSystem。乍看感受是一个简单的引用错误,但unifiedconfig包里面已经正常引用了这个项目,按道理vs可以正常帮咱们处理引用问题。到文件输出路径中查看,发现对应的包没有正确复制过来。手动从package文件夹中复制过来,问题解决。it

缘由出在这个跨平台上。因为存在引用传递,B不能肯定须要复制哪一个目标平台的package到A的输出路径。当程序是从旧的Framework升级而来的时候,旧版的项目文件不能很好地处理.NET Standard的这个问题。但咱们手动一个一个复制也不是办法,如下给出解决方案。io

解决方案:配置

  1. 最直接的方案,修改主项目的.csproj文件,将<RestoreProjectStyle>PackageReference</RestoreProjectStyle>添加到第一个PropertyGroup
  2. 若是还不行,加上<AutoGenerateBindingRedirects>true</AutoGenerateBindingRedirects>
    或者
  • 在工具->nuget包管理器->程序包管理->默认包管理格式,从Packages.config改为PackageReference。

后记

我记得在visual studio 2017早期版本还存在这个bug,升级以后visual studio 2017 15.6.4这个版本测试新建项目,已经没有这个问题。而且默认生成的基于4.5.2以上Framework的.csproj文件已经添加<AutoGenerateBindingRedirects>true</AutoGenerateBindingRedirects>这个配置。可是当老版本的项目引用.NET Standard类库的时候,仍是常常会出现这个问题,这时候,就须要咱们手动添加配置项目了。引用

相关文章
相关标签/搜索