天天看點

.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 Core系列 :3 、使用多個項目

如何了解這個表格

  • 如果一個類庫指定.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 添加,檔案内容如下:

    "debugType": "portable",

    "emitEntryPoint": true

    "netcoreapp1.0": {

        "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。

Project DotnetNewLib (.NETStandard,Version=v1.6) will be compiled because expected outputs are missing

Compiling DotnetNewLib for .NETStandard,Version=v1.6

Time elapsed 00:00:02.8849475

Project DotnetNewApp (.NETCoreApp,Version=v1.0) will be compiled because dependencies changed

Time elapsed 00:00:03.0273700

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 、使用多個項目