本主題說明在通用 Windows 平臺 (UWP) 應用程式和 Win32 應用程式之間執行進程間通訊 (IPC) 的各種方式。
應用程式服務
應用程式服務使應用程式能夠在背景中公開能夠接受和傳回基元類型屬性包的服務(ValueSet)。 如果 串行化,則可以傳遞豐富的物件。
應用程式服務可以執行
應用程式服務最適合用來共用少量的數據,而不需要近乎即時的延遲。
COM
COM 是分散式面向物件系統,可用來建立可互動和通訊的二進位軟體元件。 身為開發人員,您可以使用 COM 為應用程式建立可重複使用的軟體元件和自動化層。 COM 元件可以是進程內或進程外,而且可以透過 客戶端和伺服器 模型進行通訊。 進程外 COM 伺服器一直以來被用作 物件間通訊的方法。
具有 runFullTrust 功能的封裝應用程式可以透過 套件指令清單註冊 IPC 的跨進程 COM 伺服器。 這稱為 Packaged COM。
檔案系統
廣泛檔案系統存取權限 (BroadFileSystemAccess)
封裝的應用程式可以使用廣泛的檔案系統來執行 IPC,方法是宣告 broadFileSystemAccess 受限制的功能。 這項功能會授與 Windows.Storage API 和 xxxFromApp Win32 API 存取廣泛的文件系統。
根據預設,針對封裝應用程式,透過檔案系統的 IPC 限制為本節所述的其他機制。
發布者快取資料夾
PublisherCacheFolder 可讓封裝的應用程式在其指令清單中宣告資料夾,這些資料夾可由同一個發行者與其他套件共用。
共用記憶體資料夾具有下列需求和限制:
- 共用記憶體資料夾中的數據不會備份或漫遊。
- 用戶可以清除共用儲存資料夾的內容。
- 您無法使用共用儲存資料夾在不同發行者的應用程式之間共享資料。
- 您無法使用共用儲存資料夾在不同使用者之間共享資料。
- 共用記憶體資料夾沒有版本管理。
如果您發佈多個應用程式,而且正在尋找在它們之間共用數據的簡單機制,則 PublisherCacheFolder 是簡單的檔案系統型選項。
共用存取記憶體
SharedAccessStorageManager 會與應用程式服務、協議啟動(例如 LaunchUriForResultsAsync)等一同使用,以透過令牌來共用 StorageFiles。
FullTrustProcess啟動器
透過 runFullTrust 功能
對於套件限制成為負擔或 IPC 選項不足的情況,應用程式可以使用完全信任的程式作為代理,與系統介面連接,然後通過應用程式服務或其他支援良好的 IPC 機制來與完全信任程式本身進行 IPC。
LaunchUriForResultsAsync
LaunchUriForResultsAsync 用於與其他實作 ProtocolForResults 啟用合約的封裝應用程式,進行簡單(ValueSet)數據交換。 與通常在背景執行的應用程式服務不同,目標應用程式會在前景啟動。
透過 ValueSet 將 sharedStorageAccessManager 令牌傳遞至應用程式,即可共用檔案。
回送
回送是與在迴圈回送位址(localhost)上接收的網路伺服器進行通訊的過程。
為了維護安全性和網路隔離,預設會針對封裝的應用程式封鎖IPC的回送連線。 您可以使用 能力和 與 指令清單屬性,來啟用受信任封裝應用程式之間的回送連線。
- 所有參與回送連線的封裝應用程式都必須在其 套件指令清單中宣告
privateNetworkClientServer功能,。 - 兩個封裝的應用程式可以透過回送通訊,方法是在其套件指令清單中宣告 LoopbackAccessRules。
- 每個應用程式都必須在其 LoopbackAccessRules中列出另一個應用程式。 用戶端會宣告伺服器的「out」規則,而伺服器會為其支援的用戶端宣告「in」規則。
備註
這些規則中識別應用程式所需的套件系列名稱,可以在開發期間透過 Visual Studio 中的套件清單編輯器找到;如果應用程式是透過 Microsoft 市集發行的,則可以透過 合作夥伴中心 找到;若已安裝應用程式,則可以使用 Get-AppxPackage PowerShell 命令找到。
未封裝的應用程式和服務沒有套件身分識別,因此無法在 LoopbackAccessRules中宣告它們。 您可以透過 CheckNetIsolation.exe,將封裝的應用程式設定為透過未封裝的應用程式與服務回送連線。然而,這僅適用於您擁有本機存取權限和系統管理員權限的側載或偵錯情境。
- 所有參與回送連線的封裝應用程式都必須在其 套件指令清單中宣告
privateNetworkClientServer功能,。 - 如果封裝的應用程式連線到未封裝的應用程式或服務,請執行
CheckNetIsolation.exe LoopbackExempt -a -n=<PACKAGEFAMILYNAME>以新增已封裝應用程式的回送豁免。 - 如果未封裝的應用程式或服務連線到已封裝的應用程式,請執行
CheckNetIsolation.exe LoopbackExempt -is -n=<PACKAGEFAMILYNAME>,讓封裝的應用程式接收輸入回送連線。- 當封裝的應用程式正在接聽連線時,CheckNetIsolation.exe 必須持續執行。
- Windows 10 版本 1607(10.0;組建 14393)中引進了
-is旗標。
備註
-n
旗標所需的套件系列名稱,可以在開發過程中使用 Visual Studio 的套件配置檔編輯器找到,或者透過 合作夥伴中心 尋找那些透過 Microsoft 市集發行的應用程式,亦或者使用已安裝應用程式的 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 範例所示。
共用記憶體
檔案對應 可用來在兩個或多個程序之間共享檔案或記憶體,並具有以下限制條件:
- 根據預設,封裝應用程式中的檔案映射只有在相同封裝內的進程之間才支援,除非進程為完全受信賴。
- 您可以遵循 共用具名物件的指導方針,跨套件共用檔案對應。
建議使用共用記憶體來有效率地分享和處理大量資料。