教學課程:在使用 Windows 應用程式 SDK 的在外部位置進行封裝或未封裝應用程式中,使用啟動程序載入器 API (機器翻譯)

本文說明如何設定未使用 MSIX 進行安裝的應用程式 (也就是封裝時含有外部位置式或未封裝) 來使用啟動程序載入程式 API,以便明確地載入 Windows 應用程式 SDK 執行階段並呼叫 Windows 應用程式 SDK API。 未透過 MSIX 安裝的應用程式包括含有外部位置的封裝應用程式,以及未封裝應用程式。

重要

自 Windows 應用程式 SDK 1.0 開始,在外部位置進行封裝的應用程式或未封裝應用程式載入 Windows 應用程式 SDK 的預設方法,為透過 <WindowsPackageType> 專案屬性執行「自動初始化」(以及進行其他設定變更)。 如需在 WinUI 3 專案脈絡中進行自動初始化的步驟,請參閱建立您的第一個 WinUI 3 專案。 如果您的現有專案並非 WinUI 3,請參閱在現有專案中使用 Windows 應用程式 SDK

如果您有進階需求 (例如自訂錯誤處理,或載入特定版本的 Windows 應用程式 SDK),可以改為明確呼叫啟動程序載入程式 API。 這就是本主題所示範的方法。 此外,如需詳細資訊,請參閱將 Windows 應用程式 SDK 執行階段使用在含有外部位置的封裝應用程式或未封裝應用程式

本主題示範如何從基本主控台應用程式專案明確呼叫啟動程序載入程式 API;但這些步驟適用於任何使用 Windows 應用程式 SDK 的未封裝桌面應用程式。

在完成本教學課程之前,建議您先參閱執行階段架構,以便深入瞭解應用程式在使用 Windows 應用程式 SDK 時所需的架構套件相依性,以及使用含有外部位置的封裝應用程式或未封裝應用程式時所需的其他元件。

必要條件

  1. 安裝 Windows 應用程式 SDK 的工具
  2. 確保含有外部位置的封裝應用程式和未封裝應用程式的所有相依性皆已安裝 (請參閱架構相依的含外部位置封裝應用程式或未封裝應用程式的 Windows 應用程式 SDK 部署指南)。 最簡單的方法是執行 Windows 應用程式 SDK 執行階段安裝程式。

指示

您可以使用 C# 或 C++ 專案來執行本教學課程的步驟。

注意

由高權限程序呼叫時,動態相依性和啟動程序載入程式 API 會失敗。 因此,啟動 Visual Studio 時不應提高權限。 如需詳細資訊,請參閱動態相依性不支援高權限 #567

請按照以下指示來設定封裝時含有外部位置或未封裝的 C# WinUI 3 專案。

  1. 在 Visual Studio 建立新的 C# 主控台應用程式專案。 將專案 命名為 DynamicDependenciesTest。 建立專案之後,您應該會得到「Hello World」C# 主控台應用程式。

  2. 接著請設定新專案。

    1. 「方案總管」中,以滑鼠右鍵按一下專案,然後選擇 [編輯專案檔]
    2. TargetFramework 元素的值替換為目標 Framework Moniker。 舉例來說,如果您的應用程式以 Windows 10 版本 2004 為目標,請使用下列項目。
    <TargetFramework>net6.0-windows10.0.19041.0</TargetFramework>
    
    1. 儲存並關閉專案檔。
  3. 將解決方案的平台變更為 x64。 .NET 專案的預設值是 AnyCPU,但 WinUI 3 不支援該平台。

    1. 選取 [組建]>[組態管理員]
    2. 選取「使用中的解決方案平台」底下的下拉式清單,然後按一下 [新增] 開啟「新增解決方案平台」對話方塊。
    3. 類型下方的下拉式選單中,或選取新平台,選取 [x64]
    4. 按一下 [確定] 以關閉 [新增解決方案平台] 對話方塊。
    5. 組態管理員按一下 [關閉]
  4. 在專案中安裝 Windows 應用程式 SDK NuGet 套件。

    1. 「方案總管」中以滑鼠右鍵按一下 [相依性] 節點,然後選擇 [管理 NuGet 套件]
    2. 「NuGet 套件管理員」視窗中,選取 [瀏覽] 索引標籤,然後安裝 Microsoft.WindowsAppSDK 套件。
  5. 您現在已可使用啟動程序載入程式 API (請參閱將 Windows 應用程式 SDK 執行階段使用於含有外部位置的封裝應用程式或未封裝應用程式),以便動態地與 Windows 應用程式 SDK 架構套件相依。 這可讓您在應用程式使用 Windows 應用程式 SDK API。

    開啟 Program.cs 程式碼檔案,並以下列程式碼取代預設程式碼,以便呼叫 Bootstrap.Initialize 方法來初始化啟動程序載入程式。 此程式碼定義了啟動程序載入程式在初始化時,應用程式所相依的 Windows 應用程式 SDK 版本。

    重要

    您必須編輯下列程式碼,以便與您的特定設定相符。 請參閱 Bootstrap.Initialize 方法的參數說明,以便您指定已安裝的其中一個 Windows 應用程式 SDK 版本。

    using System;
    using Microsoft.Windows.ApplicationModel.DynamicDependency;
    
    namespace DynamicDependenciesTest
    {
        class Program
        {
            static void Main(string[] args)
            {
                Bootstrap.Initialize(0x00010002);
                Console.WriteLine("Hello, World!");
    
                // Release the DDLM and clean up.
                Bootstrap.Shutdown();
            }
        }
    }
    

    啟動程序載入程式 API 在根目錄是原生的 C/C++ API,可讓您在應用程式中使用 Windows 應用程式 SDK API。 但在使用 Windows 應用程式 SDK 1.0 或之後版本的 .NET 應用程式中,您可以將 .NET 包裝函式用於啟動程序載入程式 API。 該包裝函式可讓您在 .NET 應用程式呼叫啟動程序載入程式 API,這種方式比起直接呼叫原生 C/C++ 函式更簡單。 上述程式碼範例會針對啟動程序載入程式 API 呼叫 .NET 包裝函式中 Bootstrap 類別的靜態 InitializeShutdown 方法。

  6. 若要證明 Windows 應用程式 SDK 執行階段元件已正確載入,請在 Windows 應用程式 SDK 新增幾個使用 ResourceManager 類別的程式碼,藉此載入字串資源。

    1. 將新的 資源檔 (.resw) 新增至您的專案 (保留預設名稱)。

    2. 在編輯器已開啟資源檔案的情況下,使用下列屬性建立新的字串資源。

      • 名稱:Message
      • 值:Hello, resources!
    3. 儲存資源檔案。

    4. 開啟 Program.cs 程式碼檔案,並以下列程式碼取代 Console.WriteLine("Hello, World!"); 行。

    // Create a resource manager using the resource index generated during build.
     var manager = new Microsoft.Windows.ApplicationModel.Resources.ResourceManager("DynamicDependenciesTest.pri");
    
    // Look up a string in the .resw file using its name.
    Console.WriteLine(manager.MainResourceMap.GetValue("Resources/Message").ValueAsString);
    
    1. 按一下 [啟動但不偵錯] (或 [開始偵錯]) 以組建並執行應用程式。 字串 Hello, resources! 應該會成功顯示。

如果您的專案是 WPF

如果是 Windows Presentation Foundation (WPF) 應用程式,請參閱在 WPF 應用程式使用 Windows 應用程式 SDK