关于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。

UWP使用命名管道与桌面程序通信 (C#)的更多相关文章

  1. 【linux】mkfifo 命令创建命名管道实现进程之间通信

    mkfifo 命令 mkfifo命令创建一个FIFO特殊文件,是一个命名管道(可以用来做进程之间通信的桥梁) 管道也是一种文件,一般是linux中的一个页大小,4k,管道数据一旦被读取就没了.(管道大 ...

  2. C#/.NET基于Topshelf创建Windows服务的守护程序作为服务启动的客户端桌面程序不显示UI界面的问题分析和解决方案

    本文首发于:码友网--一个专注.NET/.NET Core开发的编程爱好者社区. 文章目录 C#/.NET基于Topshelf创建Windows服务的系列文章目录: C#/.NET基于Topshelf ...

  3. 【LINUX/UNIX网络编程】之使用消息队列,信号量和命名管道实现的多进程服务器(多人群聊系统)

    RT,使用消息队列,信号量和命名管道实现的多人群聊系统. 本学期Linux.unix网络编程的第三个作业. 先上实验要求: 实验三  多进程服务器 [实验目的] 1.熟练掌握进程的创建与终止方法: 2 ...

  4. 采用虚拟命名管道的字符设备和阻塞型I/O实现进程间的通信实现KWIC程序

    采用虚拟命名管道的字符设备和阻塞型I/O实现进程间的通信实现KWIC程序专业程序代写c++程序代写

  5. Linux学习笔记(13)-进程通信|命名管道

    匿名管道只能在具有亲属关系的进程间通信,那么如果想要在不具有亲戚关系,想在陌生人之间通信,那又该怎么办呢? 别慌,Linux身为世界上*强大的操作系统,当然提供了这种机制,那便是命名管道-- 所谓命名 ...

  6. C#命名管道通信

    C#命名管道通信 最近项目中要用c#进程间通信,以前常见的方法包括RMI.发消息等.但在Windows下面发消息需要有窗口,我们的程序是一个后台运行程序,发消息不试用.RMI又用的太多了,准备用管道通 ...

  7. C#中使用命名管道进行进程通信的实例

    原文:C#中使用命名管道进行进程通信的实例 1 新建解决方案NamedPipeExample 在解决方案下面新建两个项目:Client和Server,两者的输出类型均为"Windows 应用 ...

  8. Linux学习记录--命名管道通信

    命名管道通信 什么是命名管道 一个主要的限制是,它是匿名管道的应用还没有名字,因此,只有它可以用于进程间通信的方式与亲缘关系.在命名管道(named pipe或FIFO)提出后,该限制得到了克服.FI ...

  9. C++ 命名管道 与Winform跨进程通信

    以下是.NET命名管道解决方案中几个主要的类. NamedPipeNative:这个类和kernal32.dll联系实现命名管道的通信,其中包含一些常用方法和常量. NamedPipeWrapper ...

随机推荐

  1. WIN10技巧

    1.快速打开"开始---自动启动"文件夹:开始--支行--shell:startup 2

  2. Grafana、Prometheus-监控平台

    一:Grafana 简介与部署 安利一个生产环境正在使用的监控和告警平台:grafana,它是一个开源的可对指标和日志进行查询.可视化和告警的平台. docker 安装官方文档:https://gra ...

  3. java02实验:方法

    一:素数输出 1.实验要求: (1)编写判断该数是否为素数的方法,并在主方法中对其进行调用. (2)注意编程规范:程序开头部分的目的,作者以及日期:必要的空格与缩进,适当的注释等: (3)实验报告中要 ...

  4. 从新建文件夹开始构建ShadowPlay Engine游戏引擎(4)

    本篇序言 这次博客更新距离上次的时间间隔变短了好多,因为最近硬是抽出了一大部分时间来进行引擎的开发.而且运气很好的是在写链表这种很"敏感"的的数据结构的时候并没有出现那种灾难性的后 ...

  5. deepin解压乱码

    使用unzip命令解压:unzip -O GBK xxxx.zip -d xxx

  6. Python+Requests+Re(正则)爬取某糗事百科图片(数据分析一)

    1.博客目前在学习爬虫课程,使用正则表达式来爬取网页的图片信息 2.下面我们一起来回归下Python中的正则使用方式/方法 3.糗事百科图片爬取源码如下: import requestsimport ...

  7. 如何用css画一个彩虹---v客学院技术分享

    无意间看到了CSS radial-gradient() 函数实现了如下图的样式 仔细一看还真有点像灯光下的鸡蛋,O(∩_∩)O哈哈~ 今天我就来用radial-gradient()函数教大家画一个简单 ...

  8. python + csv 操作(读写)

    import csv"""与excel文件不同,csv文件中:1.数据都没有数据类型,值都是'字符串'2.没有颜色和样式,不能指定单元格测的宽高,不能合并单元格3.没有对 ...

  9. 微信小程序云开发-云存储-下载并打开文件文件(word/excel/ppt/pdf)

    一.wxml文件 1.写文本框,用来获取文件链接. 2.按钮,点击下载文件 <!-- 下载文件(word/excel/ppt/pdf等) --> <view class=" ...

  10. Tomcat修改最大连接数及查看最大连接数

    一.背景 公司进行安全整改, 技术要求:会话限制:应能够对应用系统的最大并发会话连接数进行限制: 提供凭证:提供对系统最大并发会话连接数进行限制的截图,需要将所有被检查系统中间件配置截图,如果不限制最 ...