zoukankan      html  css  js  c++  java
  • .NET Standard库引用导致的FileNotFoundException探究

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

    .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。

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

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

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

    解决方案:

    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类库的时候,还是经常会出现这个问题,这时候,就需要我们手动添加配置项目了。

  • 相关阅读:
    声明式事务
    创建索引之代码开发
    Lucene实现全文检索的流程
    9)添加对话框的按键处理消息
    8)添加一个新的非模态对话框
    7)给tab下面添加一个子非模态对话框
    6)对(5)的代码进行一下修改 但是功能不变
    5)添加一个tab
    4)创建一个简单页面
    3)为啥(2)的代码那么写的原因
  • 原文地址:https://www.cnblogs.com/podolski/p/8988683.html
Copyright © 2011-2022 走看看