微软近几年推出.NET Standard,将.NET Framework,.NET
Core,Xamarin等目的平台的api进行规范化和统一化,相当的大地惠及了类库编写人士的办事。一句话来讲,类库编写人士在颁发库的时候,只必要基于.NET
Standard实行透露,那么编写的次序能够在逐一目标平台上都能到运维。

供销合作社的等级次序平昔选择.NET框架来开荒Web项目。近来基础类库均为.NET Framework
4.陆.贰版本。Caching, Logging,DependencyInjection,Configuration等基础设备相关的依赖库平昔和合法保持同步,目前是一.一本子。.NET
Core越来越趋于牢固,新的开拓工具也在六月份发布。由此,安排将.NET
Framework移植至.NET
Core/Strandard。指标是使基于.NET开垦的Web应用能够跨平台运转。

近些年在看ASP.NET Core MVC的教材,大致每章初阶都要双重从Empty
project伊始创造三个ASP.NET
Core的品种,然后手动修改project.json,扩展杰出三索引(Models,Controllers,Views)之类的,然后紧接着基于这几个基本类型打开介绍有些特定的功力。

.NET
Standard是一种标准,只要符合这几个职业的阳台都能够运作基于此标准api构建的顺序。

按使用场景将公司的项目分为基础类库,基础服务和动用类型。基础类库以包的款型提供各样基础意义。基础服务通过Wcf项目搭建大概通过Web
API项目搭建。应用项目则是Web
Mvc项目为主。基础类库和基本功服务是以1个三个减轻方案的款式存在。每种解决方案的结构,包罗2个或然五个类库项目,三个或多个调控台项目,它们各自用于成效达成、单元测试、作用演示。要是全勤要移植,那么优先级应该是基础类库
-> 基础服务 -> 应用项目。此番移植的靶子是基础类库。

那种示例代码每一趟都再一次创立很未有技能含量,日常都以复制粘贴,所以思索把那有些演示代码做成三个自动化的。从前有看齐有ASP.NET
Identity的演示的Nuget程序包,就是安装之后,自动创立了有关的类公事,同时也修改了web.config,最后效果是安装了package之后,间接能起来。

认为挺好用的,可是实际上用起来就有1部分坑了。比如说这几个广阔的FileNotFoundException,当有这些意况的时候,平日出现:

基础类库最终会以包的款式通过NuGet公布出去,目前只面向.NET
Framework框架。移植的对象之壹,是让包也能被面向.NET Core、.NET
Standard框架的档案的次序引用。结合法定资料,笔者选拔了一贯迁移的方案。即间接将项目文件转变为新的基于.NET
Core的品种文件。上面详细表明移植的细节。

依照那些主见,也盘算创设四个ASP.NET Core
MVC的核心示例Nuget包。于是从新复习了一个成立Nuget包的文档,发掘事态不是那么间接,用事先基于非.NET
Core的主次的创建包的艺术,行不通。

主程序的对象平台是有个别具体平台(不是.NET Standard,比方说是.NET
Framework
四.0),随后为了引入新的特点,进级了Framework为4.陆.一,它同时引用了三个.NET
Standard类库,恰好,那几个类库还援引了其它的package。(即传送引用A->B->C的款式,在这之中A是.NET
Framework程序,B是nuget包,C是B引用的nuget包。)在此境况下,假诺F5起步程序,就能够报FileNotFoundException。

  1. 新建基于.NET Core的品种。

翻看了Nuget提供的文书档案表达(),也没找到很直接的辨证怎么着创造.NET
Core程序包的牵线文书档案,反而看到有介绍创建.NET
Standard程序包的文书档案。那是怎样动静,按道理不大概,可能方向不对?间接bing了一晃,也未有找到stackflow上的最好答案,其实也没深刻去找,笔者是以为自个儿走错了样子。

测试条件
Visual Studio 2015 Community
测试用包:UnifiedConfig v一.一.六

率先重命名现存项目文件*.csproj为*.Net四陆.csproj。然后接纳VS20一7新建一个新的基于.NET
Core的类型,项目连串能够是“类库(.Net Core)”或许“类库(.Net
Standard)”。注意,VS20①七会唤醒存在同名目录,所以成立时能够输入三个比不上的称号,然后手工业调节回来。

于是乎把介绍创制.NET
Standard的文书档案()看了一次,看到日前的牵线终于知道了,原来是换了个壳,未有事先那么直接了,必须经过创建.NET
斯坦dard包的艺术贯彻对.NET Core程序的扶助。

唤醒未找到System.IO.FileSystem。乍看感觉是二个简易的引用错误,但unifiedconfig包里面已经平常引用了那一个连串,按道理vs能够健康帮大家处理引用难题。到文件输出路线中查看,开采对应的包未有准确复制过来。手动从package文件夹中复制过来,难题一蹴而就。

yzc579亚洲城官网 1

为啥是.NET Standard?.NET
斯坦dard定义了支撑全部.NET平台的BCL程序集API,理论上说.NET
Standard支持下的程序集能够在四个分化的.NET平台运营,比方.NET
Framework,.NET Core, Mono等等。而对于差异的.NET平台,对.NET
Standard的本子协理也比不上,落成的援救列表可参看的辨证,下图是引用自官方网址的二个本子帮忙图

原因出在这么些跨平台上。由于存在引用传递,B无法明显供给复制哪个目的平台的package到A的输出路线。当程序是从旧的Framework晋级而来的时候,旧版的等级次序文件不可能很好地管理.NET
Standard的那么些题材。但大家手动三个叁个复制也不是措施,以下给出化解方案。

 

yzc579亚洲城官网 2

缓和方案:

  1. 编写制定项目文件,使之协理面向多个对象框架。

参考须求补助的.NET平台的版本,能够见到平台辅助的参天版本的.NET
Standard的本子号,同时也验证帮助从前版本的.NET Standard。

  1. 最直白的方案,修改主项目的.csproj文件,将<RestoreProjectStyle>PackageReference</RestoreProjectStyle>增进到第五个PropertyGroup
  2. 1旦还拾分,加上<AutoGenerateBindingRedirects>true</AutoGenerateBindingRedirects>
    或者

由此VS20壹7 牧马人C新建的连串,“类库(.Net Core)”可能“类库(.Net
Standard)”,暗中同意唯有一个目的框架。我们能够编写项目文件,使之支持面向几个目的框架。如援救对象框架为.NET
Standard 一.四、.Net Core App 1.0和.NET Framework 四.五,则如此来修改。

说的可比生硬,举例本人这里需求协理.NET Core程序,而且是.NET Core
一.0本子,那么那么些本子帮衬的最高.NET
Standard版本是一.6,同时也相配1.陆事先的本子。

  • 在工具->nuget包管理器->程序包管理->暗中同意包管理格式,从Packages.config改成PackageReference。
<Project Sdk="Microsoft.NET.Sdk">
    <PropertyGroup>
      <TargetFrameworks>netstandard1.4;netcoreapp1.0;net45</TargetFrameworks>
    </PropertyGroup>
</Project>

好了眼前介绍了须臾间背景知识,那么了然完事后大家就很明亮倘诺要开创支持.NET
Core的Nuget包,那么大家需求创立一个协助.NET
Standard的Nuget包,并且安装协助的版本就能够。

后记

本人记得在visual studio 20一7早期版本还存在那个bug,晋级之后visual studio
2017
1伍.6.四这一个版本测试新建项目,已经远非那么些主题材料。并且暗许生成的依靠四.五.二之上Framework的.csproj文件已经增加<AutoGenerateBindingRedirects>true</AutoGenerateBindingRedirects>以此布局。可是当老版本的品类引用.NET
Standard类库的时候,依旧平常会面世那么些标题,那时候,就要求我们手动增添配置项目了。

只顾,官方文书档案中提供了.NET援助的对象框架列表,你可以查询更多其余的目的框架。即便要合营相当的低版本的框架,则目的框架版本不宜设置过高。如“net4五”可用于.NET
Framework 四.5 ~ 四.陆.二等版本。如“net四陆”则不得不用于.NET Framework 4.6 ~
4.6.2等版本。

结缘Nuget官方的文书档案,我们一步步来创制并发表三个德姆o版的补助.NET Core
一.0本子的Nuget包。

  1. 修改应用程序代码相关API,使之帮衬八个对象框架。

1 用Visual studio 20一伍新建2个Class Library Portable项目

a.
因目的框架提供的API区别样。故须要时可增加条件编译符号以便扶助不相同的周转时版本。

yzc579亚洲城官网 3

以下是大规模的规格编写翻译符号列表。

项目名称自定义,平时用于最后Nuget包的名称

.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

贰 点击分明之后弹出选用供给的Targets,也便是支持的.NET平台

 关于标准编写翻译符号的使用,如以下代码:

yzc579亚洲城官网 4

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;
        }
    }
}

此直接纳匡助.NET Framework和ASP.NET Core

代码表达,PathHelper提供GetRooted帕特h方法用于依据相对路线总括出相对路线。当运转时为.NET
Core时,BaseDirectory属性要求手动设置。当运转时为.NET Framework
四.伍时,由构造器对BaseDirectory属性实行赋值。注意System.AppDomain.CurrentDomain.BaseDirectory用于获取托管程序实行路线,类AppDomain只存在于.NET
Framework中。

3.点击OK之后,项目开创完成,然后右键点击化解方案,展开属性窗口

b. .NET
Standard是个依靠包的框架。当你须求有个别API时,如IDataReader,你必要设置System.Data.Common包。假诺是使用.NET
Framework,则在命名空间System.Data下得以找到IDataReader而不供给服从包。借助工具,你能够急忙稳固有些API在哪些包中。

yzc579亚洲城官网 5

c. 基于.NET
Core的品种,包版本号和别的元数据,都存款和储蓄在*.csproj中,不会使用AssemblyInfo.cs文件,即移植时,这一个文件能够去除。不过.NET
Framework项目照旧会继续利用该文件。

分选点击”Target.NET Platform
Standard”,之后会有二个Confirm,当然是挑选“Yes”

  1. 同样化解方案,类库间的引用攻略。

yzc579亚洲城官网 6

在引用类库时,要小心目标框架的包容难题。如,“类库(.Net
Standard)”项目,能够被.NET Core App、.NET Framework和其余.NET
Standard项目引用。这些是因为.NET Core App和.NET
Framework都支持相应版本的.NET标准库。下表彰显了支撑
.NET 规范库的上上下下 .NET 运转时。

下一场属性窗口的Target造成了2个下拉摘取,这里我们采取.NET
Standard1.四版本就能够(依照版本接济图,.NET Core 一.0方可支撑这么些版本)

平台名称 Alias                
.NET Standard netstandard 1.0 1.1 1.2 1.3 1.4 1.5 1.6 2.0
.NET 核心 netcoreapp 1.0 vNext
.NET Framework net 4.5 4.5.1 4.6 4.6.1 4.6.2 vNext 4.6.1
Mono/Xamarin 平台   vNext
通用 Windows 平台 uap 10.0 vNext
Windows win 8.0 8.1          
Windows Phone wpa 8.1          
Windows Phone Silverlight wp 8.0              

yzc579亚洲城官网 7

只顾,假设项目是面向多目的框架的,那么引用类库时,被引用类库也要帮助面向多目的框架。

自此再也Confirm,Yes

  1. 单元测试

yzc579亚洲城官网 8

借使是使用.NET
Framework类库项目来存放在单元测试代码,那么恐怕会碰到一些主题材料。在VS2017帕杰罗C中,测试资源处理器不能够甄别出这一个测试单元。通过新建“单元测试项目(.NET
Framework)”,将转移的同名*.csproj覆盖原来的品类文件,测试管理器就可以识别出来。

叁 设置Build,选择Release,并勾选中XML documentation file,前边要求使用

yzc579亚洲城官网 9

yzc579亚洲城官网 10

  1. MSBuild自动编写翻译新的缓和方案

4到此项目的习性设置完结,然后把暗中认可生成的Class一改一下,好歹改成一些有含义的事物,笔者改成如下内容。

Windows下,按Release配置对总体解决方案编写翻译。

public class Demo
{
    public void Run()
    {
        Console.WriteLine($"You're using my demo package at {DateTime.Now.ToString(CultureInfo.InvariantCulture)}");
    }
}
"c:\Program Files (x86)\Microsoft Visual Studio\2017\Community\MSBuild\15.0\Bin\MSBuild.exe" XXX.sln /p:Configuration=Release;Platform="Any CPU"

伍项目代码已经丰硕了,接下去使用Nuget命令行工具,Nuget命令行工具用的是三.五版本,官方有得下载,这里把Nuget.exe文件放到了档案的次序根目录下。

会在相关类库根目录下\bin\Release目录中,生成net四六和netstandard一.六多个目录。

yzc579亚洲城官网 11

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

6 然后CMD到花色所在的目录,运转nuget
spec,创造二个spec文件,那一个文件干嘛的不多说了,官方文书档案有详尽表达

采纳vs20壹七打包时,只需右击要打包的品类,接纳“打包”,就可以在.\bin\Debug或.\bin\Release下生成XXX.0[.0].0.nupkg文件,然后将这么些文件.nupkg上传至nuget.org中。通过调用dotnet-nuget-push可以自动化这一个发表进度,因而那种艺术会愈发有利于。

nuget spec

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

接下来拿走1个Shenba.德姆oPackage.Core.nuspec文件

k:服务器的 API 密钥 s:服务器 U帕杰罗L,如宣布到nuget.org,则能够如此写。

7 用文件编辑器,比方notepad++编辑Shenba.德姆oPackage.Core.nuspec文件

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写在批管理文件中来达成主题类库的布局职业。

<?xml version="1.0"?>
<package >
  <metadata>
    <id>Shenba.DemoPackage.Core</id>
    <version>1.0.0</version>
    <title>Shenba.DemoPackage.Core</title>
    <authors>shenba</authors>
    <owners>shenba</owners>
    <requireLicenseAcceptance>false</requireLicenseAcceptance>
    <description>demo package for dotnet core</description>
    <releaseNotes>demo package for dotnet core released.</releaseNotes>
    <copyright>Copyright 2017</copyright>
    <tags>dotnet core demo package</tags>
  </metadata>
</package>

总结

瞩目id不要同样,不然前边没办法交付

通过此方案迁移后,最后保留新的缓和方案和项目文件,旧的缓慢解决方案和品种文件在移植的进度中被删去。之后将遵守新的化解方案来跨平台支付。基本类库的移植专业就介绍到那边。源代码的移植将是个挑战。譬如部分源码所引用的API在.NET
Core框架下不设有时怎样管理?此外,基础服务和Web
Mvc项目标移植,因为要配备到linux中。也将会遇上各样主题素材。

八继续编辑nuspec文件,插手<files>节点(跟metadata多少个等第),并设置剧情如下

参考能源

<files>
    <file src="bin\Release\Shenba.DemoPackage.Core.dll" target="lib\netstandard1.4\Shenba.DemoPackage.Core.dll" />
    <file src="bin\Release\Shenba.DemoPackage.Core.xml" target="lib\netstandard1.4\Shenba.DemoPackage.Core.xml" />
</files>

1. 团体项目以支撑 .NET Framework 和 .NET
Core

九在Release配置下,编译消除方案后,在命令行推行如下命令(依旧在等级次序的根目录下)

2. dotnet-nuget-push

nuget pack Shenba.DemoPackage.Core.nuspec

3. packagesearch.azurewebsites.net

未来会调换1个Shenba.德姆oPackage.Core.一.0.0.nupkg文件,这一个正是最后要揭橥的包文件

4. yzc579亚洲城官网,.NET
标准库

实在那是一个压缩包(把后缀名改成zip),能够用RAOdyssey工具查看里面包车型地铁文件结构,如下图

5. Developing Libraries with Cross Platform
Tools

yzc579亚洲城官网 12

6. Target
Frameworks

yzc579亚洲城官网 13

7. Porting to .NET Core from .NET
Framework

yzc579亚洲城官网 14

能够看出在那之中包蕴了遍布的lib目录,并且张开后是netstandard一.肆索引,然后是有血有肉的主次集文件和XML文书档案。

十 接下去正是把那个包公布到nuget.org

布告到nuget.org供给使用本身的账号发布,如若经过命令行发布还索要更动本人的八个APIkey,具体能够参考的说明。

此地给出公布的package的命令行,当中XXXX是挂号后拿走的API key

nuget push Shenba.DemoPackage.Core.1.0.0.nupkg XXXX –Source nuget.org

11 push之后是不能够及时在nuget寻觅到的,那跟在此以前的非.NET
Standard的是如出一辙的,可是能够在协和的Account下看看文告的包

yzc579亚洲城官网 15

12 在.NET Core项目中动用刚公布的德姆o package

其壹跟使用普通的.NET
Core的Package一样,修改project.json恐怕利用分界面包车型客车package
manager引进,比如直接在project.json的dependencies节点参与package的引用

{
  "version": "1.0.0-*",
  "buildOptions": {
    "emitEntryPoint": true
  },

  "dependencies": {
    "Microsoft.NETCore.App": {
      "type": "platform",
      "version": "1.0.1"
    },
    "Shenba.DemoPackage.Core": "1.0.0"
  },

  "frameworks": {
    "netcoreapp1.0": {
      "imports": "dnxcore50"
    }
  }
}

封存之后自然也会自行的restore,然后会议及展览示在引用中

yzc579亚洲城官网 16

本来代码里调用那个package的类也是从未难题的,调用代码就隐瞒了,正是个示范而已。

壹三 在.NET Framework 四.6.一的系列中选用该德姆o package

一起先波及那些package是基于.NET Standard1.四版本的,依照版本匡助图,.NET
Framework 四.陆.一的项目也是能够引用那几个包的。

新建叁个.NET Framework 4.六.壹的调整台项目,package控制台运营

Install-Package Shenba.DemoPackage.Core

同等也是能精确被引述和调用的,下边是packages.config的故事情节

<packages>
  <package id="Shenba.DemoPackage.Core" version="1.0.0" targetFramework="net461" />
</packages>

 

小结

如上是创设并透露二个可用于.NET Core(当然也可用于.NET
Framework)的Nuget包过程,差不离流程跟发表普通的Nuget包同样,但须要小心采纳须求援救的.NET
斯坦dard的本子。

后续会筹算贰个更为有含义的.NET
Core包,可用来生成ASP.NET MVC Core的就学示例代码。

(目前本着dotnet
core项目的nuget包,还不协理推行包里的代码模板和辨认Content内容,所以一时半刻相当小概兑现

端详参考

其壹德姆o的以身作则代码路线

Author

发表评论

电子邮件地址不会被公开。 必填项已用*标注