.NET Core系列 :3 、使用多个项目
通过前面的两篇文章,我们已经知道如何创建新的项目,如何生成并运行我们的应用程序,也知道(大致) project.json 文件中的内容是什么意思。但大多数项目往往也需要多个项目或引用的类库。我们要创建类库项目和应用程序项目。在应用程序中,如何引用我们的类库。
创建应用项目 File -> New Application
这个很熟悉了吧,输入下面的命令:
mkdir DotnetNewApp
cd DotnetNewApp
dotnet new
dotnet restore
dotnet build
dotnet run
[root@Mono ~]# mkdir DotnetNewApp
[root@Mono ~]# cd DotnetNewApp/
[root@Mono DotnetNewApp]# dotnet new
Created new C# project in /root/DotnetNewApp.
[root@Mono DotnetNewApp]# dotnet restore
log : Restoring packages for /root/DotnetNewApp/project.json...
log : Writing lock file to disk. Path: /root/DotnetNewApp/project.lock.json
log : /root/DotnetNewApp/project.json
log : Restore completed in 8774ms.
[root@Mono DotnetNewApp]# dotnet build
Project DotnetNewApp (.NETCoreApp,Version=v1.0) will be compiled because expecte d outputs are missing
Compiling DotnetNewApp for .NETCoreApp,Version=v1.0
Compilation succeeded.
0 Warning(s)
0 Error(s)
Time elapsed 00:00:03.7500023
[root@Mono DotnetNewApp]# dotnet run
Project DotnetNewApp (.NETCoreApp,Version=v1.0) was previously compiled. Skippin g compilation.
Hello World!
我们创建好了应用项目,接下来我们创建一个类库项目
创建类库项目 File -> New Library
dotnet new 默认创建的控制台项目,他还可以创建其他项目类型 :
[root@Mono DotnetNewApp]# dotnet new -t -h
Unrecognized type: -h
Avaiable types for C# :
- Console
- Web
- Lib
- xunittest
看这个输出,单词都拼错了,Avaiable 应该是Available,已经被提了bug https://github.com/dotnet/cli/pull/3822 ,除了控制台,还可以创建Web,Lib和xunittest,项目类型和使用Visual Studio 2015一致。web是asp.net core 模板,xunittest是测试项目,Lib就是我们需要创建的类库项目类型,所以我们将加上-t 参数指定为Lib,Scott Hanselman 的博文 Exploring dotnet new with .NET Core 讲的也很详细:
[root@Mono DotnetNewApp]# cd ..
[root@Mono ~]# mkdir DotnetNewLib
[root@Mono ~]# cd DotnetNewLib/
[root@Mono DotnetNewLib]# dotnet new -t Lib
Created new C# project in /root/DotnetNewLib.
[root@Mono DotnetNewLib]# pwd
/root/DotnetNewLib
我们创建完成了一个C#类库项目 /root/DotnetNewLib
我们来对比下控制台和类库项目的区别是什么?前面一篇文章《.NET Core系列 : 2 、project.json 这葫芦里卖的什么药》我们已经简单提及。我们来看下类库项目的project.json:
{
"version": "1.0.0-*",
"buildOptions": {
"debugType": "portable"
},
"dependencies": {},
"frameworks": {
"netstandard1.6": {
"dependencies": {
"NETStandard.Library": "1.6.0"
}
}
}
}
类库的编译选项buildOptions 少了 emitEntryPoint ,这是一个类库,所以不需要入口。依赖的框架不是netcoreapp1.0,而是用了一个netstandard1.6替代,上面一篇文章我们简要说明了一下,本质上来说netcoreapp1.0和.NET 4.6.3 都是NETStardard 1.6的实现,Mono 也正在调整NETStardard,https://github.com/mono/mono/tree/netstandard。
本质上来说,NETStandard.Library 是一个目标最低支持基础类库,这样就可以更好的向前兼容性,在现有的平台出现新的版本时(如.net core 1.1 甚至 2.0)而无需重新发布新的变化。具体参考 https://github.com/dotnet/corefx/blob/master/Documentation/architecture/net-platform-standard.md ,目前最新的表格:
如何理解这个表格
- 如果一个类库指定.NET平台标准1.3版本,那么它仅能够运行在.NET Framework 4.6或更新的框架、Universal Windows Platform 10(UWP)、DNX Core 5.0和Mono/Xamarin这些平台上。
- 如果一个类库指定.NET平台标准1.3版本,那么它能够引用(原文:consume)所有来自之前的.NET平台标准的版本(1.2、1.1、1.0)。
如果我们想要我们的类库项目,也可以更广泛地使用,比如旧版本的.Net项目也可以用, 我们可以降低修改为 netstandard1.0,这意味着所有.Net 4.5 或更高版本的运行时兼容,再加上Windows Phone Silverlight (8.0 + 8.1)。值得注意的.Net 4.5 以下版本不兼容这个新的NetStandard 版本化方案。在我们的控制台应用程序,我们针对 Microsoft.NETCore.App 的依赖项。这是指类型的平台,并且在我们的应用程序的运行时上声明依赖项。
我们的控制台程序将要依赖于我们这个类库项目做些计算逻辑,我们就用它来做个2个数相乘吧,修改Class1为Calculator,Method1修改为Multi:
namespace DotnetNewLib
{
public class Calculator
{
public int Multi(int x,int y)
{
return x * y;
}
}
}
下面进入我们今天的重点是项目的引用.
项目引用Project References
引用项目和引用Nuget包不同的地方主要是 "target": "project" 这个属性,这和前面的Microsoft.NETCore.App 的依赖属性"type": "platform"类似。
下面我们给我们的控制台应用添加类库DotnetNewLib的依赖,在DotnetNewApp的project.json 添加,文件内容如下:
{
"version": "1.0.0-*",
"buildOptions": {
"debugType": "portable",
"emitEntryPoint": true
},
"dependencies": {},
"frameworks": {
"netcoreapp1.0": {
"dependencies": {
"Microsoft.NETCore.App": {
"type": "platform",
"version": "1.0.0"
},
"DotnetNewLib":{
"target":"project"
}
},
"imports": "dnxcore50"
}
}
}
这么写有个前提是你的DotnetNewApp 和DotnetNewLib文件夹有相同的父文件夹,这里有两件事需要注意,每当你dotnet build DotnetNewApp,他就会以递归方式尝试dotnet build DotnetNewLib。第二件需要注意的是build而不是执行restore,你需要确保这两个项目都运行了dotnet restore,当然你可以在他们的父文件夹执行dotnet restore。所有的子文件夹里面的project.json 都会被恢复。
接下来,我们在控制台应用DotnetNewApp里调用DotnetNewLib的乘法:
using System;
using DotnetNewLib;
namespace ConsoleApplication
{
public class Program
{
public static void Main(string[] args)
{
Calculator calc = new Calculator();
var result = calc.Multi(9,8);
Console.WriteLine($"Hello World is {result} ");
}
}
}
编译和运行
我们切换到DotnetNewApp 文件夹下,我们现在可以编译和运行这个应用了,同时也会编译我们的类库项目DotnetNewLib。
[root@Mono DotnetNewApp]# dotnet build
Project DotnetNewLib (.NETStandard,Version=v1.6) will be compiled because expected outputs are missing
Compiling DotnetNewLib for .NETStandard,Version=v1.6
Compilation succeeded.
0 Warning(s)
0 Error(s)
Time elapsed 00:00:02.8849475
Project DotnetNewApp (.NETCoreApp,Version=v1.0) will be compiled because dependencies changed
Compiling DotnetNewApp for .NETCoreApp,Version=v1.0
Compilation succeeded.
0 Warning(s)
0 Error(s)
Time elapsed 00:00:03.0273700
[root@Mono DotnetNewApp]# dotnet run
Project DotnetNewLib (.NETStandard,Version=v1.6) was previously compiled. Skipping compilation.
Project DotnetNewApp (.NETCoreApp,Version=v1.0) was previously compiled. Skipping compilation.
Hello World is 72
到这里我们成功构建了一个类库项目和一个控制台项目,控制台引用类库项目完成乘法运算,这虽然是一个很简单的多项目应用,我们通过这个最简单的项目讲解了dotnet core的多项目应用如何进行开发和注意事项。
.NET Core系列 :3 、使用多个项目的更多相关文章
- ASP.NET Core 系列视频完结,新项目实战课程发布。
今天把MVC的章节完成了,给大家从头到尾做了一个登录注册的示例,带前后端Model验证,算是完整的示例.同时借助于eShopOnContainers的示例也做了一个DBContextSeed的包装器来 ...
- asp.net core系列 59 Ocelot 构建基础项目示例
一.入门概述 从这篇开始探讨Ocelot,Ocelot是一个.NET API网关,仅适用于.NET Core,用于.NET面向微服务/服务的架构中.当客户端(web站点.ios. app 等)访问we ...
- 【目录】asp.net core系列篇
随笔分类 - asp.net core系列篇 asp.net core系列 68 Filter管道过滤器 摘要: 一.概述 本篇详细了解一下asp.net core filters,filter叫&q ...
- ASP.NET Core系列(二):创建第一个.Net Core 项目
前面讲过 .NET Core简介及开发环境安装,本章会讲一讲ASP.NET Core 2.0的项目结构,查看完整的ASP.NET Core系列文章:https://www.cnblogs.com/zh ...
- 【asp.net core 系列】6 实战之 一个项目的完整结构
0. 前言 在<asp.net core 系列>之前的几篇文章中,我们简单了解了路由.控制器以及视图的关系以及静态资源的引入,让我们对于asp.net core mvc项目有了基本的认识. ...
- asp.net core 系列之用户认证(1)-给项目添加 Identity
对于没有包含认证(authentication),的项目,你可以使用基架(scaffolder)把 Identity的程序集包加入到项目中,并且选择性的添加Identity的代码进行生成. 虽然基架已 ...
- .NET Core 系列5 :使用 Nuget打包类库
NuGet是个开源项目,项目包括 NuGet VS插件/NuGet Explorer/NuGetServer/NuGet命令行等项目,.NET Core项目完全使用Nuget 管理组件之间的依赖关系, ...
- .NET Core系列 :4 测试
2016.6.27 微软已经正式发布了.NET Core 1.0 RTM,但是工具链还是预览版,同样的大量的开源测试库也都是至少发布了Alpha测试版支持.NET Core, 这篇文章 The Sta ...
- .NET Core系列 : 2 、project.json 这葫芦里卖的什么药
.NET Core系列 : 1..NET Core 环境搭建和命令行CLI入门 介绍了.NET Core环境,本文介绍.NET Core中最重要的一个配置文件project.json的相关内容.我们可 ...
随机推荐
- [Java 缓存] Java Cache之 DCache的简单应用.
前言 上次总结了下本地缓存Guava Cache的简单应用, 这次来继续说下项目中使用的DCache的简单使用. 这里分为几部分进行总结, 1)DCache介绍; 2)DCache配置及使用; 3)使 ...
- HTML骨架结构
前面的话 一个完整的HTML文档必须包含3个部分:文档声明.文档头部和文档主体.而正是它们构成了HTML的骨架结构.前面已经分别介绍过文档声明和文档头部,本文将详细介绍构成HTML骨架结构的基础元 ...
- 46张PPT讲述JVM体系结构、GC算法和调优
本PPT从JVM体系结构概述.GC算法.Hotspot内存管理.Hotspot垃圾回收器.调优和监控工具六大方面进行讲述.(内嵌iframe,建议使用电脑浏览) 好东西当然要分享,PPT已上传可供下载 ...
- 协议森林16 小美的桌号(DHCP协议)
作者:Vamei 出处:http://www.cnblogs.com/vamei 转载请先与我联系. DHCP协议用于动态的配置电脑的网络相关参数,如主机的IP地址,路由器出口地址.DNS域名服务器地 ...
- Angular企业级开发-AngularJS1.x学习路径
博客目录 有链接的表明已经完成了,其他的正在建设中. 1.AngularJS简介 2.搭建Angular开发环境 3.Angular MVC实现 4.[Angular项目目录结构] 5.[SPA介绍] ...
- 谈谈一些有趣的CSS题目(十)-- 结构性伪类选择器
开本系列,谈谈一些有趣的 CSS 题目,题目类型天马行空,想到什么说什么,不仅为了拓宽一下解决问题的思路,更涉及一些容易忽视的 CSS 细节. 解题不考虑兼容性,题目天马行空,想到什么说什么,如果解题 ...
- 记录我这一年的技术之路(nodejs纯干货)
2015年12月28日23:19:54 更新koa应用.学习型网站和开发者工具等 coding伊始 开始认认真真的学习技术还是2015.10.21日开始的,记得很清楚,那天,是我在龙湖正式学习的第一天 ...
- VSCode调试go语言出现:exec: "gcc": executable file not found in %PATH%
1.问题描述 由于安装VS15 Preview 5,搞的系统由重新安装一次:在用vscdoe编译go语言时,出现以下问题: # odbcexec: "gcc": executabl ...
- C# 自定义控件VS用户控件
1 自定义控件与用户控件区别 WinForm中, 用户控件(User Control):继承自 UserControl,主要用于开发 Container 控件,Container控件可以添加其他Con ...
- 学习笔记:发现一个IE版本判断的好方法
web开发就不得不面对浏览器兼容性问题,特别是IE的兼容问题.在前端代码中经常要处理一些兼容格式,为了解决这个问题网上找了找识别浏览器版本的方法. 常规js方法 找到一个方法,还不错,可以识别出各 ...