接上一章,项目编译结果以下: html
在Net Framework项目的引用以下: git
各引用和做用:github
这些老的项目引用是不能直接用在Net Standard项目上的,解决过程以下:web
新项目的引用截图: sql
Net 和 MS Sql Server交互大多经过Syste.Data.SqlClient.dll中相关类操做,在Core项目中,项目中经过引用Nuget中的 System.Data.SqlClient包,便可修复。数据库
Net Core\Standard再也不支持System.Data.OleDb。 目前没有找到相关 Net Core\Standard 中官方有相关的类库来替代。 因此在编译Net Core\Standard项目时,经过项目文件去除相关类。缓存
移除编译的方式很简单,使用文本编辑器,打开.csproj文件: 以前咱们经过添加一下配置,将代码以快捷方式添加到新项目中session
<ItemGroup> <Compile Include="..\..\Beyondbit.Framework\**\*.cs" /> </ItemGroup>
将咱们不须要的功能排除掉,使用如下语法:mvc
<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 中下载,这个我没有试过是否有效。
在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》,验证是有效的。
实测使用System.Configuration.ConfigurationManager 4.4.1 版本读取配置时,在Web项目或者控制台应用,均可以顺利读取。但我在vs2017建立的MSUnit的测试项目运行集成测试时,读取失败了。目前还没找到方法解决,后续我会反馈BUG在github上。
当建立 .NET Core/Standard 2.0项目时,VS不会像.NET Framework项目同样自动生成AssemblyInfo.cs文件。 并且,如果手工在项目中加入之前写好的 AssemblyInfo.cs 文件,编译时会报告“CS0579: Duplicate 'AssemblyFileVersionAttribute' attribute”错误.
参考zyl910同窗的文章解决,验证有效。
在咱们的老项目,代码里面可能会判断当前是否在Web环境下,会读取一些之前特定的代码,这个问题是最难处理的。如如下代码: 能够看到编译提示HttpContext在老项目能够,在新项目显示不可用,并出现红线。这是由于在NetCore中System.Web的命名空间不在包含HttpContext类了。经过查询一些文章,有不少的文章都描述了如何在Net Core下,模拟HttpContext.Current的。如:
等等文章。
可是它们都提到了须要在Startup类经过ioc注入东西,个人项目只是一个类库,他能够运行在任何环境下,我该如何在类库中使用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; } } }
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没法兼容。
目前无奈的作法是:
if (HttpContext.Current == null) return ""; #if NETSTANDARD2_0 throw new NotSupportedException(); #else return HttpContext.Current.Session.SessionID; #endif
NotSupportedException类是我添加的一个异常类,用来在遇到咱们想项目时调用了一些咱们临时去掉的功能,能够很明显告诉咱们代码的问题在哪里
目前这个类只能利用条件编译先解决。
总结: 第二步的工做是来消灭错误,目前已经所有完成,第三步是迁移单元测试和集成测试项目,以及最终的多个平台运行的测试。