舊版應用程式的 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)和/或更新版本,您可以在宣告 XML 命名空間前置詞後,設定 uap10:TrustLevel 和 uap10:RuntimeBehavior,而不是設定 EntryPoint,如圖所示。 像這樣:
<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>
...
您現在可以從封裝項目的<rescap:Capability Name="runFullTrust" />
檔案中移除Package.appxmanifest
。
設定 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:應用程式指令清單遺漏必要的元素 』PhoneIdentity』」。 如果發生這種情況,請編輯項目的 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# WPF 應用程式項目樣本建立的 Windows Presentation Foundation (WPF) 應用程式專案。 這會為您提供 .NET 專案;與名為 WPF 應用程式 (.NET Framework) 的專案範本不同。 或
- 使用 C# Windows Forms 應用程式專案範本建立的 Windows Forms (WinForms) 應用程式專案。 這會為您提供 .NET 專案;與名為 Windows Forms App (.NET Framework) 的專案範本不同。
簡言之,第一個步驟是將 C# Windows 應用程式封裝專案新增至您的解決方案。 在 Visual Studio 中為 MSIX 封裝設定桌面應用程式的文章中,有更詳細的資訊說明確切步驟。
然後展開封裝專案的 [ 相依性>應用程式 ] 節點,然後選取代表 WPF 或 WinForms 專案參考的節點。 然後在 Visual Studio 的 [屬性] 視窗(非專案屬性)中,針對 [信任層級] 屬性選擇 [部分信任] 的值。