<em id="3iliw"></em>
  • <progress id="3iliw"></progress>
  • <tbody id="3iliw"><pre id="3iliw"></pre></tbody><dd id="3iliw"><noscript id="3iliw"></noscript></dd>

    <progress id="3iliw"></progress>

    杭州.net培訓
    達內杭州.net培訓中心

    13175137725

    .NET Core 和 .NET Standard之間的關系

    • 時間:2019-01-17 17:19
    • 發布:轉載
    • 來源:網絡

    .NET Core簡介

    作為.NET FrameworkSilverlight分支,.NET Core是全新的.NET實現,不僅跨平臺,而且還完全開放源代碼。通過啟用獨立式XCOPY部署,它已經過優化,更適用于移動和服務器工作負載。

    為了能夠更好地認識.NET Core,接下來將深入了解如何進行.NET Core開發。為此,將同時探索新的命令行工具。也可以使用Visual Studio 2017進行.NET Core開發,但本文讀者很可能已相當熟悉Visual Studio,因此我將重點介紹新體驗。

    .NET創建之初,它經過了大量優化,以便用戶能夠在Windows上快速開發應用程序。實際上,這意味著.NET開發Visual Studio是不可分開的。可以肯定的是:使用Visual Studio進行開發是一種奇妙的感受。這樣開發的工作效率超高,調試程序是我使用過的最好用的。

    不過,有時,使用Visual Studio并不是最便捷的選擇。假設只是想通過.NET學習C#。在這種情況下,就無需下載并安裝好幾個GBIDE。或者,假設要通過SSH訪問Linux計算機。在這種情況下,使用IDE根本就行不通。又或者,假設只是喜歡使用命令行接口(CLI)

    正因為此,名為.NET Core CLI的一流CLI誕生了。.NET Core CLI的主驅動程序稱為“dotnet”。它可用于開發的幾乎所有方面,包括創建、生成、測試和打包項目。接下來,將了解具體操作。

    首先,創建并運行Hello World控制臺應用程序(我使用的是Windows PowerShell,而在macOSLinux上使用Bash也同樣有效):

    $ dotnetnewconsole -o hello

    $ cd hello

    $ dotnet run

    Hello World!

    CLI中的“dotnet ew”命令相當于Visual Studio中的文件|新建項目。可以創建各種不同類型的項目。鍵入“dotnet new”可以查看預安裝的各種模板。

    現在,將一些邏輯提取到類庫中。為此,請先創建與“hello”項目平行的類庫項目:

    $ cd ..

    $ dotnetnewlibrary -o logic

    $ cd logic

    由于要封裝的邏輯是構造Hello World消息,因此將Class1.cs的內容更改為以下代碼:

    namespacelogic

    { publicstaticclassHelloWorld

    {     publicstaticstringGetMessage(stringname) => $"Hello {name}!";

    }

    }

    此時,還應將Class1.cs重命名為HelloWorld.cs

    $ mv Class1.cs HelloWorld.cs

    請注意,無需因為有此更改而更新項目文件。.NET Core中使用的新項目文件只包括項目目錄中的所有源文件。因此,添加、刪除和重命名文件不再需要修改項目。這樣一來,可以更順暢地使用命令行執行文件操作。

    若要使用Hello World類,需要將hello應用程序更新為引用邏輯庫。為此,可以編輯項目文件,也可以使用dotnet add reference命令:

    $ cd ../hello

    $ dotnet add reference ../logic/logic.csproj

    現在,將Program.cs文件更新為使用HelloWorld

    usingSystem;usinglogic;namespacehello

    {classProgram

    {staticvoidMain(string[] args)

    {

    Console.Write("What's your name: ");varname = Console.ReadLine();varmessage = HelloWorld.GetMessage(name);

    Console.WriteLine(message);

    }

    }

    }

    若要生成并運行應用程序,只需鍵入dotnet run

    $ dotnet run

    What's your name: Immo

    Hello Immo!

    還可以通過命令行創建測試。CLI支持MSTest和常用的xUnit框架。此示例使用xUnit

    $ cd ..

    $ dotnetnewxunit -o tests

    $ cd tests

    $ dotnet add reference ../logic/logic.csproj

    更改UnitTest1.cs內容以添加測試

    usingSystem;usingXunit;usinglogic;namespacetests

    {publicclassUnitTest1

    {

    [Fact]publicvoidTest1()

    {varexpectedMessage ="Hello Immo!";varactualMessage = HelloWorld.GetMessage("Immo");

    Assert.Equal(expectedMessage, actualMessage);

    }

    }

    }

    現在,可以調用dotnet test運行測試:

    $ dotnet test

    Total tests: 1. Passed: 1. Failed: 0. Skipped: 0.

    Test Run Successful.

    為了讓操作變得更有趣一點,將創建簡單的ASP.NET Core網站:

    $ cd ..

    $ dotnetnewweb -o web

    $ cd web

    $ dotnet add reference ../logic/logic.csproj

    編輯Startup.cs文件,并將app.Run調用更改為使用HelloWorld類,如下所示:

    app.Run(async(context) =>

    { varname = Environment.UserName; varmessage = logic.HelloWorld.GetMessage(name); awaitcontext.Response.WriteAsync(message);

    });

    若要啟動開發Web服務器,只需再次運行dotnet run

    $ dotnet run

    Hosting environment: Production

    Now listeningon: http://localhost:5000Application started. Press Ctrl+C to shut down.

    轉到所顯示的URL(應為http://localhost:5000)。

    此時,創建的項目結構

    $ tree /f

    ├───hello

    hello.csproj

    Program.cs

    ├───logic

    HelloWorld.cs

    logic.csproj

    ├───tests

    tests.csproj

    UnitTest1.cs

    └───web

    Program.cs

    Startup.cs

    web.csproj

    為了能夠更方便地使用Visual Studio編輯文件,還將創建解決方案文件,并將所有項目添加到解決方案中:

    $ cd ..

    $ dotnetnewsln -n HelloWorld

    $ ls -fi *.csproj -rec | % { dotnet sln add $_.FullName }

    可以看到,.NET Core CLI功能非常強大,能夠為具有其他背景的開發者提供相當熟悉的精益體驗。雖然此過程是將dotnetWindows PowerShell結合使用,但如果是在LinuxmacOS上,使用體驗也會非常相似。

    .NET Core的另一巨大優勢在于,它支持獨立式部署。可以使用Docker對應用程序進行容器化處理,以便它能夠有自己的.NET Core運行時副本。這樣一來,可以在使用不同版本.NET Core的同一臺計算機上運行各種應用程序,而它們則互不干擾。由于.NET Core開放源代碼,因此還可以添加每日版或甚至自己修改或生成的版本,其中可能包括自己所做的修改。不過,這并不在本文的討論范圍之內。

    .NET Standard簡介

    在開發者生成新式體驗時,應用程序通常跨越多種外形規格,因而也就跨越多個.NET實現。今時今日,客戶非常希望可以在手機上使用Web應用程序,并希望能夠通過基于云的后端共享數據。使用筆記本電腦時,他們也希望可以通過網站獲得訪問權限。對于自己的基礎結構,很可能希望可以借助命令行工具和潛在的桌面應用程序,允許員工管理系統。了解具有此類用途的不同.NET實現。

    在這樣的環境下,代碼共享成為重大挑戰。需要了解API的可用位置,并確保共享組件僅使用跨所有要用.NET實現都支持的API

    此時,.NET Standard就派上用場了。.Net Standard是一種規范。每個.NET Standard版本都定義了一組API。為了與相應版本保持一致,所有.NET實現都必須提供這些API。可以將.NET Standard看作是另一個.NET堆棧,不同之處在于無法為其生成應用程序,只能生成庫。若希望可以從任意位置引用庫,應對庫使用此.NET實現。

    大家不禁想知道,.NET Standard涵蓋了哪些API。如果熟悉.NET Framework,就應該熟悉我之前提到的BCLBCL是與UI框架和應用程序模型無關的一組基礎API。它包括基元類型、文件I/O、網絡、反射、序列化、XML等。

    所有.NET堆棧都會實現某版.NET Standard。經驗法則是,生成新版.NET實現時,通常都會實現最新版.NET Standard

    很貼切的例子是HTML和瀏覽器:將HTML規范看作是.NET Standard,將不同的瀏覽器看作是.NET實現,如.NET Framework.NET CoreXamarin

    此時,大家可能非常好奇,如何使用.NET Standard。實際上,大家已經知道了。還記得之前創建邏輯類庫時的情形嗎?接下來,將深入了解一下項目文件:

    $ cd logic

    $ cat logic.csproj

    <Project Sdk="Microsoft.NET.Sdk">

    <PropertyGroup>

    <TargetFramework>netstandard2.0</TargetFramework>

    </PropertyGroup>

    </Project>

    將此文件與“hello”控制臺應用程序項目文件進行對比:

    $ cd ..\hello

    $ cat hello.csproj

    <Project Sdk="Microsoft.NET.Sdk">

    <ItemGroup>

    <ProjectReference Include="..\logic\logic.csproj"/>

    </ItemGroup>

    <PropertyGroup>

    <OutputType>Exe</OutputType>

    <TargetFramework>netcoreapp2.0</TargetFramework>

    </PropertyGroup>

    </Project>

    可以看到,邏輯庫的TargetFramework值為netstandard2.0,而控制臺應用程序的值為netcoreapp2.0TargetFramework屬性指明要定目標到的.NET實現。因此,控制臺應用程序定目標到.NET Core 2.0,而庫定目標到.NET Standard 2.0。也就是說,不僅可以從.NET Core應用程序引用邏輯庫,還可以從生成的.NET FrameworkXamarin應用程序引用邏輯庫。

    遺憾的是,目前可用的大多數庫都尚未定目標到.NET Standard。大多數庫都定目標到.NET Framework。當然,并不是所有庫都可以(或甚至應該)定目標到.NET Standard。例如,包含Windows Presentation Foundation (WPF)控件的庫需要定目標到.NET Framework,因為UI并不是標準的一部分。不過,許多常規用途庫定目標到.NET Framework只是因為,在它們創建時還沒有.NET Standard

    .NET Standard 2.0推出后,API集變得非常大,大多數(如果不是全部的話)常規用途庫可以定目標到.NET Standard。因此,目前NuGet上的全部庫中有70%只使用現在屬于.NET StandardAPI。盡管如此,其中只有一小部分明確標注為與.NET Standard兼容。

    為了讓開發者無障礙地使用它們,添加了一種兼容性模式。如果安裝的NuGet包沒有為目標框架提供庫,也沒有為.NET Standard提供庫,那么NuGet會轉而求助于.NET Framework。也就是說,可以引用.NET Framework庫,就像是定目標到.NET Standard一樣。

    我將演示一下具體操作。在此示例中,我將使用名為PowerCollections的常用集合庫,它是在2007年編寫的。它有一段時間沒有更新了,仍定目標到.NET Framework 2.0。我將從NuGet將此庫安裝到hello應用程序中:

    $ dotnet add package Huitian.PowerCollections

    此庫提供了BCL沒有的其他集合類型,如不保證排序的包。接下來,將把hello應用程序更改為使用此庫,

    usingSystem;usingWintellect.PowerCollections;namespacehello

    {classProgram

    {staticvoidMain(string[] args)

    {vardata =newBag<int>() { 1, 2, 3 };foreach(varelementindata)

    Console.WriteLine(element);

    }

    }

    }

    如果運行程序,將會看到以下警告:

    $ dotnet run

    hello.csproj : warning NU1701: Package'Huitian.PowerCollections 1.0.0'was restoredusing'.NETFramework,Version=v4.6.1'instead of the project target framework'.NETCoreApp,Version=v2.0'. This may cause compatibility problems.

    1

    3

    2

    那么,究竟發生了什么?hello應用程序定目標到.NET Core 2.0。由于.NET Core 2.0實現的是.NET Standard 2.0,因此還有可引用.NET Framework庫的兼容性模式。不過,并不是所有.NET Framework庫都適用于各種.NET實現。例如,它們可能會使用Windows窗體或WPF API。由于無法確定具體情況,因此NuGet會顯示警告消息,提醒注意這種情況,這樣就不會浪費時間排查可能由此導致的問題了。

    請注意,每次生成時都會看到此警告。這樣可避免在包安裝期間根本看不到警告或忘記這種情況的問題。

    當然,沒有什么比每次生成時都需要忽略無法作為行動依據的警告更糟糕的了。因此,建議在驗證應用程序后,為相應包禁用警告。由于應用程序運行正常(正確輸出了所創建的包的內容),因此現在可以取消警告。為此,請編輯hello.csproj文件,并將NoWarn屬性添加到包引用中:

    <PackageReference Include="Huitian.PowerCollections"Version="1.0.0"

    NoWarn="NU1701"/>

    如果現在重新運行應用程序,就再也不會看到警告了。如果安裝另一個使用兼容性模式的包,也會看到可以取消的相應包警告。

    使用新工具,還可以讓類庫項目創建屬于生成的NuGet包。這樣一來,可以更輕松地與全世界共享庫(通過推送到nuget.org),也可以僅在組織內共享(通過推送到大家在Visual Studio Team ServicesMyGet上自己的包源)。新項目還支持多重定目標,這樣就可以生成一個適用于多個.NET實現的項目。也就是說,可以使用條件編譯(#if)來調整庫,使其適應特定的.NET實現。還可以生成平臺專屬API.NET Standard包裝器。不過,這些都不在本文的討論范圍之內。

     

    預約申請免費試聽課

    怕錢不夠?就業掙錢后再付學費!    怕學不會?從入學起,達內定制課程!     擔心就業?達內多家實踐企業供你挑選!

    上一篇:異步編程你必須了解的!
    下一篇:劃重點了!
    • 掃碼領取資料

      回復關鍵字:視頻資料

      免費領取 達內課程視頻學習資料

    • 視頻學習QQ群

      添加QQ群:1143617948

      免費領取達內課程視頻學習資料

    Copyright ? 2018 Tedu.cn All Rights Reserved 京ICP備08000853號-56 京公網安備 11010802029508號 達內時代科技集團有限公司 版權所有

    選擇城市和中心
    江西省

    貴州省

    廣西省

    海南省

    国拍自产亚洲 2019国拍自产在线,国拍自产亚洲,国产a在线不卡 百度 好搜 搜狗
    <蜘蛛词>| <蜘蛛词>| <蜘蛛词>| <蜘蛛词>| <蜘蛛词>| <蜘蛛词>| <蜘蛛词>| <蜘蛛词>| <蜘蛛词>| <蜘蛛词>| <蜘蛛词>| <蜘蛛词>| <蜘蛛词>| <蜘蛛词>| <蜘蛛词>| <蜘蛛词>| <蜘蛛词>| <蜘蛛词>| <蜘蛛词>| <蜘蛛词>| <蜘蛛词>| <蜘蛛词>| <蜘蛛词>| <蜘蛛词>| <蜘蛛词>| <蜘蛛词>| <蜘蛛词>| <蜘蛛词>| <蜘蛛词>| <蜘蛛词>| <蜘蛛词>| <蜘蛛词>| <蜘蛛词>| <蜘蛛词>| <蜘蛛词>| <蜘蛛词>| <蜘蛛词>| <蜘蛛词>| <蜘蛛词>| <蜘蛛词>| <蜘蛛词>| <文本链> <文本链> <文本链> <文本链> <文本链> <文本链>