UWP 程序可以載入插件嗎?
包括但不限於以下兩種形式:
- DLL 形式的插件
- 腳本形式的插件,如:Lua、Python、JS
可以,分兩種情況:1. 需要執行本地代碼。2. 只提供數據文件(腳本,mod等)。
前者需要通過App Service + App Extension實現,後者只要用App Extension就可以。
具體比較複雜,先解釋一下UWP應用模型中應用間通信的三種模型。
1. App Handover
需要第三方功能的app可以通過handover把一個任務交給另一個app執行,並在完成後取得結果。比如把支付app調出來付款,然後返回。特點是提供的功能由第三方決定且第三方app會到前台執行。
2. App Service
service提供方app在Package中定義一個service,其他App可以和這個service建立一個連接,用法類似普通的web service。這個service是作為後台任務託管在一個後台進程里執行的,並且可以同時和多個consumer app建立連接。好像也可以遠程調用,比如從電腦調用手機上的某個服務,參考 https://msdn.microsoft.com/en-us/windows/uwp/launch-resume/communicate-with-a-remote-app-service
這種模型的特點是交互不會離開主app,同時app service後台執行,不容易把自己的進程掛掉。
3. App Extension
這種是主app定義一個擴展協議,其他的app可以選擇提供這個擴展,屬於雙向選擇。用的時候首先AppExtensionCatalog會提供發現和枚舉擴展app的服務,比如你從商店裝一個edge插件後edge可以實時接到通知並載入這個擴展。然後主app可以通過AppExtension從擴展app里拿到一個只讀的公開目錄,實現從擴展讀取數據。當然是不能執行代碼的,不過類似遊戲mod這種基於文件的擴展還是可以實現的,讀個腳本也是可以的。
如果需要執行native代碼,可以選擇和app service配合使用。主app通過AppExtensionCatalog發現和載入擴展程序,然後用事先說好的App Service調用擴展程序的功能。
這種模型相當於主app提供了一個開發平台,而其他app需要主動支持才行,和傳統插件模式最類似。半年前研究過一些這方面的問題,恰好覆蓋了樓主提問的兩方面。
Native code (DLL) 需要一些小技巧,參考: 三種方式輕鬆繞過Windows App Certification Kit (WACK)的API檢測(UWP, C++)
腳本方面,可以用JavaScript做插件,調用Chakra API,也可以自己編譯python等環境。另外UWP允許JIT了,所以V8之類的也是可以移植的。參考:Chakra實戰:UWP與js交互(C#)
另外UWP的app extension目前(14393版本)仍然毫無誠意,看上去是專門為了Edge的瀏覽器插件定製的,如果想要拿來做native code還是得自己動手,今後具體能怎樣只能看後續API發展了。
app service本質是RPC,像視頻播放器解碼插件之類的,這種性能要求較極端的需求顯然是沒法滿足的。都在一個appx包里的話,你隨便load dll。
查了一下,得到的情報是這樣:
1、UWP程序無法從appx包以外的地方載入dll
2、UWP無法使用System.Reflection.Emit.*Builder因此dll和JIT腳本將無法載入,不過做腳本解釋器應該還是可以做到的PS:然而正則表達式的Compiled選項仍然可用,誰能告訴我怎麼實現的當我還在開發wp8的時候,曾經繞過商店檢測調用了LoadLibrary方法,思路是這樣的:
通過NtCurrentTeb獲取peb,再通過peb遍歷已載入的dll鏈找到kernelbase.dll(win10的話應該是kernel32.dll吧)的基址(也就是module的句柄),再通過GetProcAddress來獲取LoadLibrary的地址。p.s. 另外一個思路是通過RtlLookupFunctionEntey獲取kernel模塊的句柄。
沒記錯的話,wp8下LoadLibrary用起來和win32下的行為一致,也就是你可以載入任何位置的dll。也已經可以繞過商店檢測調用各種不允許的api(當年那些一鍵鎖屏都是這麼上去的)
僅限於技術討論,提供個思路,後果自負Edge瀏覽器不就可以
推薦閱讀:
※請問c# 做wpf程序是如何將圖片嵌入到exe程序裡面的?
※MFC 作為 Windows 原生的 GUI 庫還可以在項目中用嗎?
※程序員如何挽救日漸失控的項目?
※如何評價王垠的 《討厭的 C# IDisposable 介面》?
※如今 Windows 軟體開發究竟該用什麼庫,C#、Qt,還是其他?