修复迁移后Net Standard项目中的错误

接上一章,项目编译结果如下:

解决依赖dll引用

在Net Framework项目的引用如下:

各引用和作用:

  • log4net(1.10.0.0) 用于写框架日志
  • Castle.DynamicProxy(1.1.5.1) 用于代理类生成
  • Micosoft.Practice.EnterpiseLibrary 微软企业库,用于管理数据链接和缓存的功能
  • System.Data.OracleClient 用于链接Oracle数据库
  • System.Data 用于SQL SERVER 、OLeDB、ODBC的数据库操作

这些老的项目引用是不能直接用在Net Standard项目上的,解决过程如下:

  • [解决] log4net是开源项目,从2.0.6 版开始就已经支持.NET Core,目前是2.0.8,在在开源网站和nuget上可以下载到。通过nuget引用最新的dll,可以无缝兼容
  • [解决] Castle.DynamicProxy也是一个开源的项目,他也具有.NET Core版本对应的DLL(Castle.Core),只是接口和我引用的1.1.5.1的接口有一点点区别,可以调整一点代码解决,同时把老项目的dll也引用最新的dll即可。
  • [移除相关的代码]Micosoft.Practice.EnterpiseLibrary 企业库微软已经很早不支持了,也没有对应的Core版本,我的做法是检查下代码看看这些代码是否能去掉,或用别的方式来实现。
  • System.Data.OracleClient Net Core官方没有出dll来实现,但是有社区已经实现了对应的dll. 目前我没有验证这个功能,只是将相关的类不编译。
  • System.Data 这个参考下面的章节,来解决,因为之前这个dll包含了oledb、odbc、sqlserver的数据库。目前微软有Syste.Data.SqlClient.dll来兼容sql server的其他的都不支持。

新项目的引用截图:

数据库相关的错误修订

MS Sql Server

Net 和 MS Sql Server交互大多通过Syste.Data.SqlClient.dll中相关类操作,在Core项目中,项目中通过引用Nuget中的 System.Data.SqlClient包,即可修复。

OleDB 和 ODBC

Net Core\Standard不再支持System.Data.OleDb。

目前没有找到相关 Net Core\Standard 中官方有相关的类库来替代。

所以在编译Net Core\Standard项目时,通过项目文件去除相关类。

移除编译的方式很简单,使用文本编辑器,打开.csproj文件:

之前我们通过添加一下配置,将代码以快捷方式添加到新项目中

   <ItemGroup>
<Compile Include="..\..\Beyondbit.Framework\**\*.cs" />
</ItemGroup>

将我们不需要的功能排除掉,使用以下语法:

 <ItemGroup>
<Compile Remove="..\..\Beyondbit.Framework\Data\OdbcDbClientProvider.cs" />
<Compile Remove="..\..\Beyondbit.Framework\Data\OleDbDbClientProvider.cs" />
</ItemGroup>

通过上面,新项目中,就不会出现OdbcDbClientProvider.cs文件,而老项目还有的。通过这种方式排除和olddb和odbc相关的类。

Oracle

Net Core\Standard不再支持System.Data.OracleClient。

微软没有提供相关类库来支持,但是有开源社区有实现的版本OracleClientCore ,可以在Nuget 中下载,这个我没有试过是否有效。

修复配置文件读取的错误

Web.config \ App.config

在Net Core 2.0 以后是支持App.config的,在之前Net Core 中的配置不能像我们在Net Frameword中那样读取配置。 2.0之前Net Core读取配置的方法,可以参考LizeZere 同学的文章《ASP.NET Core开发-读取配置文件Configuration》和晓晨Master同学的文章《.NET Core 配置Configuration杂谈

在Net Core\Standard中是没有web.config的概念,No ConfigurationManager in ASP.NET Core,没错.net core 不支持了。

不过可以采取变通的方式来解决,参考binbinxu同学的文章解决《.NET CORE 2.0 踩坑记录之ConfigurationManager》,验证是有效的。

App.config 读取BUG

实测使用System.Configuration.ConfigurationManager 4.4.1 版本读取配置时,在Web项目或者控制台应用,都可以顺利读取。但我在vs2017创建的MSUnit的测试项目运行集成测试时,读取失败了。目前还没找到方法解决,后续我会反馈BUG在github上。

编译时报“CS0579: Duplicate 'AssemblyFileVersionAttribute' attribute”错误的解决办法

当创建 .NET Core/Standard 2.0项目时,VS不会像.NET Framework项目一样自动生成AssemblyInfo.cs文件。

而且,若是手工在项目中加入以前写好的 AssemblyInfo.cs 文件,编译时会报告“CS0579: Duplicate 'AssemblyFileVersionAttribute' attribute”错误.

参考zyl910同学的文章解决,验证有效。

修复HttpContext问题

在我们的老项目,代码里面可能会判断当前是否在Web环境下,会读取一些以前特定的代码,这个问题是最难处理的。如以下代码:



可以看到编译提示HttpContext在老项目可以,在新项目显示不可用,并出现红线。这是因为在NetCore中System.Web的命名空间不在包含HttpContext类了。通过查询一些文章,有很多的文章都描述了如何在Net Core下,模拟HttpContext.Current的。如:

等等文章。

但是它们都提到了需要在Startup类通过ioc注入东西,我的项目只是一个类库,他可以运行在任何环境下,我该如何在类库中使用HttpContext,并且我不想更改代码。搜索了国内和国外的网站,都没有一个很好的方案。我自己琢磨了一个临时的方案:

  • 在Nuget引用Microsoft.AspNetCore.Http库,这是net core中HttpContextBase的库
  • 在我的新项目类顶级命名空间下,创建一个静态类叫HttpContext,里面具有一个Current的属性,返回NetCore中的HttpContext,代码如下:
using Microsoft.AspNetCore.Http;
using System;
using System.Collections.Generic;
using System.Text; namespace Beyondbit.Framework
{
public class HttpContext
{
private static IHttpContextAccessor _accessor; public static Microsoft.AspNetCore.Http.HttpContext Current => _accessor.HttpContext; public static void Configure(IHttpContextAccessor accessor)
{
_accessor = accessor;
}
}
}
  • 修改代码将System.Web.HttpContext.Current这样的代码改成 HttpContext.Current并引用System.Web命名空间
  • 这样同样的代码即可在老项目编译通过,同时新项目也能编译通过
  • 目前这样是可以编译通过,但是 HttpContext.Current是null. 需要在 mvc core项目中的Startup类中,调用一下Beyondbit.Framework.HttpContext.Configure()方法,将httpConetxt的注入到类库中

HttpContext.Current.Session问题

Net Core中的Session类和Net Framework的类变动非常的大,而且接口都已经变更,比如在Net Framework中HttpContext.Current.Session["Key"] 来获取一个object类型的变量,但是在Net Core中这样是不行的,Session已经不支持[]的写法,HttpContext.Current.Session.TryGetValue,或者扩展方法HttpContext.Current.Session.Get,但这个接口默认返回的是byte[]类型,或者HttpContext.Current.Session.GetString这样的方法获取。

这样的代码已经和Net Framework无法兼容。

目前无奈的做法是:

  1. 修改代码去除session的读取,这个需要根据具体功能来调整,不能一概去除,要不然影响原来的功能
  2. 通过条件编译,来使得net core项目不支持这些功能,而老项目编译时依然支持, 在新项目中添加条件编译的标志NETSTANDARD2_0,然后典型的代码如下:
                if (HttpContext.Current == null)
return ""; #if NETSTANDARD2_0
throw new NotSupportedException();
#else
return HttpContext.Current.Session.SessionID;
#endif

NotSupportedException类是我添加的一个异常类,用来在遇到我们想项目时调用了一些我们临时去掉的功能,可以很明显告诉我们代码的问题在哪里

SqlCommandBuilder

目前这个类只能利用条件编译先解决。

编译结果已经全部OK了,可以看到我的编译结果

总结

第二步的工作是来消灭错误,目前已经全部完成,第三步是迁移单元测试和集成测试项目,以及最终的多个平台运行的测试。

将 Net 项目升级 Core项目经验:(二)修复迁移后Net Standard项目中的错误的更多相关文章

  1. 将 Net 项目升级 Core项目经验:(一)迁移Net项目为Net Core\Standard项目

    迁移Net项目为Net Core\Standard项目 背景: 我们公司内部有自己ORM开发框架,最新因为需要将系统迁移到国产服务器上,所以首先需要将最基础的ORM框架改造可以运行在国产服务器上.对于 ...

  2. 将 Net 项目升级 Core项目经验:(三)迁移后的Net Standard版本的类库测试和多平台项目实测

    迁移后的Net Standard版本的类库测试和多平台项目实测 按照第一步的方法,添加一个Net Core的MSTest项目,然后将原来的测试项目下的代码迁移到新测试 项目中,然后引用新的Beyond ...

  3. 《BI项目笔记》SSAS部署时发生的问题——元数据管理器中存在错误 解决办法

    在生成和部署期间出错.是否继续?解决办法: 用Microsoft SQL Server Management Studio 连接Analysis Services 然后删除多维数据库,重新布署.这样就 ...

  4. React项目升级遇到的问题复盘(2019-09-02)

    老铁们,发没发现我换了个贼帅的头像,高端大气上档次,非洲大地我最凶!可把我自己牛逼坏了. 不扯啦不扯啦,抓紧进入今天的正题,从今天开始我会每天写一下每天工作的出现的问题,主要对这些问题出现的原因,以及 ...

  5. 开源项目MultiChoiceAdapter详解(二)——MultiChoiceArrayAdapter的使用

    MultiChoiceArrayAdapter其实就是可以多选的ArrayAdapter了,ArrayAdpter我们已经很熟悉了.MultiChoiceArrayAdapter这个类是抽象类,所以使 ...

  6. [Golang]一些书城项目中出现错误的原因和解决办法(一)

    跟着B站尚硅谷的GoWeb教程写书城项目,整理一下自己写的时候出现的错误和解决办法. 错误一:cartItem中只能加入一种书,SQL语句没有问题,但是购物车中的总金额和总数量正确: 原因:cartI ...

  7. ASP.NET Core 实战:将 .NET Core 2.0 项目升级到 .NET Core 2.1

    一.前言  最近一两个星期,加班,然后回去后弄自己的博客,把自己的电脑从 Windows 10 改到 Ubuntu 18.10 又弄回 Windows 10,原本计划的学习 Vue 中生命周期的相关知 ...

  8. dotnet core项目升级到 .net core 2.0

    这几天无疑我们已经让.net core 2.0正式版发布的消息刷屏,这次发布整整提前了一个月的时间,关于具体的发布信息,可以去看善友大神的博客,.NET Core 2.0 正式发布信息汇总,废话不多说 ...

  9. WinForms项目升级.Net Core 3.0之后,没有WinForm设计器?

    目录 .NET Conf 2019 Window Forms 设计器 .NET Conf 2019 2019 9.23-9.25召开了 .NET Conf 2019 大会,大会宣布了 .Net Cor ...

随机推荐

  1. struct2_拦截器知识点.

    Struts2拦截器原理: Struts2拦截器的实现原理相对简单,当请求struts2的action时,Struts 2会查找配置文件,并根据其配置实例化相对的拦截器对象,然后串成一个列表,最后一个 ...

  2. [日常] Codeforces Round #440 Div.2 大力翻车实况

    上次打了一发ABC然后大力翻车...上午考试又停电+Unrated令人非常滑稽...下午终于到了CF比赛... 赛前大力安利了一发然后拉了老白/ $ljm$ / $wcx$ 一起打, 然后搞了个 TI ...

  3. python全栈开发-Day11 迭代器、生成器、面向过程编程

    一. 迭代器 一 .迭代的概念 迭代器即迭代的工具,那什么是迭代呢? 迭代是一个重复的过程,每次重复即一次迭代,并且每次迭代的结果都是下一次迭代的初始值 while True: #只是单纯地重复,因而 ...

  4. alpha冲刺第九天

    一.合照 二.项目燃尽图 三.项目进展 提问界面完成 财富值界面完成 四.明日规划 继续完善各个内容的界面呈现 继续查找关于如何自动更新爬取内容 五.问题困难 在呈现的时候还是一直会停止运行 爬取先暂 ...

  5. fs 创建文件夹

    var http = require("http"); var fs = require("fs"); var server = http.createServ ...

  6. bzoj千题计划288:bzoj1876: [SDOI2009]SuperGCD

    http://www.lydsy.com/JudgeOnline/problem.php?id=1876 高精压位GCD 对于  GCD(a, b)  a>b 若 a 为奇数,b 为偶数,GCD ...

  7. [ZLXOI2015]殉国

    2057. [ZLXOI2015]殉国 http://cogs.pro/cogs/problem/problem.php?pid=2057 ★☆   输入文件:BlackHawk.in   输出文件: ...

  8. 微信浏览器的页面在PC端访问

    微信浏览器的页面在PC端访问: 普通的在微信浏览器看的页面如果不在php代码中解析一下,然后复制链接在PC打开就出现无法访问,因为它复制的地址是: https://open.weixin.qq.com ...

  9. React 深入系列2:组件分类

    文:徐超,<React进阶之路>作者 授权发布,转载请注明作者及出处 React 深入系列2:组件分类 React 深入系列,深入讲解了React中的重点概念.特性和模式等,旨在帮助大家加 ...

  10. python3 常用模块

    一.time与datetime模块 在Python中,通常有这几种方式来表示时间: 时间戳(timestamp):通常来说,时间戳表示的是从1970年1月1日00:00:00开始按秒计算的偏移量.我们 ...