處理序之間通訊 (IPC)
本主題說明在通用 Windows 平台 (UWP) 應用程式和 Win32 應用程式之間執行處理序間通訊 (IPC) 的各種方式。
應用程式服務
應用程式服務可讓應用程式在背景中,公開接受和傳回原始屬性包 (ValueSet) 的服務。 如果豐富物件已經序列化,則可以加以傳遞。
應用程式服務能夠以背景工作方式跨處理序執行,或是在幕前應用程式內同處理序執行。
應用程式服務最適合用來共用少量的資料,這種情況不需要接近即時的延遲。
COM
COM 是一個分散式物件導向系統,用於建立可以互動和通訊的二進位軟體元件。 身為開發人員,您可以使用 COM 為應用程式建立可重複使用的軟體元件和自動化層。 COM 元件可以是同處理序或跨處理序,而且可以透過用戶端和伺服器模型進行通訊。 跨處理序 COM 伺服器長期以來一直用來做為物件間通訊的方法。
具有 runFullTrust 功能的封裝應用程式可以透過套件資訊清單註冊 IPC 的跨處理序 COM 伺服器。 這稱為封裝 COM。
Filesystem
BroadFileSystemAccess
封裝的應用程式可以使用廣泛的檔案系統來執行 IPC,方法是宣告 broadFileSystemAccess 受限功能。 這項功能會授權 Windows.Storage API 和 xxxFromApp Win32 API 存取廣泛的檔案系統。
根據預設,透過檔案系統進行 IPC 的封裝應用程式會限制為本節所述的其他機制。
PublisherCacheFolder
PublisherCacheFolder 可讓封裝的應用程式在其資訊清單中宣告資料夾,這些資料夾可與同一發行者的其他套件共用。
共用儲存資料夾具有下列需求和限制:
- 共用儲存資料夾中的資料不會備份或漫遊。
- 使用者可以清除共用儲存資料夾的內容。
- 您無法使用共用儲存資料夾在不同發行者的應用程式之間共用資料。
- 您無法使用共用儲存資料夾在不同使用者之間共用資料。
- 共用儲存資料夾沒有版本管理。
如果您發佈多款應用程式,而且正在尋找一個簡單機制以便在它們之間共用資料,則 PublisherCacheFolder 是個簡單的檔案系統型選項。
SharedAccessStorageManager
SharedAccessStorageManager 會與應用程式服務、通訊協定啟用 (例如 LaunchUriForResultsAsync) 等搭配使用,透過權杖共用 StorageFiles。
FullTrustProcessLauncher
使用 runFullTrust 功能,封裝的應用程式可以在相同的套件內啟動完全信任處理序。
對於套件限制成為負擔或 IPC 選項不足的案例,應用程式可以使用完全信任處理序做為 Proxy 來連接系統,然後透過應用程式服務或其他一些妥善支援 IPC 機制的完全信任處理序本身來進行 IPC。
LaunchUriForResultsAsync
LaunchUriForResultsAsync 用來與實作 ProtocolForResults 啟用合約的其他封裝應用程式進行簡單 (ValueSet) 資料交換。 與通常在背景執行的應用程式服務不同,目標應用程式會在前景啟動。
透過 ValueSet 將 SharedStorageAccessManager 權杖傳遞至應用程式,即可共用檔案。
回送
回送這個程序會與在 localhost (回送位址) 上接聽的網路伺服器通訊。
為了維護安全性和網路隔離,預設會針對封裝應用程式封鎖 IPC 的回送連線。 您可以使用功能和資訊清單屬性,在受信任的封裝應用程式之間啟用回送連線。
- 參與回送連線的所有封裝應用程式,將必須在其套件資訊清單中宣告
privateNetworkClientServer
功能。 - 兩個封裝應用程式可以透過回送通訊,方法是在其套件資訊清單中宣告 LoopbackAccessRules。
- 每個應用程式都必須在其 LoopbackAccessRules 中列出另一個應用程式。 用戶端會宣告伺服器的 "out" 規則,而伺服器會為其支援的用戶端宣告 "in" 規則。
注意
要找到能在這些規則裡辨識出應用程式所需的套件系列名稱,在開發期間可透過 Visual Studio 中的套件資訊清單編輯器找到,對於透過 Microsoft Store 發佈的應用程式可透過合作夥伴中心找到,對於已安裝的應用程式可透過 Get-AppxPackage PowerShell 命令找到。
未封裝應用程式和服務沒有套件身分識別,因此無法在 LoopbackAccessRules 中宣告它們。 您可以透過 CheckNetIsolation.exe,將封裝應用程式設定為透過回送與未封裝應用程式和服務進行連線,不過,只有你具有電腦的本機存取權,也具有系統管理員權限時,才能在側載或偵錯案例的情況下做到。
- 參與回送連線的所有封裝應用程式,都必須在其套件資訊清單中宣告
privateNetworkClientServer
功能。 - 如果封裝應用程式連線到未封裝應用程式或服務,請執行
CheckNetIsolation.exe LoopbackExempt -a -n=<PACKAGEFAMILYNAME>
以新增封裝應用程式的回送豁免。 - 如果未封裝應用程式或服務連線到已封裝應用程式,請執行
CheckNetIsolation.exe LoopbackExempt -is -n=<PACKAGEFAMILYNAME>
以讓封裝應用程式接收輸入回送連線。- 當封裝應用程式正在接聽連線時,CheckNetIsolation.exe 必須持續執行。
- 旗標
-is
是在 Windows 10 版本 1607 中引進 (10.0;組建 14393)。
注意
要找到 CheckNetIsolation.exe 的旗標 -n
所需的套件系列名稱,在開發期間可透過 Visual Studio 中的套件資訊清單編輯器找到,對於透過 Microsoft Store 發佈的應用程式可透過合作夥伴中心找到,對於已安裝的應用程式可透過 Get-AppxPackage PowerShell 命令找到。
CheckNetIsolation.exe 對於偵錯網路隔離問題也相當實用。
管道
管道支援管道伺服器與一個或多個管道用戶端之間的簡單通訊。
- 根據預設,除非處理序是完全信任處理序,否則只有在相同封裝內的處理序之間,才會支援封裝應用程式中的具名管道。
- 您可以遵循共用具名物件的指導方針,在套件之間共用具名管道。
- 具名管道 (在封裝以及未封裝應用程式中) 必須使用語法
\\.\pipe\LOCAL\
取得管道名稱。
登錄
通常不建議使用登錄來進行 IPC,但現有的程式碼仍支援使用登錄。 封裝應用程式只能存取他們有權存取的登錄機碼。
通常,封裝的桌面應用程式 (請參閱從您的程式碼建置 MSIX 套件) 會利用登錄模擬,讓全域登錄寫入包含在 MSIX 套件的私人 hive 中。 這使原始程式碼相容性得以實現,同時將全域登錄影響降到最低,而且可用於相同套件中處理序之間的 IPC。 如果您必須使用登錄,那麼相較於操作全域登錄,此模型是較好的選擇。
RPC
RPC 可用來將封裝應用程式連線到 Win32 RPC 端點,前提是封裝應用程式具有正確的功能,可符合 RPC 端點上的 ACL。
自訂功能可讓 OEM 和 IHV 定義任意功能、使用 ACL 將他們的 RPC 與這些功能相關聯,然後將這些功能授權給用戶端應用程式。 如需完整的範例應用程式,請參閱 CustomCapability 範例。
RPC 端點也可以使用 ACL 關聯到特定的封裝應用程式,以將端點的存取限制為只有那些應用程式,而不需要額外管理自訂功能。 您可以使用 DeriveAppContainerSidFromAppContainerName API,從套件系列名稱衍生 SID,然後使用 SID 對 RPC 端點進行 ACL 設定,如 CustomCapability 範例所示。
共用記憶體
檔案對應可用來在兩個或多個處理序之間共用檔案或記憶體,但有以下限制:
- 根據預設,除非處理序是完全信任處理序,否則只有在相同封裝內的處理序之間,才會支援封裝應用程式中的檔案對應。
- 您可以遵循共用具名物件的指導方針,在套件之間共用檔案對應。
建議使用共用記憶體,以便有效率地共用和操作大量資料。