关于UWP的历史,其起源是Microsoft在Windows 8中引入的Metro apps。(后来又被称作Modern apps, Windows apps, Universal Windows Apps等)无论是从目的还是从效果上看,这一类应用模型都与iOS/Android比较相似,是为了更有利于移动平台生态的发展设计的。
然而UWP目前面向的最大的用户群体是Windows桌面用户,只用UWP实现一个程序就会出现很多feature无法实现的问题,因此这种情况下,让用户安装并运行一个普通权限的后台进程,使用UWP做UI与之通信就成为了一种选择,毕竟UWP的C#/XAML性能比WPF好得多,分发/支付上也比桌面程序方便不少,虽说原则上微软并不允许商店应用与桌面应用互相通信。

除了命名管道(named pipe),进程间通信的方式还有很多,比如Socket,还有微软给Runtime Broker用的COM RPC(rpcrt4)等。对于前者,如果是AppContainer默认的防火墙配置,与本机其它程序不允许通过127.0.0.1通信,而调节这个防火墙配置需要管理员权限。而对于COM RPC,由于其API比较复杂,并且rpc.h里大部分的API是desktop only,因此调用起来也不方便。(在Store apps里有办法使用desktop only API,但是如果数目多了会比较麻烦)

相比之下,命名管道只需要在app中获取一个desktop only的API(即CreateFile)就能使用了,并且用户运行桌面程序时不需要管理员权限,大概是最简单的方式。

在AppContainer中不能创建命名管道,只能连接到有权限访问的命名管道。因此我们使用桌面程序创建。

桌面程序:

using (var pipe = new NamedPipeServerStream("mypipe", PipeDirection.InOut, -1, PipeTransmissionMode.Byte, PipeOptions.None, 0, 0, null, HandleInheritability.None, PipeAccessRights.ChangePermissions))
{
PipeSecurity ps = pipe.GetAccessControl();
PipeAccessRule clientRule = new PipeAccessRule(
new SecurityIdentifier("S-1-15-2-1"), // All application packages
PipeAccessRights.ReadWrite,
AccessControlType.Allow);
PipeAccessRule ownerRule = new PipeAccessRule(
WindowsIdentity.GetCurrent().Owner,
PipeAccessRights.FullControl,
AccessControlType.Allow);
ps.AddAccessRule(clientRule);
ps.AddAccessRule(ownerRule);
pipe.SetAccessControl(ps);
pipe.WaitForConnection();
using (var sr = new StreamReader(pipe, Encoding.UTF8))
{
while (true)
{
string message = sr.ReadLine();
//在此处处理App写入命名管道的内容
pipe.WaitForPipeDrain();
}
}
}

其中”mypipe”是命名管道的名称,SID S-1-15-2-1 是All application packages的SID,如果只想让一个AppContainer访问,可以通过获取进程信息来获取它的SID。

App程序:

var handle = CreateFileW(@"\\.\pipe\mypipe", FileAccess.ReadWrite, FileShare.None, IntPtr.Zero, FileMode.Open, 0, IntPtr.Zero);
if (handle.IsInvalid)
{
var err = Marshal.GetLastWin32Error();
//handle error
}
sw = new StreamWriter(new FileStream(handle, FileAccess.Write), Encoding.UTF8);
sw.WriteLine("Hello from AppContainer");
sw.Flush();

其中”mypipe”是命名管道的名称。
由于UWP的.NET标准库并没有System.IO.Pipes,必须手动调用CreateFile。UWP允许使用的CreateFile2是不能打开命名管道的,即使有权限也会返回ERROR_NOT_SUPPORTED_IN_APPCONTAINERCreateFileW并不能直接使用DllImport("kernel32"),否则无法通过WACK。

最新文章

  1. MapReduce剖析笔记之七:Child子进程处理Map和Reduce任务的主要流程
  2. Windows Store App 全球化:应用中设置语言选项
  3. android ndk编译x264开源(用于android的ffmpeg中进行软编码)
  4. strerror
  5. 理解OAuth 2.0[摘]
  6. mysql笔记02 创建高性能的索引
  7. [Papers]MHD, $\p_3\pi$, Lebesgue space [Zhang-Li-Yu, JMAA, 2013]
  8. POJ3087Shuffle'm Up(map)
  9. wpa_supplicant使用笔记
  10. 在HTML页面布局中,position的值有几种,默然的值是什么
  11. Android 启动APP黑屏解决方案
  12. JavaSE复习日记 : 实例化对象/构造方法和this关键字
  13. 利用WebBrowser彻底解决Web打印问题
  14. 如何成为出色的IT项目经理:成功的五个关键因素
  15. mysql 数据库优化要点
  16. Java技术学习之影响MySQL性能的配置参数
  17. electron培训 ppt
  18. java.lang.IllegalStateException: Cannot forward after response has been committed的一个情况解决方法
  19. EOS智能合约授权限制和数据存储
  20. Eclipes导入工程

热门文章

  1. OSPF的基本工作原理
  2. 微信小程序云开发-云存储-带图片的商品列表携带id跳转至商品详情
  3. PAT甲级:1064 Complete Binary Search Tree (30分)
  4. SQlL 中 where 1=1
  5. 自建简易FaaS平台
  6. 「Leetcode-算法_Easy461」通过「简单」题目学习位运算
  7. centos linux下配置固定ip,方便xshell连接
  8. 攻防世界逆向——game
  9. Windows影子用户创建与3389连接
  10. Java知识复习回顾