如果你对 .net core 做了任何重要的提交,你就需要为 .net framework 共享同样的库,因为,.net core 是一个新兴的系统生态系统,仍然缺失很多部分。

在混合系统中,你有两个选项来共享库。首先,你可以开发一个 .net 标准库,只要版本匹配,就可以直接共享。或者,你可以使用多目标方式对多于一个的平台进行交叉编译。

通过 .NET Standard 方式共享

Microsoft 引入了 .NET Standard 以提供在微软生态下的公共标准。它可以看作是可移植类库 PCL 的后继者,简化了针对不同平台的业务。 在PCL 基于平台能力的配置中, .NET Standard 提供了精心选择的 API 集。

结果就是你可以创建可以直接用于 .NET Framework 和 .net core 的库(甚至包括 Xamarin )。你只需要确保 .NET Standard 库的 Nuget 包添加到 .NET 应用中。

现在已经有半打的 .NET Standard 存在,所以并不能立即搞清楚目标版本,感觉走了 DLL 地狱,来了 .NET Standard 地狱。简单来说,越高版本的 .NET Standard 就提供越多的 API 可用,而越低的版本支持的平台越多。

与任何 .net core 迁移过程一样,你将是依赖项的囚徒,尽管适配 .NET Standard 的公共库越来越多,对低于 1.3 的支持相当有限,从实践的角度来说,你可以从 .NET Framework 4.6 开始。

许多开发者在产品中有混合的 .NET Framework 版本。这使得适配 .NET Standard 相当困难,特别是大型系统。你会惊讶于在黑暗的角落中有如此多的 .NET 4.0 甚至 .NET 3.5 代码。尽管 4.5.2 仍然被微软支持,但是它仅限于 .NET Standard 1.2.

多目标

对于无法保证特定版本的 .NET Framework 的混乱系统来说,多目标可以帮助扩大共享库的范围。这允许你编译单个的本地相关,而对生成 .NET Standard 版本和你需要的 .NET Framework 版本。尽管代价是你需要管理多组的编译输出。

从 VS 2017 开始,这变得更加直接。

多版本的体验并不一致,在 VS 2015 中,使用老式的基于 JSON 的 xproj 格式。可以为一个项目选择多个框架,但是无法在 .NET Framework 项目中引用。需要采用一些非常困难的技巧:要么将项目迁移到 xproj 结构中,要么使用 NuGet 发布,两种方式都不理想。

在新的版本中,这个问题已经得到了解决,但你仍然需要手动编辑项目文件以使其工作。在手工修改 framework 之后建议重新加载解决方案。

下面的示例展示了如何调整 TargetFramework 元素以使项目编译到多于一个的 framework

<PropertyGroup>
<TargetFrameworks>net452;netstandard1.3</TargetFrameworks>
</PropertyGroup>

在编译项目的时候,你将发到在 bin 文件夹中有两个输出,每个都是 framework 特定的。这使得你可以创建生成共享程序集的项目,针对 .NET Framework 4.5.2 或者任何 .NET Core 1.0

迁移现有库

在规划共享库的时候,应牢记 .NET Standard 是基于 .NET Framework 的一个子集。您已经习惯在 .NET Framework 中使用的许多 API 不是 .NET Standard 的一部分了。特别是被 .net core 重构的领域中。

将现有的 .NET Framework 库实现为 .NET Standard 库不可避免地需要迁移,类似于移植到 .net core 。微软的 API 迁移工具可以告诉你这将需要涉及多少工作。这个命令行工具,ekyi为你提供导致兼容性问题的类型和成员的详细信息。某些情况下,需要特定版本的 .NET Standard ,某些情况则不支持。

重复一下,最大的困难可能是外部的依赖库。多目标方式仅仅可以用于,在项目的所有依赖支持你的目标框架的时候。某些差异可以通过条件编译进行平滑处理,但是,.NET Standard 的主要意图之一就是消除此类变通的方法。

很快...... 统一和兼容垫片

共享代码的所有问题将由 .NET Standard 2.0 标准更为容易处理。该版本允诺将提供单个 API 集合,支持跨 .NET Core 2.0、.NET Framework  4.6.1 和 Xamarin。承诺提供一个兼容性的垫片,将支持 .NET Framework 程序集直接用于 .NET Standard 库。例外是对不受 .NET Standard 支持的 API 的旧的 framework 版本或者程序集,是行不通的。

尽管有这样的限制,微软认为,在 Nuget 中超过 60% 的常用 .net framework 包可以通过垫片兼容 .NET Standard。这使得遗留的 .net  framework 库将可以通过 .net  standard 兼容。

永远不能共享的部分

尽管 .NET Standard 2.0 承诺的标准日益增强,但是仍然有一些领域永远不会成为 .net core 的一部分。作为 Windows 通用应用的新 UI 原则, Windows Form 和 WPF 将永远保留在 .net framework 中,任何平台特定的内容将被排除在外。例如,你不能使用 .net core 构建 Windows 服务,或者平台特定的进程管理器,例如 windows 中的 NSSM 或者 Linux 中的超级用户。

WCF 的命运有点含糊,仍然有一个团队在开发,但是看起来并不重要。对于在 WCF 中进行了大量投资的人来说不是好消息。这可能会造成体系的屏障,将比一对 .net framework 依赖更难解决。

原文地址

http://www.ben-morris.com/sharing-libraries-between-net-core-and-net-framework-applications/

在 .net core 与 .net framework 应用之间共享库的更多相关文章

  1. .NET Core 和 .NET Framework 之间的关系

    引用一段描述:Understanding the relationship between .NET Core and the .NET Framework. .NET Core and the .N ...

  2. .net core .NET Core与.NET Framework、Mono之间的关系

    .NET Core与.NET Framework.Mono之间的关系 首先想要知道.NET Core与.NET Framework.Mono之间的关系,就必须他们分别是什么,有什么用途? 一. .ne ...

  3. ASP.NET Core 开发-Entity Framework (EF) Core 1.0 Database First

    ASP.NET Core 开发-Entity Framework Core 1.0 Database First,ASP.NET Core 1.0 EF Core操作数据库. Entity Frame ...

  4. ASP.NET Core 开发 - Entity Framework (EF) Core

    EF Core 1.0 Database First http://www.cnblogs.com/linezero/p/EFCoreDBFirst.html ASP.NET Core 开发 - En ...

  5. [UWP小白日记-11]在UWP中使用Entity Framework Core(Entity Framework 7)操作SQLite数据库(一)

    前言 本文中,您将创建一个通用应用程序(UWP),使用Entity Framework Core(Entity Framework 7)框架在SQLite数据库上执行基本的数据访问. 准备: Enti ...

  6. .Net Core vs .Net Framework 如何为一个应用程序选择一个运行时

    .Net Core是下一件大事吗?我已经使用了一段时间了,我倾向认为它是.事实上,我们推测,在2018年,对这项技术熟练的开发人员将会有巨大的需求.但是它和.Net Framework的区别是什么?你 ...

  7. 一场关于 .net core 和 .net framework 编码的案情分析

    案情背景 目前公司做新项目,基本所有新项目都是用.net core来做,旧项目一半还是基于 .net framework下面,一半已经迁移到了core平台.在做新项目的时候,有个功能需要对接到旧项目那 ...

  8. .Net Core vs .Net Framework 如何为一个应用程序选择一个运行时(翻译)

    .Net Core是下一件大事吗?我已经使用了一段时间了,我倾向认为它是.事实上,我们推测,在2018年,对这项技术熟练的开发人员将会有巨大的需求.但是它和.Net Framework的区别是什么?你 ...

  9. .NET Core 和 .NET .Framework 速度比较

    废话不多说! 一下是 .NET core 和 .NET framework 速度对比. 两者使用最慢的冒泡排序算法:  排序10万条数据 次数 .NET CORE(耗时) .NET framework ...

  10. 【ASP.NET Core MVC 入门须知】Net Core和Net Framework 的区别

     1.简单介绍 从上面图中我们可以看到.net  主要分为三个部分 .net FrameWork,.net Core ,Xamarin XAMARIN  主要用来构建APP的主要用的是C#语言 .NE ...

随机推荐

  1. C#/.NET/.NET Core开发实战教程集

    DotNetGuide介绍 DotNetGuide是一个专注于C#/.NET/.NET Core学习.工作.面试指南的GitHub知识库,该知识库在GitHub中Star数已突破6.5k+当然这离不开 ...

  2. Android libusb

    一.环境:配置NDK环境 1.下载libusb源码: https://github.com/libusb/libusb/releases,如下图所示 2.删除一些和Android平台无关的文件,删除后 ...

  3. 我对CMD 和 AMD 的理解 ?

    都是模块规范,和 CommonJs 一样都是社区规范,ES-module 才是官方规范,而且官方规范是趋势 : AMD:Asynchronous Module Definition  异步模块定义,即 ...

  4. 别人可以访问本项目的ip地址

    .markdown-body { line-height: 1.75; font-weight: 400; font-size: 16px; overflow-x: hidden; color: rg ...

  5. gcc各等级优化的性质

    原帖地址:CSDN「隨意的風」gcc 中-O -O1 -O2 -O3 -Os -Ofast -Og优化的原理 一般来说,如果不指定优化标识的话,gcc就会产生可调试代码,每条指令之间将是独立的:可以在 ...

  6. Games101 作业8 质点弹簧系统

    目录 1 前言 2 基础数据结构 3 欧拉 4 Verlet Integration 4.1 Constraints 1 前言 质点弹簧系统的模拟仿真,其实非常简单,核心就是牛顿第二定律 \(F = ...

  7. myBatis插入操作获取不到返回的自增id问题

    myBatis插入操作后想返回自增 id 有多种方式 其中一种使用率较高的就是: 在<insert></insert> 标签中添加 useGeneratedKeys 和 key ...

  8. CSS动画(毛玻璃按钮)

    1.整体效果 https://mmbiz.qpic.cn/sz_mmbiz_gif/EGZdlrTDJa4ofJ9W4ibgD5asQcBesp1f1CXVnrQmicnzqDPskBNEQC4ia0 ...

  9. 本地文件包含漏洞详解与CTF实战

    1. 本地文件包含简介 1.1 本地文件包含定义 本地文件包含是一种Web应用程序漏洞,攻击者通过操控文件路径参数,使得服务器端包含了非预期的文件,从而可能导致敏感信息泄露. 常见的攻击方式包括: 包 ...

  10. LVM 使用与扩容总结

    转载请注明出处: LVM(Logical Volume Manager,逻辑卷管理器)是一个用于Linux系统的磁盘管理工具.它提供了一种更加灵活的存储管理机制,可以方便地进行磁盘的扩容.缩减.快照以 ...