我有一个UWP应用程序,该应用程序包含2个主要部分,一个具有UI的UWP项目和一个用于提供系统任务栏功能的WinForms项目。我正在使用Windows应用程序打包项目将它们结合在一起,例如本示例:https://docs.microsoft.com/en-us/windows/uwp/porting/desktop-to-uwp-extend#show-a-modern-xaml-ui。
启动应用程序时,WinForm应用程序将首先启动并驻留在系统托盘中。选择菜单选项之一后,UWP应用程序将启动,并使用示例中的协议方法(即Windows.System.Launcher.LaunchUriAsync("myapp://action?key=value");
导航到相应的页面。一切正常。
我遇到的问题是我希望能够从UWP应用程序与WinForms应用程序进行通信(在某些情况下也可能是另一种方式)。我正在尝试使用App Service扩展来实现这一目标。我一直在关注以下示例:https://stefanwick.com/2017/06/24/uwp-app-with-systray-extension/。但是我无法使它正常工作。我不太确定fulltrust和应用程序服务声明应该在哪个项目中。
如果像示例中那样将它们放在UWP项目中,则始终会出现AppServiceUnavailable错误(名称绝对正确-我不知道此状态的文档指的是什么版本,但我看不到如何这可能是不正确的)。无论UWP应用程序当时是否打开,都会发生这种情况。以前,我已经使用过这种方法,但是只有在不涉及Windows应用程序打包项目并且UWP应用程序首先启动且我不想要的情况下才可以使用。
如果将声明放在Windows应用程序打包项目中(将应用程序服务可执行文件和入口点设置为UWP项目App类),则会收到一个AppUnavailable错误,我猜这意味着它在更早的时候失败了。
有人知道我如何使它工作吗?如果由于某种原因无法实现,那么任何人都可以向我指出实现此想法的正确方向(一个UWP应用,该应用在启动时不会启动任何窗口,并且位于系统托盘中,并且在所需的任何组件之间都具有双向消息传递功能。)>
编辑:目标版本:17763,最低版本:16299,Windows版本:17763
EDIT2:我创建了一个小型测试解决方案,希望可以显示我正在尝试做的更好的事情:https://github.com/csuzw/AppServiceTest。
答案 0 :(得分:1)
好的。我检查了您的演示。与Stefan Wick协商后,这个问题就可以解决了。
您需要对WAP项目的Package.appxmanifest文件进行以下更改。否则,VS将在Winforms应用程序上声明AppService,这将无法正常工作。
<Application Id="App" Executable="$targetnametoken$.exe" EntryPoint="$targetentrypoint$">
<uap:VisualElements DisplayName="AppServiceTest" Description="AppServiceTest" BackgroundColor="transparent" Square150x150Logo="Images\Square150x150Logo.png" Square44x44Logo="Images\Square44x44Logo.png">
<uap:DefaultTile Wide310x150Logo="Images\Wide310x150Logo.png">
</uap:DefaultTile>
</uap:VisualElements>
</Application>
<Application Id="App2" Executable="AppServiceTest.UI.exe" EntryPoint="AppServiceTest.UI.App">
<uap:VisualElements AppListEntry="none" DisplayName="WapProjTemplate1" Description="WapProjTemplate1" BackgroundColor="transparent" Square150x150Logo="Images\Square150x150Logo.png" Square44x44Logo="Images\Square44x44Logo.png">
<uap:DefaultTile Wide310x150Logo="Images\Wide310x150Logo.png" />
</uap:VisualElements>
<Extensions>
<uap:Extension Category="windows.appService">
<uap:AppService Name="MyAppServiceName" />
</uap:Extension>
<desktop:Extension Category="windows.fullTrustProcess" Executable="AppServiceTest.Systray\AppServiceTest.Systray.exe"/>
</Extensions>
</Application>