共用方式為


.NET Native 用戶入門

無論您是撰寫新的 UWP app,還是移轉現有的 Windows 8.x 應用程式(先前也稱為Microsoft市集應用程式),您都可以遵循相同的程式集。 若要建立 .NET 原生應用程式,請遵循下列步驟:

  1. 開發通用 Windows 平臺 (UWP) 應用程式,並測試應用程式的偵錯組建,以確保其運作正常。

  2. 處理額外的反射和序列化使用方式

  3. 部署及測試 App 的發行版本

  4. 手動解決遺漏的元數據,並重複 步驟 3,直到所有問題都解決為止。

備註

如果您要將現有的 Windows 8.x 應用程式移轉至 .NET Native,請務必檢閱將 Windows 8.x 應用程式移轉至 .NET Native

步驟 1:開發和測試 UWP 應用程式的偵錯組建

無論您是開發新的應用程式或移轉現有的應用程式,您都遵循與任何 Windows 應用程式相同的程式。

  1. 使用 Visual C# 或 Visual Basic 的通用 Windows 應用程式範本,在 Visual Studio 中建立新的 UWP 專案。 根據預設,所有以 CoreCLR 為目標的 UWP 應用程式及其發行組建都會使用 .NET 原生工具鏈進行編譯。

  2. 請注意,使用 .NET Native 工具鏈編譯 UWP 應用程式專案與不使用 UWP 應用程式項目之間有一些已知的相容性問題。 如需詳細資訊,請參閱 移轉指南

您現在可以針對本機系統或模擬器上執行的 .NET 原生介面區撰寫 C# 或 Visual Basic 程式代碼。

這很重要

當您開發應用程式時,請注意程式代碼中任何使用串行化或反映。

根據預設,偵錯組建會進行 JIT 編譯,以啟用快速 F5 部署,而發行組建則使用 .NET Native 預先編譯技術進行編譯。 這表示您應該建置及測試應用程式的偵錯組建,以確保它們正常運作,再使用 .NET 原生工具鏈進行編譯。

步驟 2:處理額外的反射和序列化使用方式

當您建立專案時,運行時間指示詞檔案 Default.rd.xml會自動新增至您的專案。 如果您在 C# 中進行開發,則會在專案的 Properties 資料夾中找到。 如果您在 Visual Basic 中開發,則會在專案的 My Project 資料夾中找到。

備註

如需了解為何需要運行時指令檔案的背景及 .NET Native 編譯過程的概觀,請參閱 .NET Native 和 Compilation

運行時間指示詞檔案可用來定義應用程式在運行時間所需的元數據。 在某些情況下,檔案的預設版本可能已足夠。 不過,某些依賴序列化或反射的程式碼可能需要在執行階段指令檔案中添加額外的項目。

串行化

序列化器有兩種類別,而且兩者可能需要在運行時指令檔案中加入額外項目:

  • 非反射式序列化工具。 在 .NET Framework 類別庫中找到的串行化程式,例如 DataContractSerializerDataContractJsonSerializerXmlSerializer 類別,並不依賴反映。 不過,它們確實需要根據要串行化或還原串行化的對象產生程序代碼。 如需詳細資訊,請參閱 串行化和元數據中的 Microsoft 序列化器 章節。

  • 第三方序列化工具。 第三方序列化函式庫中最常見的是 Newtonsoft JSON 序列化工具,通常是基於反射的,而且需要 *.rd.xml 檔案中的條目來支援物件序列化和反序列化。 如需詳細資訊,請參閱 序列化和元數據中的“第三方序列化程式”一節。

依賴反射的方法

在某些情況下,在程式碼中使用反射並不明顯。 某些常見的 API 或程式設計模式不會被視為反映 API 的一部分,而是依賴反映才能順利執行。 這包括下列類型具現化和方法建構方法:

如需詳細資訊,請參閱 依賴反射的 API

備註

執行時指令檔案中使用的類型名稱必須完全限定。 例如,檔案必須指定 「System.String」 而不是 「String」。

步驟 3:部署及測試應用程式的發行組建

更新運行時間指示詞檔案之後,您可以重建和部署應用程式的發行組建。 .NET Native 二進制檔會放在專案 [屬性] 對話框的 [建置輸出 路徑] 文本框中所指定目錄 的 ILC.out 子目錄中,[編譯] 索引卷標。不在此資料夾中的二進位檔尚未使用 .NET Native 進行編譯。 徹底測試您的應用程式,並在每個目標平台上測試所有案例,包括失敗案例。

如果您的應用程式無法正常運作(特別是在執行期間擲回 MissingMetadataException 或 MissingInteropDataException 例外狀況的情況下),請按照下一節中的指示進行操作,步驟 4:手動解決遺漏的元數據。 啟用第一次機會例外狀況可協助您找到這些錯誤。

當您測試並偵錯應用程式的偵錯組建時,確信您已排除 MissingMetadataExceptionMissingInteropDataException 例外狀況,然後應該將應用程式以優化的 .NET Native 形式進行測試。 若要這樣做,請將使用中的項目組態從 Debug 變更為 Release

步驟 4:手動解析遺失的元數據

您在 .NET Native 中會遇到而在桌面不會遇到的最常見失敗是運行時 MissingMetadataExceptionMissingInteropDataExceptionMissingRuntimeArtifactException 例外狀況。 在某些情況下,缺少元數據可以表現在無法預期的行為,甚至是應用程式失敗中。 本節討論如何將指示詞新增至運行時間指示詞檔案,以偵錯和解決這些例外狀況。 如需有關執行階段指引格式的詳細資訊,請參閱 執行階段指引 (rd.xml) 組態檔參考。 新增運行時間指示詞之後,您應該 再次部署及測試 應用程式,並解析任何新的 MissingMetadataExceptionMissingInteropDataException,以及 MissingRuntimeArtifactException 例外狀況,直到您遇到其他例外狀況為止。

小提示

指定高階的執行時指令,使您的應用程式能夠對程式碼變更具有韌性。 建議您在命名空間和類型層級新增運行時間指令,而不是在成員層級。 請注意,韌性和更大的二進位檔以及編譯時間較長之間可能會有取捨。

解決遺漏的元數據例外狀況時,請考慮下列問題:

  • 應用程式在例外狀況之前嘗試執行的動作為何?

    • 例如,資料綁定、序列化或反序列化資料,還是直接使用反射 API?
  • 這是個別案例,還是您認為在其他類型中也會遇到相同的問題?

    • 例如,當應用程式物件模型中的類型被串行化時,會拋出 MissingMetadataException 例外。 如果您知道其他將會序列化的類型,您可以同時針對這些類型(或其所屬的命名空間,依程式碼的組織方式而定)新增執行階段指示。
  • 您可以重寫程式代碼,使其不使用反映嗎?

    • 例如,當您知道預期的類型時,程式代碼是否使用 dynamic 關鍵詞?

    • 當有一些更好的替代方案可用時,程式代碼會呼叫相依於反映的方法嗎?

備註

如需有關處理反射與桌面應用程式和 .NET Native 之間差異以及元數據可用性問題的詳細資訊,請參閱依賴反射的 API APIs

如需處理例外狀況的一些特定範例,以及測試應用程式時發生的其他問題,請參閱:

另請參閱