如果你对 .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. Spring事务的1道面试题

    每次聊起Spring事务,好像很熟悉,又好像很陌生.本篇通过一道面试题和一些实践,来拆解几个Spring事务的常见坑点. 原理 Spring事务的原理是:通过AOP切面的方式实现的,也就是通过代理模式 ...

  2. localStorage 、 sessionStoarge 和 cokies 的区别

    1. 三者的概念 1.1 cookies Cookie,有时也用其复数形式 Cookies.类型为"小型文本文件",是某些网站为了辨别用户身份,进行Session(会话)跟踪而储存 ...

  3. HDU-ACM 2024 Day3

    T1004 游戏(HDU 7460) 注意到对于两个人,他们 \(t\) 轮后能力值相同的概率只与他们初始时的能力差有关,所以我们先 \(\text{FFT}\) 求出 \(|a_i - a_j| = ...

  4. 使用 GPU-Operator 与 KubeSphere 简化深度学习训练与 GPU 监控

    本文将从 GPU-Operator 概念介绍.安装部署.深度训练测试应用部署,以及在 KubeSphere 使用自定义监控面板对接 GPU 监控,从原理到实践,逐步浅析介绍与实践 GPU-Operat ...

  5. centos下搭建php开发环境(lamp)

    由于个人非常喜欢爱linux系开发php项目. 因为某些原因,经常需要手动搭建环境 经常在网上找到的教程经常不太一样 虽然最终都能完成搭建,但是总是觉得不太爽 还不如自己写一篇,需要的时候肯定能找到 ...

  6. [快速阅读八] Matlab中bwlookup的实现及其在计算二值图像的欧拉数、面积及其他morph变形中的应用。

    以前看过matlab的bwlookup函数,但是总感觉有点神秘,一直没有去仔细分析,最近在分析计算二值图像的欧拉数时,发现自己写的代码和matlab的总是对不少,于是又去翻了下matlab的源代码,看 ...

  7. C语言实战项目——学生试卷分数统计

    1.题目要求 作为教师,考试以后对试卷进行分析和研究是必须做的一项工作,假定某学校要求老师在考试之后填写的一个表格,并要求教师根据考试分数分布情况画出直方图.下面就来解决这个实际问题. 2.题目分析 ...

  8. postcss-px-to-viewport 移动端适配

    以前做移动端项目的时候都是用rem来做适配,现在基本上都是通过viewport单位来做. postcss-px-to-viewport就是一个将px单位转换为视口单位的 (vw, vh, vmin, ...

  9. python库asyncio的概念和用法

    python 库 asyncio asyncio 是 Python 的标准库之一,用于编写异步应用程序.它提供了事件循环.协程.任务和其他工具来处理并发操作.以下是一些关于 asyncio 的基本概念 ...

  10. GetUrlParam:获取Url参数,返回一个对象

    function GetUrlParam(){ let url = document.location.toString(); let arrObj = url.split("?" ...