2016 年 7 月

第 31 卷,第 7 期

本文章是由機器翻譯。

基礎 .NET - Visual Studio 2015 隨附 .NET Core Tooling

Mark Michaelis

Mark Michaelis.NET core RC2 最後在這裡,而且這次,事實上,true 」 發行候選版本 」 而不是偽裝為發行候選 RC1 Beta (如果有,考慮它推出後的所有變更)。大部分的開發焦點和按周圍.NET Core 是當然的跨平台功能。新的.NET API,不僅也隨附的執行階段和工具組甚至導致這項重點上支援 Linux 和 Mac OS X。DOTNET 等工具。EXE (先前稱為 DNX、 DNVM 和 DNU),Visual Studio 程式碼,更別提的關鍵在於讓非 Microsoft 開發人員有機會利用.NET 和更多,第一級的開發人員的經驗。

這就是很好所有 —,事實上,令人驚訝 — 但是老道的 Microsoft 開發人員呢?  他們要如何繼續開發在 Windows 和 Visual Studio.NET Core 專案? 在本文中我要討論的各種.NET Core 專案類型,並說明新的檔案類型和它們的函式的詳細資料。我也將深入新的專案結構支援的並行偵錯任何開放原始碼 NuGet 套件,您可能會參考,以及您可以進入這類專案的原始程式碼。

快速入門

您就可以開始運用.NET 核心 RC2 之前,您會很明顯地想更新您的工具 — 在此情況下 Visual Studio 2015,以支援新的平台。基本上,這牽涉到兩個步驟︰

  1. 從 Visual Studio 2015 下載.NET Core 工具預覽 1 microsoft.com/net/core#windows (其中您也可以找到指示)。
  2. 安裝 NuGet 封裝管理員,從 bit.ly/27Rmeaj

我假設您已經安裝 Visual Studio 2015,但如果不是,Visual Studio Community Edition 可免費下載,網址 visualstudio.com

新的專案類型

安裝所有的 Visual Studio 工具之後您可以使用 [新專案精靈] 來建立專案 (請參閱 [圖 1)。

Visual Studio.NET Core 專案範本
[圖 1 Visual Studio.NET Core 專案範本

如您所見,有四種專案類型 (其中一個會出現兩次,它位於 Visual C# \Web 和 Visual C# \.NET 核心資料夾中)。

很明顯地,每個專案類型會產生一組不同的檔案中所示 [圖 2

[圖 2 中每個 Visual Studio 專案類型的檔案

檔案名稱 類別庫 主控台應用程式 ASP.NET 核心 Web 應用程式 (.NET 核心) ASP.NET 核心 Web 應用程式 (.NET Framework)
App.config       X
Properties\ assemblyinfo.cs X X    
Class1.cs X      
Global.json X X X X
Properties\launchSettings.json       X X
Program.cs   X X X
Project.json X X X X
Project.lock.json X X X X
Project_Readme.html     X X
< 專案 >.xproj     X X
< 專案 >。 xproj.user     X X
Startup.cs     X X
Web.config     X X

App.config 會類似於傳統 < 應用程式名稱 >.config 檔案,使用.NET Framework 1.0 以來的選擇性組態檔。下列程式碼會顯示預設檔案中,識別是否要使用伺服器為基礎的回收,或是類型-用戶端/工作站記憶體回收 (請參閱 bit.ly/22nm32o 如需詳細資訊):

<configuration>
  <runtime>
    <gcServer enabled="true"/>
   </runtime>
</configuration>

AssemblyInfo.cs 識別組件的資料,例如組態、 公司、 產品和商標。這是標準.NET 首次在 2000年發行後已經過 Visual Studio.NET 專案的一部分的 AssemblyInfo.cs 檔案。

Class1.cs 基本架構 C# 類別檔案 Class1 類別,而且包含其預設建構函式。

只要您選取 [建立方案的目錄] 時,會自動產生 「 Global.json 建立第一個.NET Core 專案。在本文稍後詳細的專案節點識別出原始碼的其他的位置進行偵錯時。

LaunchSettings.json 識別各種 Web 主控組態設定,包括應用程式 URL 進行偵錯。IIS 主應用程式 (例如 IIS Express) 如果有的話。啟動之前,設定環境變數,例如,.NET Core 組態使用識別環境 (開發、 測試或生產);SSL 和驗證。從 [專案屬性視窗的 Visual studio 的 [偵錯] 索引標籤所做的變更會提供用於編輯 launchSettings.json 檔案中,UI 中所示 [圖 3

偵錯] 索引標籤上的 Visual Studio 的 [專案屬性] 視窗
[圖 3 偵錯] 索引標籤上的 Visual Studio 的 [專案屬性] 視窗

[圖 4 顯示範例 launchSettings.json 檔案。

[圖 4 launchSettings.json 檔範例

{
  "iisSettings": {
    "windowsAuthentication": false,
    "anonymousAuthentication": true,
    "iisExpress": {
      "applicationUrl": "http://localhost:43799/",
      "sslPort": 0
    }
  },
  "profiles": {
    "IIS Express": {
      "commandName": "IISExpress",
      "launchBrowser": true,
      "environmentVariables": {
        "ASPNETCORE_ENVIRONMENT": "Development"
      }
    },
    "WebApplication1NetFramework": {
      "commandName": "Project",
      "launchBrowser": true,
      "launchUrl": "http://localhost:5000",
      "environmentVariables": {
        "ASPNETCORE_ENVIRONMENT": "Development"
      }
    }
  }
}

Project.json 是新的專案檔案,其功能重疊,在大型部分中,為 *。 * PROJ 檔案。它會識別等專案參考、 組建版本號碼,等選項,並識別要編譯到平台 — 是否.NET 核心或.NET Framework 中,例如。有更詳細的短時間內。

Project.lock.json 儲存編譯所需的檔案 (通常是 NuGet 參考) 清單。它包含特定封裝的版本號碼,不同於 project.json 檔案,可支援萬用字元。沒有 project.lock.json,就會發生的還原整個封裝。Project.lock.json 包含封裝的圖形,以及其他與本機下載的封裝相關的資料 (還原)。一般而言,這個檔案不簽入,它不存在時,它會重新建立執行 NuGet 封裝還原。這個檔案會列為 project.json Visual Studio 中的子系。

ClassLibrary.xproj 是 MSBuild 定義的檔案,根據預設,當您建置專案時,會發生什麼情況。最新版本匯入 Microsoft.DotNet.targets,定義建置工作會利用新的 DotNet.exe 命令。不同於過去的 MSBuild 專案檔,xproj 檔案是資訊的非常小,因為大部分已移至 project.json (適用於時間)。

ClassLibrary.xproj.useroverrides ClassLibrary.xproj 檔案,並提供其他的 MSBuild 屬性,例如本機使用者特定的偵錯設定,例如連接埠。一般而言,這個檔案不被簽入,因為它是特定使用者,並在 Visual Studio 中看不到。

Program.cs 定義會包含您的應用程式的主要進入點程式類別 — 即使是針對 Web 應用程式。

Web.config 提供以最小設定 iis,以指示它要尋找 Web 主機處理序和設定的所有流量會被重新都導向至本程序,如下列程式碼所示︰

<?xml version="1.0" encoding="utf-8"?>
<configuration>
  <system.webServer>
    <handlers>
      <add name="aspNetCore" path="*" verb="*" modules="AspNetCoreModule"
        resourceType="Unspecified"/>
    </handlers>
    <aspNetCore processPath="%LAUNCHER_PATH%" arguments="%LAUNCHER_ARGS%"    
      stdoutLogEnabled="false" stdoutLogFile=".\logs\stdout"
      forwardWindowsAuthToken="false"/>
  </system.webServer>
</configuration>

請注意該 web.config 不再包含應用程式設定,而是會移到組態檔中所述我我 2016 年 2 月的文章,「 組態在.NET 的核心 」 載入的 Microsoft.Extensions.Configuration (bit.ly/1OoqmkJ)。

請注意,當 Visual Studio 中,選取 [建立方案] 選項的目錄] 所建立的所有.NET Core 專案類型與建立新的專案會將原始程式碼放入方案 src 子目錄。此外,預期的測試專案會放入測試目錄一起 src (雖然這不會根據預設,在.NET Core 工具預覽 1 Visual Studio 2015 版本)。建置文件等項目的是要考慮其他可能的目錄。(我承認我很想讓我的測試專案與正在測試的目標專案,而不是在完全不同的樹狀目錄中,但這不是 Microsoft 針對預設方案結構中,選取與經驗告訴我採用預設值,而不是來對抗它有可能)。

多個在 Project.json

可能是新的.NET Core 專案結構中最重要的檔案是 project.json。這個檔案被設計來︰

  • 取代 NuGet 檔案管理員 package.config 檔案,用來識別專案的 NuGet 參考。
  • 指定的專案支援的架構,以及如何建立特定架構的專案組態詳細資料。
  • 識別包含包括對應的平台所需的平台特定.NET Core 執行階段及其相依性的獨立應用程式的目標平台。或者,project.json 的可攜式應用程式專案時,識別哪些專案必須要有組件會在其執行的目標電腦上安裝的架構。

這三項工作會分散到 project.json (我結合執行階段,並支援當功能重疊,視專案類型而定) 中的四個主要部分︰

相依性︰ 此區段會列出每個專案所依賴的包括所述的相依性的版本號碼的 NuGet 封裝。您可以使用萬用字元指定版本號碼,因此您可以允許 「 最新版本 」 符合萬用字元下載會自動由 NuGet 封裝管理員還原。一組空括號的版本號碼說的 「 使用最新可用。 」 此外,雖然您可以加入透過 Visual Studio NuGet 封裝管理員] 視窗的參考,您也可以依據您設定的封裝來源或摘要可用之套件 Visual Studio 以非同步方式載入的 IntelliSense 的方式 (請參閱 [圖 5)。IntelliSense 適用於封裝名稱和版本號碼。

IntelliSense 以動態方式載入可用的封裝版本的清單
[圖 5 IntelliSense 以動態方式載入可用的封裝版本的清單

架構︰ 本章節中找出您的專案將執行的架構︰ net45,netstandard1.5、 net40,例如。此外,您可以在其中提供 buildOptions、 相依性、 frameworkAssemblies,以及匯入,來識別架構的應用程式而異。比方說,若要允許不安全的程式碼.NET 45 執行環境,您可以指定在架構項目︰

"net45": {"buildOptions": {"allowUnsafe": true}}

執行階段/支援︰ project.json 是否會使用執行階段或支援取決於是否專案的目標為可攜式或獨立的應用程式。針對獨立的應用程式,執行階段一節將識別哪些作業系統將會支援,因此,將組合至應用程式的執行階段程式庫。獨立的應用程式預先安裝在目標電腦上的任何項目上有任何相依性 (至少到目前為止.NET 而言)。

相較之下,支援一節會識別可攜式應用程式在啟動時的應用程式會尋找執行階段相依性,任何一個都已綽綽有餘。清單不是嚴格 (您可以執行在其他位置),但是,支援項目會造成檢查符合的所有相依性 NuGet。

雖然很久之後 RC2 發行,並不重要 RC1 及 RC2 諷刺的是,在 project.json,.NET Core 和 ASP.NET 小組判定該 project.json 無法,事實上,備援已確立的 MSBuild 專案檔,已經支援更多的功能,包括組態、 組建相依性,建置目標、 編譯旗標、 命令列和環境變數的屬性設定,以及建置命令。而是比重建所有這些,小組檢閱什麼第一時間觸發 project.json 檔案建立,並發現 *。 * PROJ 檔案是通常非常繁雜 — 列出專案中的每個檔案分別,比方說,而不使用通用慣例模式 (萬用字元)。膨脹如此重要,事實上是,開發人員很少開啟和執行組建、 前檢閱檔案,即使檔案可能無法具有內嵌在其中一些非預期的命令。而不是建立全新的組建檔案,小組決定修正內膨脹 *。 * PROJ 檔案,並甚至提供命令列公用程式來編輯它。唯一 project.json 具有 *。 * PROJ 檔案不是 JSON 語法。(但畢竟,JSON 是現代 XML,就像 XML 處於 [其日] 現代一般檔案或 INI 檔案。) 如需有關 project.json 的潛在落幕的詳細資訊,請參閱 ASP.NET 2016 5 月 10 日、 社群獨立和 Alexandre Mutel 所對應的 post 期間的 Damian Edwards 公告 (bit.ly/1NJ9r31),以及在他的部落格摘要威廉一 Meints (bit.ly/1sJc2An)。

偵錯封裝來源的程式碼

我最期待的功能之一是偵錯並逐步執行封裝,如果有的話,甚至修改封裝的原始碼的新支援。例如,假設您有許多小組間共用的全公司 「 Framework 」 組件。不過,架構封裝是基本上是開放原始碼的任何人都在公司內 (或者更好的在公司外部) 都可能導致改進和變更。現在,想像一下如果參考此架構的 NuGet 封裝,但在某個時間點有可疑可能需要解決的 bug 或可能是一項增強功能已獲得保證。一般而言,這需要使用與您的專案/方案無關的元件的原始程式碼。如果,相反地,您便能夠下載來源程式碼並更新為您主要的開發與整合式體驗 — 甚至逐步執行程式碼的符號伺服器或 PDB 檔案可在不依賴嗎? 所幸,這是在 Visual Studio 2015 中啟用的主要案例。

例如,假設您想要偵錯 Microsoft.Extensions.Logging 封裝,也就是可在 GitHub 上取得。若要新增並進行偵錯您的專案中,您要下載 (或許使用 git 複製或 git 子模組命令) 的原始程式碼。接下來,為了讓 Visual Studio 知道哪裡可以找到的原始程式碼,您需要編輯 global.json 專案節點,例如,加入的目錄清單中的 「 submodules\Logging 」 它監看︰

{
  "projects": [ "src", "test", "submodules\Logging" ],
  "sdk": {
    "version": "1.0.0-*"
  }
}

(如果有,比方說,您不到子目錄複製程式碼),您當然可以提供完整路徑。不過請注意目錄分隔符號是兩個反斜線 (\) 或單一正斜線 (例如 c: / 使用者/符號/文件/visual studio2015/Projects/Microsoft.Extensions.Logging)。

一旦更新 global.json 並儲存之後,Visual Studio 成功找到原始碼,它會自動加入專案至方案,您可以接著偵錯原始程式碼中。

相當貝氏演算法用來決定要載入哪一個來源的程式碼目錄︰

  1. 如果任何一個 global.json 中指定的程式碼來源位置包含具有相同的名稱 (例如 Microsoft.Extensions.Logging) 封裝的資料夾,該資料夾包含一個名為 project.json 檔案,偵錯工具會使用該資料夾和原始程式檔內。
  2. 否則會載入的封裝資料夾從已編譯的二進位檔。

請參閱 「 偵錯 ASP.NET 5 Framework 程式碼使用 Visual Studio 2015 」 (bit.ly/22niJ7w) 如需詳細資訊。

總結

如果您要深入了解.NET Core 尚未開始,現在正是若要這樣做,讓您的最長的時間範圍中要拉長學習曲線。對於您想從舊版升級,也是如此。答案應該是您將會升級在某個時間點,以及您所做的更快、 快您可以利用新功能。


Mark Michaelis 是的 IntelliTect,他擔任其技術架構設計人員和培訓講師的創辦人。 近二十他 Microsoft MVP 和 Microsoft 區域經理自已 2007年。Michaelis 服務於多個 Microsoft 軟體設計檢閱小組,包括 C#、 Microsoft Azure、 SharePoint 和 Visual Studio ALM。他開發人員會議上發表演說,並且已撰寫許多本書,包括他最新,「 基本 C# 6.0 (第 5 版) 」 (itl.tc/EssentialCSharp)。在 Facebook 上連絡他 facebook.com/Mark.Michaelis, ,他的部落格上 IntelliTect.com/Mark, ,在 Twitter 上: @markmichaelis 或透過電子郵件地 mark@IntelliTect.com

感謝下列 IntelliTect 技術專家來檢閱這份文件︰ Kevin Bost、 Andrew Scott 和 Michael Stokesbary