把项目往.net core上迁移的时候,一个最大的问题就是和.net framework相比,有一部分api缺失。它主要分为两类:

  • Windows 独有的api,如注册表
  • 未完成的功能,如System.Drawing

 Microsoft.Windows.Compatibility库极大的改善了这一问题。它对大部分常用的库都加以了补充。新增了了2万多api,如drawing, EventLog, WMI, Performance Counters, 和 Windows Services等这些常用的库都得到了较好的支持。

根据MS的计划,到.net 3.0后,winform和wpf也会以扩展包的方式兼容到.net core中,到时候估计就彻底的取代.net framework了。

但是,这个库其实包括十几个子库组成的,由于是扩展包,发布的时候也会多发布十几个dll,如果嫌发布的dll太多的话,也可以安装具体的子程序包。不知道以后微软是是否会像asp.net core那样发布一个runtime的安装包。

windows独占api跨平台问题

需要注意的是,一些扩展包的api是windows独占的。以注册表为例,虽然.net core提供了这些扩展的程序包,在windows上也运行正常,但由于.net core是跨平台的,这些库在linux或mac上是会抛异常的,因为这些系统根本没有注册表,无法支持。要解决这个异常,就涉及到了如下两个问题。

首先,如何发现这些不能跨平台的api? 微软提供了 API Analyzer tool可以帮助我们快速发现这些api。

其次,如何处理这些不能跨平台的api?如果需要我们的程序跨平台的话,一般有如下方法

  • 移除: 移除这些不能跨平台的功能
  • 替换: 使用能跨平台的功能替换它
  • 单独处理:对于windows平台,使用独占api,对于其它平台,使用其它方案替换。

前面两种就不说了,第三种方案才是我们最常用的,这就涉及到另一个问题了:如何判断我们的程序处在哪个平台下。这里需要用到RuntimeInformation.IsOSPlatform这个api了,简单的示例如下:

    RuntimeInformation.IsOSPlatform(OSPlatform.Windows)

限于篇幅所限,本文就介绍到这里,如果想对Windows Compatibility Pack有进一步的了解,可以参看官方文档Windows Compatibility Pack

通过Windows Compatibility Pack补充.net core中缺失的api的更多相关文章

  1. 在 .NET Core 中构建 REST API

    翻译自 Camilo Reyes 2020年8月26日的文章 <Build a REST API in .NET Core> [1] REST API 可以使用简单的动词(如 POST.P ...

  2. EF Core中通过Fluent API完成对表的配置

    EF Core中通过Fluent API完成对表的配置 设置实体在数据库中的表名 通过ToTable可以为数据模型在数据库中自定义表名,如果不配置,则表名为模型名的复数形式 public class ...

  3. 分析现有 WPF / Windows Forms 程序能否顺利迁移到 .NET Core 3.0(使用 .NET Core 3.0 Desktop API Analyzer )

    今年五月的 Build 大会上,微软说 .NET Core 3.0 将带来 WPF / Windows Forms 这些桌面应用的支持.当然,是通过 Windows 兼容包(Windows Compa ...

  4. 使用.NET Core中创建Windows服务(一) - 使用官方推荐方式

    原文:Creating Windows Services In .NET Core – Part 1 – The "Microsoft" Way 作者:Dotnet Core Tu ...

  5. [译]如何在.NET Core中使用System.Drawing?

    你大概知道System.Drawing,它是一个执行图形相关任务的流行的API,同时它也不属于.NET Core的一部分.最初是把.NET Core作为云端框架设计的,它不包含非云端相关API.另一方 ...

  6. 在.NET Core中使用Jwt对API进行认证

    在.NET Core中想用给API进行安全认证,最简单的无非就是Jwt,悠然记得一年前写的Jwt Demo,现在拿回来改成.NET Core的,但是在编码上的改变并不大,因为Jwt已经足够强大了.在项 ...

  7. [译]如何在ASP.NET Core中实现面向切面编程(AOP)

    原文地址:ASPECT ORIENTED PROGRAMMING USING PROXIES IN ASP.NET CORE 原文作者:ZANID HAYTAM 译文地址:如何在ASP.NET Cor ...

  8. .NET Core 中的日志与分布式链路追踪

    目录 .NET Core 中的日志与分布式链路追踪 .NET Core 中的日志 控制台输出 非侵入式日志 Microsoft.Extensions.Logging ILoggerFactory IL ...

  9. 使用 ASP.NET Core MVC 创建 Web API(一)

    从今天开始来学习如何在 ASP.NET Core 中构建 Web API 以及每项功能的最佳适用场景.关于此次示例的数据库创建请参考<学习ASP.NET Core Razor 编程系列一> ...

随机推荐

  1. 详谈ASP.NET的DataReader对象

    最近频繁用到了DataReader这个对象,其实对于DataReader,之前也用到过,说实话我个人觉得很不好懂.相比之下觉得DataSet对象好用的多,但是有时取出的数据不需要很多的时候,DataR ...

  2. 20155328 2016-2017-2 《Java程序设计》 第8周学习总结

    20155328 2016-2017-2 <Java程序设计> 第8周学习总结 教材学习内容总结 NIO与NIO2 认识NIO 相对于IO,NIO可以让你设定缓冲区容量,在缓冲区中对感兴趣 ...

  3. java学习第03天(运算符、语句)

    5.运算符 (1)算数运算符 //算数运算符:+ - * / %(取余) //++ --(自增,就是在原有数据基础上+1,再赋给原有数据) ///int x = 6370; //x = x/1000* ...

  4. DSO 优化代码中的 Schur Complement

    接上一篇博客<直接法光度误差导数推导>,DSO 代码中 CoarseInitializer::trackFrame 目的是优化两帧(ref frame 和 new frame)之间的相对状 ...

  5. 【转载】maven pom详解(2)

    setting.xml主要用于配置maven的运行环境等一系列通用的属性,是全局级别的配置文件:而pom.xml主要描述了项目的maven坐标,依赖关系,开发者需要遵循的规则,缺陷管理系统,组织和li ...

  6. Shell脚本实现非法IP登陆自动报警【转】

    服务器的安全稳定是每个运维都希望达到的目标,毕竟网站一旦流量大了,访问高了,就会有一些无聊人来攻击,帮忙检测漏洞是好,但纯ddos的性质就很恶劣了.说远了,这篇文章只是检测有非法ip登录到服务器上就自 ...

  7. springcloud配置详解

    Spring Boot的配置参考Spring Boot系列文章,这里只对Spring Cloud用到的配置解释. spring.application.name:配置应用名称,在注册中心中显示的服务注 ...

  8. fastdfs:安装nginx

    #安装依赖 yum -y install gcc yum -y install gcc-c++ yum -y install zlib-devel yum -y install pcre-devel ...

  9. java 其它可选方法

    异常处理的一个原则时,只有当你在知道如何处理的情况下才捕获异常,异常处理的一个重要目标时将错误处理代码同错误发生的地点相分离. "被检查异常"强制你在还没准备好处理错误的时候被迫加 ...

  10. 自己动手破解rar密码-ruby脚本实现

    破解密码,上策是社工的方式,下策则是暴力破解了.这里使用暴力破解,字典文件放在txt中:通过调用winrar的相关参数进行操作.经过测试,当字典中密码为100个时,破解耗时8秒(个人配置:i5-321 ...