這很重要
對於在 AppContainer 中執行的任何進程,如果您導致呼叫 DeploymentManager.Initialize,則您的應用程式必須在packageManagement中宣告受限制的功能。 更多細節請參閱 部署管理器自動初始化器。
舊版應用程式的 AppContainer 主題涵蓋 AppContainer 環境及其優點的所有必要背景資訊:該主題也包含 C# 和 C++程式代碼範例,以測試進程是否在 AppContainer 內執行。
您現在閱讀的主題示範如何取得使用 MSIX 封裝的應用程式,並輕鬆地設定它以在 AppContainer 環境中執行(在輕量型應用程式容器中)。 Universal Windows Platform (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:TrustLevel 和 uap10: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>
...
您現在可以從封裝項目的<rescap:Capability Name="runFullTrust" />檔案中移除Package.appxmanifest。
為 AppContainer 配置一個 Windows Application Project(C++ Win32 WndProc 類型的應用程式)
如果你有一個使用 Windows Application Project project 範本所建立的 C++ Win32 WndProc 型 project,這部分適合你。 第一步簡而言之,就是在您的解決方案中加入 C++ Windows 應用程式封裝 Project。 關於具體步驟的更多細節,請參考在 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 Application專案範本所建立的 Windows Presentation Foundation (WPF) 應用程式專案專案。 這樣會給你一個.NET專案;而且它和名為 WPF App (.NET Framework) 的專案範本不同。 或
- 一個使用 C# Windows Forms App 範本建立的 Windows Forms(WinForms) 應用程式專案專案。 這樣會給你一個.NET專案;而且它和名為 Windows Forms App (.NET Framework) 的專案範本不同。
第一步簡單來說,就是在您的解決方案中加入 C# Windows Application Packaging Project。 關於具體步驟的更多細節,請參考在 Visual Studio 設定你的桌面應用程式以 MSIX 封裝。
接著展開包裝專案的 Dependencies>Applications節點,選擇代表你WPF或 WinForms 專案參考的節點。 接著在 Visual Studio 的 Properties 視窗(非專案屬性)中,為 Trust Level 屬性選擇 Partial Trust 的值。