如何移植.NET Framework项目至.NET Core?

公司的项目一直采用.NET框架来开发Web项目。目前基础类库均为.NET Framework 4.6.2版本。Caching, Logging,DependencyInjection,Configuration等基础设施相关的依赖库一直和官方保持同步,目前是1.1版本。.NET Core越来越趋于稳定,新的开发工具也在三月份发布。因此,计划将.NET Framework移植至.NET Core/Strandard。目的是使基于.NET开发的Web应用可以跨平台运行。

按应用场景将公司的项目分为基础类库,基础服务和应用项目。基础类库以包的形式提供各类基础功能。基础服务通过Wcf项目搭建或者通过Web API项目搭建。应用项目则是Web Mvc项目为主。基础类库和基础服务是以一个一个解决方案的形式存在。每个解决方案的结构,包含一个或者多个类库项目,一个或多个控制台项目,它们分别用于功能实现、单元测试、功能演示。如果全部要移植,那么优先级应该是基础类库 -> 基础服务 -> 应用项目。此次移植的对象是基础类库。

基础类库最终会以包的形式通过NuGet发布出去,目前只面向.NET Framework框架。移植的目标之一,是让包也能被面向.NET Core、.NET Standard框架的项目引用。结合官方资料,我选择了直接迁移的方案。即直接将项目文件转换为新的基于.NET Core的项目文件。下面详细说明移植的细节。

1. 新建基于.NET Core的项目。

首先重命名现有项目文件*.csproj为*.Net46.csproj。然后使用VS2017新建一个新的基于.NET Core的项目,项目类型可以是“类库(.Net Core)”或者“类库(.Net Standard)”。注意,VS2017会提示存在同名目录,所以创建时可以输入一个不同的名称,然后手工调整回来。

 

2. 编辑项目文件,使之支持面向多个目标框架。

通过VS2017 RC新建的项目,“类库(.Net Core)”或者“类库(.Net Standard)”,默认只有一个目标框架。我们可以编辑项目文件,使之支持面向多个目标框架。如支持目标框架为.NET Standard 1.4、.Net Core App 1.0和.NET Framework 4.5,则这样来修改。


< Project  Sdk="Microsoft.NET.Sdk">
     < PropertyGroup >
       < TargetFrameworks >netstandard1.4;netcoreapp1.0;net45</ TargetFrameworks >
     </ PropertyGroup >
</ Project >

注意,官方文档中提供了.NET支持的目标框架列表,你可以查询更多其他的目标框架。如果要兼容较低版本的框架,则目标框架版本不宜设置过高。如“net45”可用于.NET Framework 4.5 ~ 4.6.2等版本。如“net46”则只能用于.NET Framework 4.6 ~ 4.6.2等版本。

3. 修改应用程序代码相关API,使之支持多个目标框架。

a. 因目标框架提供的API不相同。故必要时可添加条件编译符号以便支持不同的运行时版本。

以下是常见的条件编译符号列表。

.NET Framework 2.0 --> NET20
.NET Framework 3.5 --> NET35
.NET Framework 4.0 --> NET40
.NET Framework 4.5 --> NET45
.NET Framework 4.5.1 --> NET451
.NET Framework 4.5.2 --> NET452
.NET Framework 4.6 --> NET46
.NET Framework 4.6.1 --> NET461
.NET Framework 4.6.2 --> NET462
.NET Standard 1.0 --> NETSTANDARD1_0
.NET Standard 1.1 --> NETSTANDARD1_1
.NET Standard 1.2 --> NETSTANDARD1_2
.NET Standard 1.3 --> NETSTANDARD1_3
.NET Standard 1.4 --> NETSTANDARD1_4
.NET Standard 1.5 --> NETSTANDARD1_5
.NET Standard 1.6 --> NETSTANDARD1_6

 关于条件编译符号的应用,如以下代码:

using System;

using System.IO;

namespace Baza.NetStandardTester

{

    public class PathHelper

    {

        public string BaseDirectory { get; set; }

        public PathHelper()

        {

#if NET45

            BaseDirectory = AppDomain.CurrentDomain.BaseDirectory;

#endif

        }

        public string GetRootedPath(string path)

        {

            string rootedPath = path ?? string.Empty;

            if (!Path.IsPathRooted(rootedPath))

            {

                if (string.IsNullOrEmpty(BaseDirectory))

                    throw new ArgumentNullException("请先设置BaseDirectory属性");

                rootedPath = Path.Combine(BaseDirectory, rootedPath);

            }

            string directory = Path.GetDirectoryName(rootedPath);

            if (!string.IsNullOrEmpty(directory) && !Directory.Exists(directory))

            {

                Directory.CreateDirectory(directory);

            }

            return rootedPath;

        }

    }

}

代码说明,PathHelper提供GetRootedPath方法用于根据相对路径计算出绝对路径。当运行时为.NET Core时,BaseDirectory属性需要手动设置。当运行时为.NET Framework 4.5时,由构造器对BaseDirectory属性进行赋值。注意System.AppDomain.CurrentDomain.BaseDirectory用于获取托管程序执行路径,类AppDomain只存在于.NET Framework中。

b. .NET Standard是个基于包的框架。当你需要某个API时,如IDataReader,你需要安装System.Data.Common包。如果是使用.NET Framework,则在命名空间System.Data下可以找到IDataReader而无需按照包。借助https://packagesearch.azurewebsites.net/工具,你可以快速定位某个API在哪个包中。

c. 基于.NET Core的项目,包版本号和其他元数据,都存储在*.csproj中,不会使用AssemblyInfo.cs文件,即移植时,这个文件可以删除。但是.NET Framework项目还是会继续使用该文件。

4. 同一解决方案,类库间的引用策略。

在引用类库时,要注意目标框架的兼容问题。如,“类库(.Net Standard)”项目,能够被.NET Core App、.NET Framework和其他.NET Standard项目引用。这个是因为.NET Core App和.NET Framework都支持相应版本的.NET标准库。下表显示了支持 .NET 标准库的整套 .NET 运行时。

平台名称Alias        
.NET Standardnetstandard1.01.11.21.31.41.51.62.0
.NET 核心netcoreapp1.0vNext
.NET Frameworknet4.54.5.14.64.6.14.6.2vNext4.6.1
Mono/Xamarin 平台
vNext
通用 Windows 平台uap10.0vNext
Windowswin8.08.1




Windows Phonewpa8.1




Windows Phone Silverlightwp8.0






注意,如果项目是面向多目标框架的,那么引用类库时,被引用类库也要支持面向多目标框架。

5. 单元测试

如果是使用.NET Framework类库项目来存放单元测试代码,那么可能会遇到一点问题。在VS2017 RC中,测试资源管理器无法识别出这些测试单元。通过新建“单元测试项目(.NET Framework)”,将生成的同名*.csproj覆盖原来的项目文件,测试管理器即可识别出来。

5. MSBuild自动编译新的解决方案

Windows下,按Release配置对整个解决方案编译。

"c:\Program Files (x86)\Microsoft Visual Studio\2017\Community\MSBuild\15.0\Bin\MSBuild.exe" XXX.sln /p:Configuration=Release;Platform="Any CPU"

会在相关类库根目录下\bin\Release目录中,生成net46和netstandard1.6两个目录。

6. 使用dotnet-nuget-push发布包

使用vs2017打包时,只需右击要打包的项目,选择“打包”,即可在.\bin\Debug或.\bin\Release下生成XXX.0[.0].0.nupkg文件,然后将这个文件.nupkg上传至nuget.org中。通过调用dotnet-nuget-push可以自动化这个发布过程,因此这种方式会更加方便。

dotnet nuget push XXX.0[.0].0.nupkg -k 4003d786-0000-4004-bfdf-c4f3e8ef9b3a -s http://customsource/

k:服务器的 API 密钥 s:服务器 URL,如发布到nuget.org,则可以这样写。

dotnet nuget push XXX.0[.0].0.nupkg -k 4003d786-0000-4004-bfdf-c4f3e8ef9b3a -s https://www.nuget.org/api/v2/package

通常在windows下,会将dotnet-nuget-push写在批处理文件中来完成基本类库的部署工作。

总结

通过此方案迁移后,最终保留新的解决方案和项目文件,旧的解决方案和项目文件在移植的过程中被删除。之后将按照新的解决方案来跨平台开发。基本类库的移植工作就介绍到这里。源代码的移植将是个挑战。譬如部分源码所引用的API在.NET Core框架下不存在时如何处理?另外,基础服务和Web Mvc项目的移植,因为要部署到linux中。也将会遇到各种问题。

参考资源

1. 组织项目以支持 .NET Framework 和 .NET Core

2. dotnet-nuget-push

3. packagesearch.azurewebsites.net

4. .NET 标准库

5. Developing Libraries with Cross Platform Tools

6. Target Frameworks

7. Porting to .NET Core from .NET Framework

原文地址:http://www.cnblogs.com/dengzhizhong/p/6436213.html


.NET社区新闻,深度好文,微信中搜索dotNET跨平台或扫描二维码关注

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

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

相关文章

2016蓝桥杯省赛---java---A---8(取球博弈)

题目描述 思路分析 dfs 代码实现 package lanqiao;import java.util.Arrays; import java.util.Scanner;public class Main {public static int []n;public static void main(String[] args) {Scanner scanner new Scanner(System.in);nnew int[3];for (int i 0; i < 3…

分布式统一配置平台-Disconf.Net

为了更好的解决分布式环境下多台服务实例的配置统一管理问题&#xff0c;本文提出了一套完整的分布式配置管理解决方案。结合.net项目具体情况&#xff0c;实现了配置发布的统一化&#xff0c;对配置进行持久化管理并对外提供restful接口&#xff0c;在此基础上&#xff0c;基于…

计算机软件录音注意事项,GOLDWAVE录音软件使用教程

很多朋友都有录音软件&#xff0c;但是软件功能不全&#xff0c;也不是专业的&#xff0c;所以现在我讲一个专业的软件&#xff0c;这个软件都是原创歌手比较常用的软件&#xff0c;现在我们来学习一下。这是该软件的界面&#xff0c;软件的名字叫做GOLDWAVE这款软件的功能很强…

2016蓝桥杯省赛---java---A---10(压缩转换)

题目描述 小明最近在研究压缩算法。 他知道&#xff0c;压缩的时候如果能够使得数值很小&#xff0c;就能通过熵编码得到较高的压缩比。 然而&#xff0c;要使数值很小是一个挑战。 最近&#xff0c;小明需要压缩一些正整数的序列&#xff0c;这些序列的特点是&#xff0c;后面…

量子计算机对人类长寿,科学家称“极端长寿”在未来几十年可能会达到新的里程碑...

原标题&#xff1a;科学家称“极端长寿”在未来几十年可能会达到新的里程碑 来源&#xff1a;cnBeta.COM据外媒报道&#xff0c;人们的平均寿命越来越长&#xff0c;而经历“极端长寿”的人的数量也同样在增加。尽管大多数人活不到100岁&#xff0c;但数据显示&#xff0c;在过…

.NET Framework 4.7发布,支持Windows 10创作者更新

微软刚刚发布了 .NET Framework 4.7&#xff0c;主要是带来了对 Windows 10 “创作者更新” 的支持&#xff0c;开发者们可以通过 Visual Studio 2017 进行最新版 .NET Framework 项目的开发。 .NET Framework 4.7 包含了以下几大改进&#xff1a; 加入对 Windows 10 表格应用…

2016蓝桥杯省赛---java---C---10(密码脱落)

题目描述 思路分析 将字符串反转&#xff0c;后寻找到最长子串&#xff0c;然后用字符串长度减去最长字串长度即可。 代码实现 package lanqiao;import java.util.Scanner;public class Main {static int min0,num0;static String str;public static void main(String[] arg…

使用ElasticSearch,Kibana,ASP.NET Core和Docker可视化数据

原文地址&#xff1a;http://www.dotnetcurry.com/aspnet/1354/elastic-search-kibana-in-docker-dotnet-core-app 想要轻松地通过许多不同的方式查询数据&#xff0c;甚至是从未预料到的方式&#xff1f;想要以多种方式可视化日志&#xff1f;同时支持基于时间、文本和其他类…

计算机辐射对人体影响吗,电脑屏幕辐射对人体的危害怎么解决?

现在不光是从事IT职业的人经常用电脑&#xff0c;普通打工族也时常接触电脑&#xff0c;人们用电脑的时间越来越多&#xff0c;电脑屏幕带来的辐射问题随之而来&#xff0c;工作上班用电脑&#xff0c;下班回家看电视剧、打游戏也用电脑&#xff0c;KTV点歌也用触摸屏辐射&…

2017蓝桥杯省赛---java---A---4(方格分割)

题目描述 思路分析 dfs 题目要求沿着格子的边线剪成两个部分&#xff0c;仔细观察&#xff0c;剪开的边线是关于中心点&#xff08;3&#xff0c;3&#xff09;对称的&#xff0c;于是我们从&#xff08;3&#xff0c;3&#xff09;开始搜索&#xff0c;直到搜到边界则退出。…

这些分布式事务的解决方案,你都知道吗

转载自 这些分布式事务的解决方案&#xff0c;你都知道吗 分布式事务是企业集成中的一个技术难点&#xff0c;也是每一个分布式系统架构中都会涉及到的一个东西&#xff0c;特别是在微服务架构中&#xff0c;几乎可以说是无法避免。 数据库事务 在说分布式事务之前&#x…

如何在多个项目中分离Asp.Net Core Mvc的Controller和Areas

前言 软件系统中总是希望做到松耦合&#xff0c;项目的组织形式也是一样&#xff0c;本篇文章将介绍在ASP.NET CORE MVC中怎么样将Controller与主网站项目进行分离&#xff0c;并且对Areas进行支持。 实践 1.新建项目 新建两个ASP.NET Core Web应用程序&#xff0c;一个命名…

2017蓝桥杯省赛---java---B---10(k倍区间)

题目描述 标题&#xff1a; k倍区间给定一个长度为N的数列&#xff0c;A1, A2, … AN&#xff0c;如果其中一段连续的子序列Ai, Ai1, … Aj(i < j)之和是K的倍数&#xff0c;我们就称这个区间[i, j]是K倍区间。你能求出数列中总共有多少个K倍区间吗&#xff1f;输入 第一行…

asp.net core源码飘香:Configuration组件

简介&#xff1a; 这是一个基础组件&#xff0c;是一个统一的配置模型&#xff0c;配置可以来源于配置文件&#xff08;json文件&#xff0c;xml文件&#xff0c;ini文件&#xff09;&#xff0c;内存对象&#xff0c;命令行参数&#xff0c;系统的环境变量又或者是你自己扩展的…

计算机图形橡皮筋实验报告,弹性或橡皮筋技术

橡皮筋是一种在计算机屏幕上绘制线, 折线, 矩形, 圆形和椭圆形等几何图元的流行技术。它已成为图形用户界面(GUI)不可或缺的一部分, 并成为事实上的标准, 并且几乎被所有基于Windows的应用程序普遍接受。用户通过定位其两个端点以通常的方式指定该线。当我们从第一个端点移动到…

2017蓝桥杯省赛---java---C---9(青蛙跳杯子)

题目描述 题目描述 X星球的流行宠物是青蛙&#xff0c;一般有两种颜色&#xff1a;白色和黑色。X星球的居民喜欢把它们放在一排茶杯里&#xff0c;这样可以观察它们跳来跳去。如下图&#xff0c;有一排杯子&#xff0c;左边的一个是空着的&#xff0c;右边的杯子&#xff0c;每…

青客宝团队redis内部分享ppt

Redis&#xff1a;最好的缓存数据库 说Redis是缓存服务&#xff0c;估计有些人会不开心&#xff0c;因为Redis也可以把数据库持久化&#xff0c;但是在大多数情况Redis的竞争力是提供缓存服务。说到缓存服务必然会想到Memcached&#xff0c;因为几年前Memcached是最流行的缓存服…

你知道面试官是如何刷人的吗

转载自 你知道面试官是如何刷人的吗 对于一个公司来说&#xff0c;执行招聘面试事宜是一个耗时耗钱的项目&#xff0c;从顾问公司和人才中介挑选出合适的简历之后&#xff0c;还要花更多的时间找出合适的候选人。有的时候这些机构会向你保证这些人都是 Java 天才、SQL 专家、…

2020蓝桥杯省赛---java---A---4(七段码)

题目描述 思路分析 代码实现 package lanqiao;public class Main {public static int N10;public static int e[][]new int[N][N];//存储二极管相邻的信息public static int f[]new int[N];//并查集public static int ans0;public static boolean st[]new boolean[N];//true表…

小米无线路由器服务器用户名和密码忘了,小米路由器管理密码忘记了怎么办?...

问&#xff1a;小米路由器管理密码忘记了怎么办&#xff1f;我想修改小米路由器上的配置&#xff0c;在打开miwifi.com的时候&#xff0c;提示需要输入管理密码。但是&#xff0c;我不知道管理密码是多少&#xff0c;忘记了管理密码应该怎么办&#xff1f;答&#xff1a;首先说…