多个项目使用NET Core
.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的更多相关文章
- .NET 4.5+项目迁移.NET Core的问题记录
.NET 4.5+项目迁移.NET Core的问题记录 这几天试着把目前的开发框架迁移到新的.net core平台,中间遇到的问题在这里简单记录一下. 迁移过程遇到的最大的问题IOC容器.我目前使用的 ...
- 将 Net 项目升级 Core项目经验:(一)迁移Net项目为Net Core\Standard项目
迁移Net项目为Net Core\Standard项目 背景: 我们公司内部有自己ORM开发框架,最新因为需要将系统迁移到国产服务器上,所以首先需要将最基础的ORM框架改造可以运行在国产服务器上.对于 ...
- WinForms项目升级.Net Core 3.0之后,没有WinForm设计器?
目录 .NET Conf 2019 Window Forms 设计器 .NET Conf 2019 2019 9.23-9.25召开了 .NET Conf 2019 大会,大会宣布了 .Net Cor ...
- 结对编程项目报告--四则运算CORE
<!doctype html> sw_lab2.mdhtml {overflow-x: initial !important;}#write, body { height: auto; } ...
- 迁移WPF项目到.NET CORE
综述 .NET CORE 3.0开始,桌面端支持WPF了.很多.NET FRAMEWORK的项目已经跑了一阵子了,不是很有必要支持.NET CORE,不过最近用一个程序,为了贯彻一些C# 8的特性,需 ...
- 企业项目实战 .Net Core + Vue/Angular 分库分表日志系统 | 简单的分库分表设计
前言 项目涉及到了一些设计模式,如果你看的不是很明白,没有关系坚持下来,写完之后去思考去品,你就会有一种突拨开云雾的感觉,所以请不要在半途感觉自己看不懂选择放弃,如果我哪里写的详细,或者需要修正请联系 ...
- 企业项目实战 .Net Core + Vue/Angular 分库分表日志系统二 | 简单的分库分表设计
教程预览 01 | 前言 02 | 简单的分库分表设计 03 | 控制反转搭配简单业务 04 | 强化设计方案 05 | 完善业务自动创建数据库 06 | 最终篇-通过AOP自动连接数据库-完成日志业 ...
- 升级项目到.NET Core 2.0,在Linux上安装Docker,并成功部署
概述 容器,顾名思义是用来存放并容纳东西的器皿: 而容器技术伴着Docker的兴起也渐渐的映入大家的眼帘,它是一个抽象的概念,同时也是默默存在世上多年的技术,不仅能使应用程序间完全的隔离,而且还能在共 ...
- [转].NET 4.5+项目迁移.NET Core的问题记录 HTTP Error 502.5
本文转自:http://www.cnblogs.com/ronli/p/5900001.html 这几天试着把目前的开发框架迁移到新的.net core平台,中间遇到的问题在这里简单记录一下. 迁移过 ...
随机推荐
- Linux释放内存
在Linux系统下,我们一般不需要去释放内存,因为系统已经将内存管理的很好.但是凡事也有例外,有的时候内存会被缓存占用掉,导致系统使用SWAP空间影响性能,此时就需要执行释放内存(清理缓存)的操作了. ...
- 优盘文件系统(FOR C)
优盘上的数据按照其不同的特点和作用大致可分为5 部分:MBR 区.DBR 区.FAT 区.FDT区和DATA 区. 主引导记录(MBR) 绝对扇区号为:MBR_LBA=0x00000000 处是主引导 ...
- 主要协议SCSI、FC、iSCSI
一.SCSI SCSI是小型计算机系统接口(Small Computer System Interface)的简称,于1979首次提出,是为小型机研制的一种接口技术,现在已完全普及到了小型机,高低端服 ...
- SQLSERVER读懂语句运行的统计信息
SQLSERVER读懂语句运行的统计信息 对于语句的运行,除了执行计划本身,还有一些其他因素要考虑,例如语句的编译时间.执行时间.做了多少次磁盘读等. 如果DBA能够把问题语句单独测试运行,可以在运行 ...
- 超大批量删除redis中无用key+配置
目前线上一个单实例redis中无用的key太多,决定删除一部分. 1.删除指定用户的key,使用redis的pipeline 根据一定条件把需要删除的用户统计出来,放到一个表里面,表为 del_use ...
- < IOS > X-code 5.1 x86 - 64 编译问题
关于xcode 5.1 x86 - 64 编译问题 坐等了N久,终于IOS 7.1 发布了,作为一个果粉,忍不住第一时间升级了.结果用设备测试的时候,出问题了,一直检测不到设备,哈哈,纠结了半 ...
- Combination Sum II 解答
Question Given a collection of candidate numbers (C) and a target number (T), find all unique combin ...
- LeeCode-Number of 1 Bits
Write a function that takes an unsigned integer and returns the number of ’1' bits it has For exampl ...
- java没有条件编译
摘自http://maosidiaoxian.iteye.com/blog/1290740 条件编译绝对是一个好东西.如在C或CPP中,可以通过预处理语句来实现条件编译.代码如下: #IFDEF DE ...
- 徐汉彬:亿级Web系统搭建—单机到分布式集群
当一个Web系统从日访问量10万逐步增长到1000万,甚至超过1亿的过程中,Web系统承受的压力会越来越大,在这个过程中,我们会遇到很多的问题.为了解决这些性能压力带来问题,我们需要在Web系统架构层 ...