【UWP】让 UWP 自己和自己通信
众所周知,UWP 一般是运行在沙盒里面的,当我们需要访问沙盒外资源的时候,就需要通过沙盒外的代理服务器来获取。一般情况下我们都是利用 WinRT API 通过 Runtime Broker 来和沙盒外互通,遇到要自定义的情况则是手动开一个 Win32 服务器来互通,但是有没有可能我们可以直接拿 UWP 本体当服务器呢? UWP 本体实际上就是一个普通的 Win32 EXE 程序,只是想要以 UWP 状态运行只能通过系统托管,但是如果我们不需要它以 UWP 状态执行的时候完全可以直接双击打开它,这时候它就是一个很普通的散装 Win32 程序了。 利用这个特性,我们可以制作一种假装双击打开的方法,只需要在发现是 Win32 状态下启动就去用 API 唤起 UWP 形态的自己就行了 private static unsafe bool IsPackagedApp { get { uint length = 0 ; PWSTR str = new (); _ = PInvoke.GetCurrentPackageFullName( ref length, str); char * ptr = stackalloc char [( int )length]; str = new (ptr); WIN32_ERROR result = PInvoke.GetCurrentPackageFullName( ref length, str); return result != WIN32_ERROR.APPMODEL_ERROR_NO_PACKAGE; } } private static void Main () { if (IsPackagedApp) { Application.Start( static p => { DispatcherQueueSynchronizationContext context = new (DispatcherQueue.GetForCurrentThread()); ...