C#中使用命名管道通信失败
来源:互联网 发布:oracle 清除表数据 编辑:程序博客网 时间:2024/05/22 14:26
问题描述
单位上部署的程序,是本人和同事一起开发的。一个C#写的应用层托盘程序,另一个是虚拟打印机程序,两个程序之间用命名管道进行通信。平时用户使用正常,某次同事在本机上测试新开发的模块时,却发现有时候托盘程序和虚拟打印机之间无法通信。具体现象是如果用VS启动托盘程序,则托盘程序和虚拟打印机无法通信。如果是直接启动Debug文件夹中的exe程序,则两者之间通信正常。
问题定位
通过不断的调试、启动,发现VS启动托盘程序时是以管理员方式启动的(同事电脑操作系统为Win7),这时托盘程序和虚拟打印机之间无法通信,而直接启动Debug文件夹中的exe程序时是采用的当前用户的默认权限运行,这时通信正常。再进一步测试发现,如果要触发该类问题,需要同时满足三个条件:
1)用户账号具有管理员权限
2)用户操作系统中的用户账户控制设置为第三档或者更高(UAC)
3)托盘程序以管理员方式运行
仅当同时满足这三个条件时才会触发该问题。通过查阅托盘程序代码,发现是创建命名管道服务时的问题。
问题解决方案
C#中的NamedPipeServerStream类有多个构造函数,如下图所示,具体的介绍可以参考文献1.这些函数中有些函数的参数时可以指定权限的。但是我在程序中使用的是最简单的构造函数,参数只有三个,管道名称、管道方向和管道实例数量,其它的都采用的该类的默认值。应该就是这个问题。不过后面我犯懒了,没有去写函数验证(因为在我们单位上满足该问题的三个条件不可能同时出现)。有兴趣的朋友可以写程序验证一下。参考文献;
[1]https://msdn.microsoft.com/en-us/library/system.io.pipes.namedpipeserverstream(v=vs.110).aspx
[2]https://msdn.microsoft.com/zh-cn/library/bb546085(v=vs.110).aspx
阅读全文
0 0
- C#中使用命名管道通信失败
- C#中使用命名管道进行进程通信的实例
- C# 命名管道通信
- C# NamedPipe 命名管道通信
- C# 管道通信-命名管道(一)
- c# 管道通信-命名管道(二)
- 使用命名管道实现进程间通信
- 使用命名管道实现进程间通信
- 使用命名管道实现进程间通信
- 使用命名管道实现进程间通信
- Linux进程间通信--使用命名管道
- C#使用命名管道通过网络在进程之间进行通信
- 命名管道进程通信
- (转)在.NET中使用命名管道完成进程间通信
- 在.NET中使用命名管道完成进程间通信[转]
- 【转】linux中使用命名管道实现客户端/服务器模型的进程间通信
- C++和C#进程之间通过命名管道通信
- C#命名管道进程通信(一单向)
- 线性回归
- Arduino使用土壤湿度传感器
- Arduino使用TM1637四位数码管显示模块
- Add bricks in the wall UVA
- Arduino制作万智牌生命计数器
- C#中使用命名管道通信失败
- (翻译)如何避免对用户体验设计过程产生倦怠(How to Avoid UX Burnout)
- C#使用GDI+绘制直角坐标系
- 网络编程——TCP(1)
- 电脑磁盘逻辑分区不见了
- DrawTools绘图程序代码分析
- SqlServer数据库恢复出错
- Android中的多种对话框样式详解
- “已禁用分布式事务管理器的网络访问”的解决方法