【译】在 Linux 上不安装 Mono 构建 .NET Framework 类库

在这篇文章中,我展示了如何在 Linux 上构建针对 .NET Framework 版本的.NET项目,而不使用 Mono。通用使用微软新发布的 Mocrosoft.NETFramework.ReferenceAssemblies NuGet 包,您将不需要安装除 .NET Core SDK 之外的任何其他软件包!总的来说,在 Linux 系统上构建 .NET Framework 类库时,只需要在你的项目文件中添加下面的节点即可:

背景:在 Linux 上构建 full-framework 类库

如果您正在构建 .NET Standard NuGet 软件包,并且希望为用户提供最佳体验(并避免一些依赖性),那么您将需要查看有关跨平台定位的建议。那里有很多可以做和不可以做的建议,但我倾向于将其归结为:如果您的目标是任何版本的 .NET Standard,那么您至少需要以下目标框架:

如果您的目标是.NET Standard 1.x,那么将其添加到构建目标中时,重要的是包含两个 .NET Framework 目标以避免 .NET Standard 2.0 垫片出现问题。

这就引出了一些问题 - 完整的 .NET 框架目标理论上只能在 Windows 上构建。在上一篇文章中,我展示了如何通过安装 Mono 并使用它提供的程序集来解决这个问题。在那篇文章中,我也展示了在 Linux 上运行 .NET Framework 测试套件。到目前为止,这对我来说非常有效,但它有几个缺点:

  • 它需要你安装 Mono

  • 它需要添加一个有点hacky .props文件

  • 它没有得到官方的支持,所以如果它不起作用,你就得自己想办法

.props 文件将 FrameworkPathOverride MSBuild 变量设置为 Mono 引用程序集,这是我们能够构建的方式。但正如 Jon Skeet在评论中指出的那样,Mono 实际上并不是必需的。我们只需要一种方法来轻松获取要编译的引用程序集。那就是微软提供的 Microsoft.NETFramework.ReferenceAssemblies 包。

通过 NuGet 使用程序集 Microsoft.NETFramework.ReferenceAssemblies

在我看到 Muhammad Rehan Saeed 的这条推文之前,我完全没有注意到 Microsoft.NETFramework.ReferenceAssemblies NuGet 包。这是一条非常棒的信息,构建 full .NET Framework 类库只需要在 Linux 上安装 .NET Core SDK !

我们来举个例子吧。

您可以使用  dotnet new classlib  创建一个 .NET Core 类库,它将提供一个如下所示的 .csproj 文件:

 修改 .csproj 项目文件,添加更多的构建目标:

 如果此时尝试在 Linux 上使用  dotnet build ,您将看到类似以下内容的错误:

 终于到了见证奇迹的时刻。添加 Microsoft.NETFramework.ReferenceAssemblies NuGet 包到你的项目文件:

 再次执行  dotnet build ,竟然构建成功了。

使用 PrivateAssets 特性可防止 Microsoft.NETFramework.ReferenceAssemblies 包“泄漏”到依赖项目或已发布的 NuGet 包中;它只是一个构建时依赖。

只需将软件包添加到项目中就可以获得比安装 Mono 更好的体验。最重要的是,这将是从现在开始 .NET Core 支持的方法。并且在 .NET Core 3.0 SDK 中它将变得更好,必要时 .NET Core SDK 将自动引用此包,所以,理论上根本不需要我们手工编辑项目文件添加配置节点去构建 .NET Framework 项目!

它是如何工作的:a meta-package, a .targets, and lots of dlls

如果你对包的工作方式感兴趣,我建议你阅读相关的问题,但我会在这里提供一个高级的大纲。

我们将从 Microsoft.NETFramework.ReferenceAssemblies NuGet 包本身开始。这个包是一个不包含代码的元包,但是对于每个受支持的 .NET Framework 版本都依赖于不同的 NuGet 包:

640?wx_fmt=png

例如:以 .NET Framework 4.6.1 为目标时将依赖 Microsoft.NETFramework.ReferenceAssemblies.net461。此方法可以确保您只会下载到与目标框架一致的 NuGet 包。

如果你打开一个特定 Framework 的 NuGet 包,你会在 build 文件夹中发现两件事:

  • 一个 .targets 文件

  • 一个 .NETFramework 文件夹,其中包含引用的全部程序集(> 100MB)

.targets 文件与我上一篇文章中的 .props 文件的用途类似 - 它告诉 MSBuild 在哪里可以找到框架库。以下示例来自.NET 4.6.1包: 

 这会将 TargetFrameworkRootPath 参数设置为包含 .targets 文件的文件夹。MSBuild 遍历 NuGet 包的文件夹结构(.NETFramework \ v4.6.1),找到dll,并找到引用程序集: 

640?wx_fmt=png

我已经使用.NET Core 2.1 SDK 和 2.2 SDK 测试了这些软件包,并且它的工作时间都非常出色。试试看!

Reference

  • GitHub Issue: Build for desktop framework on non-windows platforms

  • PR for the Microsoft.NETFramework.ReferenceAssemblies package design

  • Blog post: Building .NET Framework ASP.NET Core apps on Linux using Mono and the .NET CLI

  • Example of replacing approach from previous post to use approach in this post

原文链接:https://andrewlock.net/using-reference-assemblies-to-build-net-framework-libararies-on-linux-without-mono/ 


.NET社区新闻,深度好文,欢迎访问公众号文章汇总 http://www.csharpkit.com 

640?wx_fmt=jpeg


本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/314620.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

hdu 5023 线段树染色问题

题目链接 A Corrupt Mayor’s Performance Art Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 100000/100000 K (Java/Others) Total Submission(s): 4094 Accepted Submission(s): 1418 Problem Description Corrupt governors always find ways to get dirty money…

Codeforces Round #740 (Div. 2) D2. Up the Strip dp + 分块优化 + 逆向思维

传送门 文章目录题意:思路题意: 有nnn个细胞,你初始在第nnn细胞上,假设你当前在xxx处,你每次可以进行如下两个操作: (1)(1)(1)选择[1,x−1][1,x-1][1,x−1]内一个数yyy,跳到第x−yx-yx−y个细胞…

poj 2528 线段树离散化+染色

题目链接 Mayor’s posters Time Limit: 1000MS Memory Limit: 65536K Total Submissions: 92628 Accepted: 26452 Description The citizens of Bytetown, AB, could not stand that the candidates in the mayoral election campaign have been placing their electoral pos…

Codeforces Round #740 (Div. 2) E. Bottom-Tier Reversals 构造

传送门 文章目录题意:思路:题意: 给你一个长度为奇数nnn的排列aaa,每次可以选择长度为奇数的前缀,并将[1,len][1,len][1,len]翻转,你需要用不超过5n2\frac{5n}{2}25n​次操作将其变成有序的,输…

DevOps书单:调研了101名专家,推荐这39本必读书籍

任何一个领域都遵循从新人到熟手,从熟手到专家的路径。在成长过程中,DevOps人经常会陷入没人带,没人管,找不到职业方向的迷茫。DevOps是在商业演进与企业协作的进化过程中诞生的一个全新职业,被很多人看成是一个“全栈…

模板:Prime最小生成树堆优化 + Dijkstra单源最短路堆优化

Dijkstra 单源最短路堆优化 #include<bits/stdc.h> using namespace std; typedef pair<int, int> PII; const int N 2e5 10; int head[N], to[N], value[N], nex[N], cnt 1; int n, m, rt, st, dis[N], visit[N]; struct cmp {bool operator()(PII a, PII b) …

Gym - 102001K Boomerangs 构造 + 三元环

传送门 文章目录题意&#xff1a;思路&#xff1a;题意&#xff1a; 给你一张nnn个点mmm条边的简单图&#xff0c;让你找出尽可能多的三元环&#xff0c;要求每个三元环都不能共边&#xff0c;输出三元环数量和具体是那个。 n,m≤1e5n,m\le1e5n,m≤1e5 思路&#xff1a; 其实…

面对人性,有的选择向左,有的向右

这里是Z哥的个人公众号每周五11&#xff1a;45 按时送达有时也会有感而发&#xff0c;来加个餐&#xff5e;我的第「84」篇原创敬上前天早上&#xff0c;在36kr看到一篇文章《一个负能量的人&#xff0c;可以轻易搞垮周围人的生活》&#xff0c;讲述了可能我们每个人身边都存在…

10分钟了解分布式CAP、BASE理论

CAP理论2000年7月&#xff0c;Eric Brewer教授提出CAP猜想&#xff1b;2年后&#xff0c;Seth Gilbert和Nancy Lynch从理论上证明了CAP&#xff1b;之后&#xff0c;CAP理论正式成为分布式计算领域的公认定理。CAP定律说的是在一个分布式计算机系统中&#xff0c;一致性&#x…

2018 ICPC Asia Jakarta Regional Contest J. Future Generation 状压dp

传送门 文章目录题意&#xff1a;思路&#xff1a;题意&#xff1a; 给你nnn个串&#xff0c;字符集是a−za-za−z&#xff0c;让你在每个串种选择一个子序列&#xff0c;保证对于i<j,si<sji<j,s_i<s_ji<j,si​<sj​&#xff0c;也就是选择的串字典序是严格…

ASP.NET Core Web Api之JWT刷新Token(三)

本节我们进入JWT最后一节内容&#xff0c;JWT本质上就是从身份认证服务器获取访问令牌&#xff0c;继而对于用户后续可访问受保护资源&#xff0c;但是关键问题是&#xff1a;访问令牌的生命周期到底设置成多久呢&#xff1f;见过一些使用JWT的童鞋会将JWT过期时间设置成很长&a…

简单dfs序 + 树链剖分

树链剖分 DFS序 先来讲一讲DFS序是什么东西&#xff0c;直接上图&#xff0c;方便理解。 估计巨巨们应该知道了DFS序的两个重要的东西&#xff0c;in,outin,outin,out数组。 ininin数组就是这个点进入DFS的时间。outoutout数组就是这个点退出DFS递归栈的时间。这个时间要注意…

#3864. Hero meet devil dp套dp + 状压 + 状态机

传送门 文章目录题意&#xff1a;思路&#xff1a;题意&#xff1a; 给你一个只包含ACGTACGTACGT的串sss&#xff0c;再给你一个mmm&#xff0c;第iii行输出有多少个长度为mmm且只包含ACGTACGTACGT的串与sss的lcslcslcs为iii。 ∣s∣≤15,m≤1000|s|\le15,m\le1000∣s∣≤15,m…

WeihanLi.Npoi 导出支持自定义列内容啦

WeihanLi.Npoi 导出支持自定义列内容啦Intro之前也有网友给提出过希望列合并或者自定义列内容的 issue 或请求&#xff0c;起初因为自己做 WeihanLi.Npoi 这个扩展的最初目的是导入导出的简单化&#xff0c;使用这个扩展导出的 Excel/csv 可以直接导入成 List<TEntity>&a…

线段树优化的Dijkstra

板子 我测得的是这个东西在不开O2O2O2的情况下比pairpriorityqueuepair priority_queuepairpriorityq​ueue快了将近1/31/31/3 #include<bits/stdc.h> #define mid (l r >> 1) #define lson rt << 1, l, mid #define rson rt << 1 | 1, mid 1, ru…

P4590 [TJOI2018]游园会 dp套dp + 状态机

传送门 文章目录题意&#xff1a;思路&#xff1a;题意&#xff1a; 给你一个长度为nnn的串sss&#xff0c;其只包含NOINOINOI三个字母&#xff0c;给你一个mmm&#xff0c;代表ttt串的长度&#xff0c;ttt串包含NOINOINOI三个字母但是不存在三个连续的NOINOINOI子串&#xff…

让 .Net 更方便的导入导出 Excel

让 .Net 更方便的导入导出ExcelIntro因为前一段时间需要处理一些 excel 数据&#xff0c;主要是导入/导出操作&#xff0c;将 Excel 数据转化为对象再用程序进行处理和分析&#xff0c;没有找到比较满意的库&#xff0c;于是就自己造了一个轮子&#xff0c;屏蔽掉了 xlsx 与 xl…

最大流,最小费用最大流:解析 + 各种板子

网络流初步 Edmond-Karp算法 网络流的基本概念 源点&#xff0c;这个点只有流量的流出&#xff0c;没有流入。汇点&#xff0c;这个点只有流量的流入&#xff0c;没有流出。容量&#xff0c;每条有向边的最大可承受的流的理论大小。流量&#xff0c;每条有向边的最大可承受的…

Codeforces Round #741 (Div. 2) D2. Two Hundred Twenty One (hard version) 前缀和 + 分段模型

传送门 文章目录题意&#xff1a;思路&#xff1a;题意&#xff1a; 给你一个长度为nnn的串&#xff0c;代表111&#xff0c;−-−代表−1-1−1&#xff0c;让后有qqq个询问&#xff0c;每次询问[l,r][l,r][l,r]区间&#xff0c;将这段区间的数拿出来&#xff0c;设为a[1,r−l…

Zend创始人离职原来早已安排好

前边我们报导过&#xff0c;PHP 兼 Zend 公司联合创始人 Zeev Suraski 宣布目前已经从工作了 20 年的 Zend 公司离职。2 日晚间&#xff0c;知名 PHP 开发者&#xff0c;同时也是 PHP JIT 主力鸟哥&#xff08;惠新宸&#xff09;在朋友圈中曝出猛料&#xff1a;原来一切都是安…