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

.NET Standard库引用导致的FileNotFoundException探究的更多相关文章

  1. (六)Net Core项目使用Controller之一 c# log4net 不输出日志 .NET Standard库引用导致的FileNotFoundException探究 获取json串里的某个属性值 common.js 如何调用common.js js 筛选数据 Join 具体用法

    (六)Net Core项目使用Controller之一 一.简介 1.当前最流行的开发模式是前后端分离,Controller作为后端的核心输出,是开发人员使用最多的技术点. 2.个人所在的团队已经选择 ...

  2. 在Xamarin开发中,UWP环境下无法进入断点调试standard库的问题解决方案

    环境如下 选择的代码共享方案为standard模式 再多平台依赖注入的时候,断点一直提示没有加载文档. 进入到目标平台项目Debug文件夹下,查看.发现standard库引用进来后,对应的*.pdb文 ...

  3. 从一个弱引用导致的奔溃 谈 weak assign strong的应用场景【iOS开发教程】

    从一个弱引用导致的奔溃 谈 weak assign strong的应用场景 .h中的定义方法一: @property (nonatomic, assign) NSArray *dataSource; ...

  4. VS2010中添加lib库引用

    VS2010中添加lib库引用: 1 菜单  项目---> 属性--->配置属性-->链接器---->输入---附加依赖项,  加入库名,如: my_API.lib; 或是在c ...

  5. 讲述Sagit.Framework解决:双向引用导致的IOS内存泄漏(上)

    前言: 好久没写文章了,最近先是重构IT恋.又重写IT恋中. Sagit框架也不断的更新,调整,现在感觉已完美了了相当的多. 今天不写教程,先简单分享一下技术内容. 1:见Block必有:#defin ...

  6. 讲述Sagit.Framework解决:双向引用导致的IOS内存泄漏(中)- IOS不为人知的Bug

    前言: 话说昨晚还是前晚,写了一篇:讲述Sagit.Framework解决:双向引用导致的IOS内存泄漏(上) 文章写到最后时,多了很多莫名奇妙的问题!!! 为了解决了这些莫名奇妙的问题,我又战斗了2 ...

  7. 讲述Sagit.Framework解决:双向引用导致的IOS内存泄漏(下)- block中任性用self

    前言: 在处理完框架内存泄漏的问题后,见上篇:讲述Sagit.Framework解决:双向引用导致的IOS内存泄漏(中)- IOS不为人知的Bug 发现业务代码有一个地方的内存没释放,原因很也简单: ...

  8. api重复引用导致的诡异问题排查

    api重复引用导致的诡异问题排查 最近一个项目上线前开发环境.测试环境都能正常打包并运行.然而到了准生产环境和生产环境则报一些诡异的错误信息: [INFO] --------------------- ...

  9. iOS - Block产生Memory Leaks循环引用导致的内存泄漏以及解决方案

    在ARC(自动引用技术)前,Objective-c都是手动来分配释放 释放 计数内存,其过程非常复杂. ARC技术推出后,貌似世界和平了很多,但是其实ARC并不等同于Java或者C#中的垃圾回收,AR ...

随机推荐

  1. recovery 升级过程LED灯闪烁

    Android设备在进入recovery升级的过程,我们在屏幕上面可以看到升级的机器人动画,以及升级的进度显示.这仅限于有屏幕的设备,比如平板PAD,电视TV等,对与没有屏幕的盒子BOX,那么在不接入 ...

  2. 2.网络编程-udp

    # 使用套接字发送udp数据import socket s = socket.socket(socket.AF_INET, SOCK_DGRAM) s.sendto(b"hello" ...

  3. sublime text 中 .vue文件中的scss语法无法高亮bug怎么解决

    如题,在vuejs的单文件组件中,.vue 结尾的文件里面使用scss的时候,无法高亮.因为 sublime默认是不带sass语法高亮的,安装 sublime SCSS语法高亮包即可. 方法如下:   ...

  4. nginx代理 upstream轮询

    问题描述 我有2个Tomcat  一个端口开启(8021),一个端口未开启(8022),在nginx里用upstream模块进行代理 ,代理的负载算法采用的是默认的轮询算法,配置成功后,访问页面时并没 ...

  5. PHP APP端微信支付

    前面已经写了手机APP支付宝支付,今天再把手机APP微信支付补上,前期的准备工作在这里就不多说了,可以参考微信支付开发文档,一定要仔细阅读开发文档,可以让你少踩点坑:准备工作完成后就是配置参数,调用统 ...

  6. Hadoop2.7.6_06_mapreduce参数优化

    MapReduce重要配置参数 1. 资源相关参数 //以下参数是在用户自己的mr应用程序中配置就可以生效 () mapreduce.map.memory.mb: 一个Map Task可使用的资源上限 ...

  7. 【软件工程1916|W(福州大学)_助教博客】团队答辩助教问题记录

    周一进行了团队项目的课堂答辩,结合团队项目报告对团队项目提出了1-2个问题,将问题和团队回答巨鹿如下 那周余嘉熊掌将得队 如何用户保证隐私安全?答:后期考虑,团队中有一个专业是信息安全的,会针对这块提 ...

  8. DevExpress gridcontrol gridView主从表折叠/展开显示

    在使用报表的时候,有很多需要主从表一起显示,从表不需要另外弹窗显示明细,反而直接显示在主表下方.如图所示: 第一次做这个功能,主从表显示,从表列隐藏,从表单元格点击事件这三个功能点花费了很多时间,在网 ...

  9. 百度、高德、谷歌、火星、wgs84(2000)地图坐标相互转换的JS实现

    一.调用例子: <!DOCTYPE html> <html lang="en"> <head> <meta charset="U ...

  10. NOIP2018 AFO记

    仿佛"距NOIP2018还剩30天"的倒计时还在昨天,没想到这一天来的这么快. 考前在机房嘻嘻哈哈打打闹闹,开玩笑说道"我要AFO了",心里暗暗发誓做好自己,不 ...