.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的多项目应用如何进行开发和注意事项。

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏ASP.NETCore

ASP.NET Core中如何调整HTTP请求大小的几种方式

一般的情况下,我们都无需调用HTTP请求的大小,只有在上传一些大文件,或者使用HTTP协议写入较大的值时(如调用WebService)才可能会调用HTTP最大请...

39240
来自专栏跟着阿笨一起玩NET

浅谈如何在C#Winform程序中正确使用登录窗体

看到很多朋友在CSDN中发帖放分求“如何实现登录验证正确后弹出主窗体”的问题。关于这个问题的实现方法,一般很多人都是使用在登录窗体点击“登录”按钮后,通过...

18010
来自专栏林德熙的博客

win10 uwp 打开文件管理器选择文件

本文:让文件管理器选择文件,不是从文件管理器获得文件。 假如已经获得一些文件,那么如何从文件管理器选择这些文件? 使用方法很简单。

20410
来自专栏me的随笔

.NET中使用NLog记录日志

以前小编记录日志使用的是Log4Net,虽然好用但和NLog比起来稍显复杂。下面小编就和大伙分享一下NLog的使用方式。

17940
来自专栏Ken的杂谈

ASP.NET Core 入门教程 2、使用ASP.NET Core MVC框架构建Web应用

ASP.NET Core 默认集成了DI。所有官方模块的引入都要使用DI的方式引入。

14220
来自专栏有困难要上,没有困难创造困难也要上!

Pyinstaller ERROR: Assembly amd64_Microsoft.VC90.CRT_1fc8b3b9a1e18e3b_9.0.21022.8_none not found

48480
来自专栏Jackson0714

【解决方案】VS2013外部工具中添加ildasm.exe

34360
来自专栏张善友的专栏

在.NET平台上运行Java程序-IKVM.NET入门

一、介绍 IKVM.NET是一个针对Mono和微软.net框架的java实现,其设计目的是在.NET平台上运行java程序。它包含了以下的组建: * 一个用.N...

23050
来自专栏重庆的技术分享区

python35下的NLTK工具的安装和配置

18520
来自专栏青玉伏案

Notepad++使用小结

还是那句话“工欲善其事必先利其器”用Notepad++也有一段时间了,也积累了一些东西,写篇博文与大家分享一下使用Notepad++的一些心得。    简单的...

252100

扫码关注云+社区

领取腾讯云代金券