MSIX AppContainer 應用程式

舊版應用程式的AppContainer主題涵蓋AppContainer環境及其優點的所有必要背景資訊;該主題也包含 C# 和 C++ 程式代碼範例,以測試程式是否在 AppContainer 內執行。

您現在閱讀的主題示範如何取得使用 MSIX 封裝的應用程式,並輕鬆地設定它以在 AppContainer 環境中執行(在輕量型應用程式容器中)。 通用 Windows 平台 (UWP) 應用程式會自動是 AppContainer 應用程式。 但您也可以將搭配 MSIX 封裝的桌面應用程式設定為 AppContainer 應用程式。

AppContainer 應用程式的處理程序及其子處理程序會在輕量型應用程式容器內執行,在其中它們只能存取專門授與給它們的資源。 它們會使用檔案系統和登錄虛擬化來進行隔離。 因此,在 AppContainer 中實作的應用程式不會被駭客攻擊,而僅允許在有限的指派資源之外進行惡意的動作。

提示

未封裝的應用程式也可以在AppContainer中執行。 但是,如果您使用 MSIX 封裝,則使用 AppContainer 特別容易。 因此本主題所述的所有案例都是關於已封裝的應用程式。

設定 AppContainer 的 WinUI 3 專案

建立已封裝 C# 或 C++ WinUI 3 傳統型應用程式的新專案的步驟會顯示建立新 WinUI 3 專案的預設和建議方式。

根據預設,專案的 Package.appxmanifest 檔案包含完全信任的組態(也就是中完整性層級)套件。 相關區段如下所示:

...
<Applications>
  <Application ...
    EntryPoint="$targetentrypoint$">
    ...
  </Application>
</Applications>

<Capabilities>
  <rescap:Capability Name="runFullTrust" />
</Capabilities>
...

若要將套件設定為包含 AppContainer 應用程式,您可以編輯 EntryPoint 屬性,並移除受限制的功能宣告(但保留 Capabilities 元素)。 與下列類似:

...
<Applications>
  <Application ...
    EntryPoint="windows.partialTrustApplication">
    ...
  </Application>
</Applications>

<Capabilities/>
...

如果您的套件安裝在 Windows 10 版本 2004 (10.0;組建 19041) 和/或更新版本,而不是設定 EntryPoint,您可以設定 uap10:TrustLeveluap10:RuntimeBehavior (在宣告 XML 命名空間前置詞之後,如下所示)。 與下列類似:

<Package ...
  xmlns:uap10="http://schemas.microsoft.com/appx/manifest/uap/windows10/10"
  ...>
...
  <Applications>
    <Application ...
      EntryPoint="$targetentrypoint$"
      uap10:TrustLevel="appContainer"
      uap10:RuntimeBehavior="packagedClassicApp">
      ...
    </Application>
  </Applications>

  <Capabilities/>
...

如需詳細資訊,請參閱下列主題:

設定 AppContainer 的 WinUI 3 雙項目解決方案

上一節說明單一專案 MSIX 的程式;我們建議使用,這是新 WinUI 3 項目的預設值。 如需詳細資訊,請參閱 使用單一專案 MSIX 封裝您的應用程式。

但是,您可能有 WinUI 3 專案,其日期在引進單一專案 MSIX 功能之前。 在此情況下,您的方案中會有兩個專案,也就是您的應用程式專案,以及額外的 Windows 應用程式封裝專案。 如果您可以將專案移轉至單一專案 MSIX,則這是理想的做法。 而且,您將能夠遵循上一節中的指引。 如需詳細資訊,請參閱 使用單一專案 MSIX 封裝您的應用程式。

如果您 無法 將專案移轉至單一專案 MSIX,本節說明如何將套件設定為包含 AppContainer 應用程式。

Windows 應用程式封裝專案表示預設設定,其會覆寫 中的Package.appxmanifest組態。 項目的行為就像項目檔中有 TrustLevel 屬性設定為 Full 的值一樣。

若要補救隱含屬性值,請展開封裝專案的 [相依性>應用程式 ] 節點,然後選取代表 WinUI 3 專案參考的節點。 然後在 Visual Studio 的 [屬性] 視窗中,針對 [信任層級] 屬性選擇 [部分信任] 的值

封裝項目的項目檔現在包含這個明確的屬性:

...
<ItemGroup>
  <ProjectReference Include="...">
    <TrustLevel>Partial</TrustLevel>
  </ProjectReference>
</ItemGroup>
...

您現在可以從封裝項目的Package.appxmanifest檔案中移除<rescap:Capability Name="runFullTrust" />

設定 AppContainer 的 Windows 應用程式專案 (C++ Win32 WndProc 類型應用程式)

如果您有使用 Windows 應用程式專案範本建立的 C++ Win32 WndProc 類型專案,則本節適用於您。 簡言之,第一個步驟是將 C++ Windows 應用程式封裝專案新增至您的解決方案。 在 Visual Studio 中為 MSIX 封裝設定傳統型應用程式中的確切步驟,還有更多詳細數據。 該主題適用於以 C++ 或 C# 撰寫的桌面應用程式。

然後開啟新封裝項目的項目檔,並將 TrustLevel 屬性新增至現有的 ProjectReference 屬性,如下所示:

...
<ItemGroup>
  <ProjectReference Include="...">
    <TrustLevel>Partial</TrustLevel>
  </ProjectReference>
</ItemGroup>
...

當您建置時,可能會看到錯誤「錯誤APPX1673:應用程式指令清單遺漏必要的元素 』電話 Identity』」。 如果發生這種情況,請編輯項目的 Package.appxmanifest 檔案,如下所示:

<Package ...
  xmlns:mp="http://schemas.microsoft.com/appx/2014/phone/manifest"
  ...>
...
  <mp:PhoneIdentity
      PhoneProductId="A GUID in the form xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx."
      PhonePublisherId="A GUID in the form xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx.">
  </mp:PhoneIdentity>
...

設定 AppContainer 的 WPF 或 WinForms 專案

如果您有下列任一項,本節適合您:

簡言之,第一個步驟是將 C# Windows 應用程式封裝專案新增至您的解決方案。 在 Visual Studio 中為 MSIX 封裝設定傳統型應用程式中的確切步驟,還有更多詳細數據

然後展開封裝專案的 [相依性>應用程式 ] 節點,然後選取代表 WPF 或 WinForms 專案參考的節點。 然後在 Visual Studio 的 [屬性] 視窗中,針對 [信任層級] 屬性選擇 [部分信任] 的值