Dotnet Core应用跨框架版本运行

有时候,我们真想用新框架,可也真不想改代码。

有一个前置的知识需要了解,就是微软 Dotnet Core 框架的版本体系。我前边的文章「Dotnet Core使用特定的SDK&Runtime版本」有详细的说明,可以去翻翻看。

前言

有一个旧应用,是在 Dotnet Core 2.1 下编译的服务端应用。本来跑的很好。最近,服务器上的 Dotnet Core Runtime 框架统一升级到 3.1,于是,这个程序就出问题了。

运行时,会报以下的错误:

% dotnet theapp.dll 
It was not possible to find any compatible framework version
The framework 'Microsoft.NETCore.App', version '2.1.0' was not found.- The following frameworks were found:3.1.11 at [/usr/share/dotnet/shared/Microsoft.NETCore.App]You can resolve the problem by installing the specified framework and/or SDK.The specified framework can be found at:- https://aka.ms

为什么会这样?

这个情况,源于微软的默认框架运行规则:Dotnet Core 应用运行时,要求运行时的版本,主版本号与编译程序的SDK版本相同,次版本号等于或高于编译程序的SDK版本。

比方我们上边这个程序,编译 SDK 的版本是 2.1.0,因此默认可以运行在装有 Dotnet Runtime 2.1.0 - 2.1.28 的所有运行时下。 

但是,现实的情况,我们希望升级框架的主版本。要知道,现在 Dotnet 5.0 已经成为常规版本,6.0 也已经到了第五个 Preview 了,升级是必然的。

那么,升级完框架后,如何升级已有的应用?

如何升级已有的应用?

通常会有这么几种方式,来升级已有的应用:

1. 升级应用的编译 SDK 版本

说白了,就是在指定的新的 SDK 版本下,重新编译重新生成。

指定特定的 SDK 版本,只需要打开对应工程的.csproj文件,在里面加入下面的内容:

<PropertyGroup><TargetFramework>netcoreapp3.1</TargetFramework>
</PropertyGroup>

这里面,我们以指定 Dotnet 3.1 为例子。

这儿要注意,5.0 之前,TargetFramework 对应的名称为 netcoreapp,例如 netcoreapp2.1、netcoreapp3.1,而 5.0 之后,微软把名称改了,变成了 net5.0、net6.0。 

这个方式,算是几种方式中,比较麻烦的一种。最基本的前提是,要有工程的源代码。

如果没有源代码,又该怎么办呢?

2. 显式覆盖运行时

Dotnet 命令行有一个参数,可以显式指定使用特定运行时版本来覆盖编译版本对应的运行时。

这个参数就是 --fx-version。

使用时,命令如下:

% dotnet --fx-version "3.1.11" theapp.dll 

还是上面的例子,这样一个命令,就可以让 2.1.0 下编译的应用,在 3.1.11 的运行时下运行。而这个 3.1.11,就是安装的运行时的版本号。 

如果不知道已安装的运行时的准确版本号,可以用以下命令查询:

% dotnet --list-runtimes
Microsoft.AspNetCore.App 3.1.11 [/usr/share/dotnet/shared/Microsoft.AspNetCore.App]
Microsoft.NETCore.App 3.1.11 [/usr/share/dotnet/shared/Microsoft.NETCore.App]

3. 显式覆盖 .runtimeconfig.json 文件

这是另一种显式改变运行时的方式。

我们观察项目的编译结果目录,会看到一个跟随应用的 .runtimeconfig.json 文件。以上面的例子来说,会叫做 theapp.runtimeconfig.json。如果没有,可以手工创建一个。

看一下它的内容:

{"runtimeOptions": {"tfm": "netcoreapp2.1","framework": {"name": "Microsoft.NETCore.App","version": "2.1.0"}}
}

在这个配置文件中,微软提供了一个前滚策略,可以通过 rollForward 来定义如果找不到要求的运行时版本,程序应该如果使用其它版本的运行时。

关于 rollForward 的详细说明,在「Dotnet Core使用特定的SDK&Runtime版本」文章中也有详细的说明,这儿就不再赘述了。我们直接看内容本例的修改内容:

{"runtimeOptions": {"tfm": "netcoreapp2.1","framework": {"name": "Microsoft.NETCore.App","version": "2.1.0","rollForward": "major"}}
}

比较前后两个文件,只是在中间加了一行:"rollForward": "major",就让这个程序在高版本的运行时下正常运行了。

重要的问题

嗯,虽然上面写了三种方式跨框架运行,但是,你一定要注意,跨框架运行,不像看上去那么简单。

你可以去骂微软。微软在做 Dotnet 主要版本的升级时,是有破坏性的更改的。也就是说,后面的版本,并不是完全兼容前边的版本的。某些类或方法,在版本升级时,都可能做了新的设计和变更,一些方法会被取消,甚至连所属的软件包,都可能发生变化。

因此,做完上面的工作后,要做仔细全面的测试。一个应用可以工作得很好,不等于每个应用都可以。

额外的内容:SDK 与 Runtime

在 Dotnet Core 体系中,SDK 与 Runtime 是完全分离的。虽然我们每次安装时,SDK 与 Runtime 总是一起安装。

SDK 的版本,仅仅是一个版本号,不同的版本之间,不具有本质的区别。版本号仅仅表示这个 SDK 支持到哪一个版本的内容。因此,我们可以从当前的 SDK 版本构建任何以前的版本,而不仅仅是当前安装的 SDK 版本。

这个话说起来有点绕,举个例子,我的机器上只装了 Dotnet Core 5.0 SDK,我也可以构建 Dotnet Core 2.0 的应用,而不需要非得装 Dotnet Core SDK 2.0。

当我们 SDK 来构建应用时,SDK 会根据构建的版本,来下载适当的引用包。这些包包含构建应用所需要的占位符、元数据和程序集。而编译系统会根据这些引用程序集来编译代码,以生成应用程序。

所以,实际在开发环境中,只需要安装最新版本的 SDK,就可以了。

运行时则不一样。在早期 Dotnet Framework 系列时,框架是向后兼容的,Framework 4.5 的框架完全可以运行 Framework 2.0 的应用程序。但到了 Dotnet Core,就不一样了,它被明确的版本所定义和区别。旧版本编译的程序,在高版本的运行时上,不一定能正常运行。 

所以,如果你装了一堆 SDK 和 Runtime,你其实可以这样清理:SDK 保留最新的版本,Runtime 保留各个主版本中最新的版本。好在,各个版本仅以目录的形式存在,清理起来很简单。

总结

Dotnet Core 跨框架运行是一个很复杂的内容,如果你从头去翻微软的文档,那会很头大。

因此,我这个文章,用尽量简单的方式,给大家入个门。

喜欢就来个三连,让更多人因你而受益

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

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

相关文章

服务器运行慢都有哪些问题,服务器数据库的运行速度很慢问题

我的服务器运行速度很慢。察看oracle进程。显示如下&#xff1a;oracle7 26111 26087 0 Apr-29 ? 00:00:04 oracledfjforacle7 5268 1 0 13:40:11 ? 00:00:01 oracledfjf (LOCALNO)oracle7 25169 1 0 15:05:48 ? 00:00:00 ora_dbw…

dw自动滚动图片_3分钟搞定图片懒加载

什么是图片懒加载图片的懒加载就是在页面打开的时候&#xff0c;不要一次性全部显示页面所有的图片&#xff0c;而是只显示当前视口内的图片&#xff0c;一般在移动端使用&#xff08;PC端主要是前端分页或者后端分页&#xff09;。为什么需要懒加载对于一个页面加载速度影响最…

获利40多万,工地技术员自学开发外挂被抓

全世界只有3.14 % 的人关注了数据与算法之美今年年初&#xff0c;江苏省公安厅召开新闻发布会&#xff0c;通报全省公安机关开展“净网”专项行动战果。随后平安江苏 在微博中公布了多个案件&#xff0c;其中有个涉及利用技术定位侵犯公民个人信息的案件。【案发】欠债老板在吃…

使用C#在VS Code中编写Notebook

提到大名鼎鼎的Jupyter Notebook&#xff0c;大家应该都听说过。它是基于网页的用于交互计算的应用程序。其可被应用于全过程计算&#xff1a;开发、文档编写、运行代码和展示结果。但是Jupyter Notebook需要使用Python编写代码&#xff0c;对.Neter不太友好。不过&#xff0c;…

缓慢渐变维度的处理方式

维度可以根据变化剧烈程度主要分为无变化维度、缓慢变化维度和剧烈变化维度。例如一个人的相关信息&#xff0c;身份证号、姓名和性别等信息数据属于不变的部分&#xff0c;政治面貌和婚姻状态属于缓慢变化部分&#xff0c;而工作经历、工作单位和培训经历等在某种程度上属于急…

显卡mx150和230哪个好_建模渲染用专业图形显卡和游戏显卡哪个更好?

最近很多朋友让小杨写配置单顺带装机&#xff0c;70%的用户是游戏需求&#xff0c;20%的是设计需求&#xff0c;为数不多的是办公需求&#xff0c;那么问题来了&#xff0c;建模渲染用专业图形显卡和游戏显卡哪个更好&#xff1f;下面小杨给大家深度剖析一番。(建模渲染)今天小…

计算机录取高考生过程,解密高考录取过程:人机结合 打造“阳光高招”

考生的档案怎么被投到志愿高校?每个院校的录取分数线怎么划定?哪些学生容易被退档?15日下午&#xff0c;记者随部分省人大代表探访设在大学城的高招录取现场&#xff0c;为您详解高招录取关键环节。先来看下文史、理工类本一批次实行的按院校平行志愿的网上录取的大致流程&a…

每日一笑 | 如果把大脑看成CPU的话...

全世界只有3.14 % 的人关注了数据与算法之美&#xff08;图片来源于网络&#xff0c;侵权删&#xff09;

C# 三种方式实现Socket数据接收(经典)

Stream.Read 方法当在派生类中重写时&#xff0c;从当前流读取字节序列&#xff0c;并将此流中的位置提升读取的字节数。语法&#xff1a;public abstract int Read(byte[] buffer, int offset, int count)参数&#xff1a;buffer: 字节数组。此方法返回时&#xff0c;该缓冲区…

SQL Sever 性能调优

checkpoint dbcc dropcleanbuffers dbcc freeproccache dbcc freesystemcache(All) dbcc opentran 如何查看磁盘I/O操作信息 SET STATISTICS IO ON 命令是一个 使 SQL Server 显示有关由 Transact-SQL 语句生成的磁盘活动量的信息。 我们在分析索引性能的时候&…

服务器运维监控指标,运维体系~指标监控~Prometheus监控告警与日志

一 Prometheus 入门1.1 入门介绍运维体系~指标监控先来一张图&#xff0c;说明一下Prometheus监控相关的软件和知识点。1: 首先要安装&#xff1a;Prometheus, 负责收集各种监控指标&#xff0c;也包括自己定监控2: 接着安装Grafana全面瓦解,负责展示监控指标3&#xff1a;接着…

小肚皮最新版本_小肚皮官方版下载_小肚皮app - Win7旗舰版

小肚皮app是一款健康瘦身应用&#xff0c;小肚皮APP倡导快乐健康的减肥方式&#xff0c;卡路里的查询功能和一些激励功能让用户互相鼓励监督&#xff0c;告别垃圾食品&#xff0c;一起管住嘴吧!同时收录了多种网友提供热门并安全健康的减肥方案&#xff0c;用户可根据自己的身体…

限时秒杀┃月销10000+件,风靡全国的steam科学实验套装

▲数据汪特别推荐点击上图进入玩酷屋之前小木有推荐过“彩虹实验”&#xff0c;这款是可以让孩子在探索中能够独立思考&#xff0c;主动地构建知识库&#xff0c;培养创造力。&#xff08;传送门&#xff09;让孩子们在家开展科学游戏&#xff0c;既能提升动手能力&#xff0c;…

面向.NET开发人员的Dapr——入门

目录&#xff1a;面向.NET开发人员的Dapr——前言面向.NET开发人员的Dapr——分布式世界面向.NET开发人员的Dapr——俯瞰DaprGet started with DaprDapr 入门In the first two chapters, you learned basic concepts about Dapr. Its time to take it for a test drive. This c…

比乐高还要好玩,50种奇妙装置玩法,将STEM教育一网打尽

▲数据汪特别推荐点击上图进入玩酷屋致砖《小小机器人》套装全新首发电动机械的完美结合先来看看视频过过眼瘾吧来自美国STEAM教育让孩子跨学科学知识积木向来是STEAM教育很重要的一部分&#xff0c;因为它涉及到了多种学科&#xff1a;要搭建得稳固——这是工程学&#xff1b;…

Tomcat详解

1 Server 1.1 In the Tomcat world, a Server represents the whole container. Tomcat provides a default implementation of the Server interface., and this is rarely customized by users. 1.2 在tomcat的世界里,一个server代表整个容器.Tomcat…

$.ajax datatype默认是什么类型,理解jquery ajax中的datatype属性选项值

jquery中ajax的dataType属性用于指定服务器返回的数据类型&#xff0c;如果不指定&#xff0c;jQuery 将自动根据HTTP包MIME信息来智能判断&#xff0c;如果datatype选项不填写的话&#xff0c;会将返回的数据当成字符串处理。jquery中ajax的dataType属性用于指定服务器返回的数…

capslock键英语怎么读_刚开始读英文原版书该怎么做?商务英语专业有前途吗?...

是的&#xff0c;看我的朋友圈也能学英文#26从最近的朋友圈和微博中选了一些内容&#xff0c;分享给大家。1. 如何开始读英文原版书&#xff1f;关于读英文原版书&#xff0c;我给出一个简单粗暴的开始和进阶方案。启动方案&#xff1a;首先找一本你特别感兴趣的书&#xff0c;…

【12图】你管这破玩意叫Pulsar

这两年pulsar发展比较快&#xff0c;有好多大公司引入了pulsar&#xff0c;相关的资料和课程也多了&#xff0c;今天一起来了解一下pulsar这款中间件。下图是几款消息中间件的历史&#xff1a;2012年pulsar在Yahoo内部开发&#xff0c;2016年开源并捐献给Apache&#xff0c;201…

每日一笑 | 为什么英语老师让我们养成背单词的习惯?

全世界只有3.14 % 的人关注了数据与算法之美&#xff08;图片来源于网络&#xff0c;侵权删&#xff09;