如果你对 .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. 解决 SHADERed无法打开,报错 缺失XINPUT1_4.DLL 文件的办法

    起因: 在给某个不知名的同事安装软件时遇到的一个问题,安装完成后打开软件报错:SHADERed无法打开,报错 缺失XINPUT1_4.DLL ,C++依赖项均已打上,卸载C++插件后依然报错只能找缺失 ...

  2. 10-04 NOIP模拟赛

    10-04 NOIP模拟赛 喜提80+30+10=120分 T1 水管(flow) 题目描述 某国有 \(n\) 个城市,水利调配非常有问题,这导致部分地区出现严重的缺水,而部分地区却全年洪灾泛滥.政 ...

  3. Electron.Net + Linux + Blazor 初尝备忘录

    Electron 是使用 JavaScript,HTML 和 CSS 构建跨平台的桌面应用程序的一个框架, Electron.NET 是.net 下对 Electron 的封装实现, 通过它可以比较容 ...

  4. USB总线-Linux内核USB设备驱动ftrace分析(十一)

    1.简介 USB Gadget Driver定义了很多trace event,使用者可以在用户空间通过ftrace接口,追踪USB Gadget Driver的行为. USB设备控制器驱动定义的tra ...

  5. /proc/pids/smaps

    Linux内存管理 -- /proc/{pid}/smaps讲解 基本介绍 /proc/PID/smaps 文件是基于 /proc/PID/maps 的扩展,他展示了一个进程的内存消耗,比同一目录下的 ...

  6. Python:条件分支 if 语句全讲解

    Python:条件分支 if 语句全讲解 如果我拿出下面的代码,阁下该做何应对? if not reset_excuted and (terminated or truncated): ... els ...

  7. 04 Transformer 中的位置编码的 Pytorch 实现

    1:10 点赞 16:00 我爱你 你爱我 1401 class PositionalEncoding(nn.Module): def __init__(self, dim, dropout, max ...

  8. Android复习(三)清单文件中的元素——>action、activity-alias、category、compatible-screens、data

    <action> 语法: <action android:name="string" />   包含于: <intent-filter> 说明: ...

  9. 在 Kubernetes 中实现微服务应用监控

    张坚,科大讯飞开发工程师,云原生爱好者. 本篇文章我们基于 Prometheus 和 Grafana 实现微服务应用监控. KubeSphere 平台本身提供了监控功能,包括节点状态.集群资源使用率. ...

  10. SpringBoot入门到精通(十三)日志:别小看它,否则吃亏的是自己!学会你也可以设计架构

    别小看他,当你面对的时候,就会知道,多么痛的领悟! 如何在 Spring Boot 中使用 Logback 记录详细的日志? 整合LogBack,Log4J...等,是不是很多方法!但需要注意,我讲的 ...