网站域名和网址,龙岩人才网兼职招聘,江苏国龙翔建设公司网站,易名域名交易上篇#xff08;.Net基础体系和跨框架开发普及#xff09;介绍了.Net当前生态下的大概情况#xff0c;也分享了简单实现的过程#xff0c;这篇文章就是讲解我的OSS.Common项目扩展.Net Standard 支持的过程#xff0c;主要集中在#xff1a;方案的选择#xff0c;移植检… 上篇.Net基础体系和跨框架开发普及介绍了.Net当前生态下的大概情况也分享了简单实现的过程这篇文章就是讲解我的OSS.Common项目扩展.Net Standard 支持的过程主要集中在方案的选择移植检测移植过程常见问题的解决思路以及nuget的打包部署这几个方面。 在开始之前简单介绍下OSS.Common项目的涉及的内容方便了解后边所遇到的问题。这个类库是相对简单的一个基础类库提供主要有以下的内容1. 基础用户系统设备信息实体定义2. 主流加解密方案实现md5,aes,sha1,hmacsha1 3. 常规实体DTO转化静态扩展方法时间字符串等等处理 4. 基础日志缓存异步辅助静态类及默认方案实现采用了简单Provider模式使用者可以注册自己的实现方案 5. 全局结果分页实体定义。 其主要作用就是完成对常见碎化方法的收集规整方便在业务逻辑中减少不必要的消耗了解之后我们进入具体的扩展过程。 一. 方案的选择 这个其实在上篇文章中已经做了介绍当前.net core .net Frameworkmono for Xarmain等都有自己的运行时虽然使用的都是C#语法但是类库在不使用可移植或者标准库的前提下不能直接互相调用。随着.net standard 2.0的即将推出.net coreasp.net core 的应用场景会越来越普遍对旧有项目的兼容需求会越来越强烈oss.common也是遇到这个问题所以我将对它进行.net standard支持的扩展。 由于当前项目现在在好几个.net framework的项目中还在使用为了旧项目中对net45的版本的支持不能丢失所以我会保留两套解决方案一个为.net Standard 提供支持一个为.net framework使用两个类库项目共享同一套代码文件针对Framework特有功能通过条件编译来控制。github上目录结构已更新欢迎查看。 二. 移植检测 在移植之前我们需要对移植有个大概评估了解需要代码改动的覆盖面积确定代码的可移植性这里推荐使用微软官方提供的移植检测工具ApiPort或者使用它的VS扩展。这里我使用的是vs插件安装完插件之后打开解决方案查看右键菜单会有如下两个选项 首先点击第二个选项配置要检测的移植对比版本如下图 完成对应的检测版本之后点击确定点击第一个选项执行分析过程会生成html和xsl两种报表html报表界面如下所示 报表中会给出对应版本的接口覆盖情况以及相关的建议可以说是比较详细了。 三.移植过程 经过上边的检测可以看出oss.common项目 在.net standard1.4下大概超过20%的代码不能直接提供支持我看了一下主要集中在涉及配置缓存反射等特有属性相关代码中这个还算在预期之中不过看到一堆的红叉叉还是一阵头疼没办法自己的类库哭着也要码完下边介绍下移植的步骤。 1. 添加项目文件 为了项目直观和方便管理我将原来的OSS.Common类库修改名称为OSS.Common.NET45新建一个OSS.Common的标准库项目两个项目文件放在同一目录下说明一下vs2015如果要建标准库项目需要先建可移植类库在类库属性页修改如果不清楚请看上一篇文章介绍。 这个时候如果你直接生成OSS.Common.NET45的项目是会出现报错的哪怕你没有做任何实际的代码的操作主要是因为添加可移植类库需要project.json的文件进行依赖管理当他们在同一目录下时nuget会把project.json中的依赖默认执行还原操作虽然你当前是在生成OSS.Common.NET45项目没办法就是这么傻如果你遇到了这个错误在当前目录中再建一个对应当前项目文件的project.json文件就好了这里我添加了OSS.Common.Net45.project.json文件文件中添加如下代码 {frameworks: {net45: {}},runtimes: {win: {}}} 2. 代码集成 新建好对应的解决方案之后把代码文件附件到新建的标准库下这个时候直接生成会有很多错误这个时候我们就需要祭出条件编译这个大招了因为以后主要是维护标准库所以我在旧NET45的旧项目上新建了NETFW的条件编译符号 剩下的就是一个个错误完善了。 在处理兼容的过程中主要会面临这几个问题1. 标准库完全不支持 2. 标准库和Framework的调用方法不一样 3. 可以间接完成标准库的实现 这里我把我遇到的情况各举一个例子供大家参考 1. 标准库完全不支持这个最典型的就是缓存模块在.net standard下System.Runtime.Caching类库完全被移除了没办法只能使用#if NETFW 完全把Module模块下的默认Cache实现给屏蔽了只能在Framework下才能使用默认实现本来打算自己实现一个缓存类的不过发现可能会带来不可预知bug作废。 2. 标准库和Framework的调用方法不一样举个例子就是Type类型下的IsEnum属性在net standard下需要.gettypeinfo().IsEnum才可以举例代码 #if NETFWif (!enType.IsEnum)#elseif (!enType.GetTypeInfo().IsEnum)#endif 3. 可以间接完成标准库的实现这常见的如 list的ConvertAll方法在Framework下有默认实现的标准库下是没有的这里我在ConvertExtention类自己定义了个一个 #if !NET40public static ListTResult ConvertAllTPara, TResult(this ListTPara list, FuncTPara, TResult func){if (list null)return null;var resultList new ListTResult(list.Count);list.ForEach(e resultList.Add(func(e)));return resultList;}#endif 当然还会有其他的一些问题不过还好基本都已经解决如果有不清楚的可以去下载oss.common代码自行查看 四. nuget打包部署 这个相对简单在两个解决方案中分别生成对应的dll在lib文件夹中分别添加net45 和 netstandard1.4 文件夹添加对应的dll就行。 需要注意的一点就是最好添加个各自的依赖举个例子标准库的Hmacsha1加密算法在“System.Security.Cryptography.Algorithms” dll程序集下如果在调用项目中没有引用这个dll生成是不会报错的但是当代码执行调用的时候就会弹出程序集未找到的错误当然如果发现这个问题也可以通过nuget线上安装命令install-package安装。 给大家看下我的nuget文件配置 如有其它疑问欢迎关注公众号osscoder 原文地址http://www.cnblogs.com/sunhoy/p/6380478.html.NET社区新闻深度好文微信中搜索dotNET跨平台或扫描二维码关注