U盘PE| w764位旗舰版下载 | U盘装win7系统 | U盘启动 |win7pe | win10下载 |加入收藏土豆PE官网U盘PE,U盘装win7系统,win7pe,U盘启动,U盘装系统,w764位旗舰版下载站!
当前位置:主页 > 新闻资讯 >

微软是如何解决 PC 端程序多开问题的

来源:http://www.tudoupe.com时间:2022-05-23

点击上方蓝字

关注我们

(本文阅读时间:4 分钟)

最近发现VB试图使用 C# 来解决个人电脑终端软件的一些问题。 NET的 WinForm 程序提供了非常简单的方法来完成:

没有代码,只有勾。

今天,我们将向大家展示微软如何处理多种个人电脑终端应用程序, 以及如何在C#中履行同样的功能。

微软MVP实验室调查员

张海

微软最有价值的专家,主要专注于.NET相关技术和解决方案,致力于将个人投入转换成一个输出,即公共电话号码:我的IO。

原理1

应用程序库窗口格式

汇编 VB.NET WinForm 程序, 反向汇编源代码和定位接入点 Main 方法:

MyApplication 是 Windows Forms Application Base 的子孙。 MyApplication 是 Windows Forms Application Base 的子孙 。基本类别的运作职能已经落实。内部运行方法使用是单声调来确定是否要启动 用单个实例应用程序

IsSingleInstance 以下属性是条目类构造函数中的指定值 :

实现1

通过引用 NuGet 软件包 微软。 视觉Bacic 与C##,我们也可以继承。WindowsFormsApplicationBase基类,为IsSingleInstance要完成单个实例应用程序, 请使用属性属性属性值 :

protected override void OnCreateMainForm() { MainForm =newForm1; }

[STAThread] static void Main(string[] args) { newProgram.Run(args); } }

虽然上述认识是直截了当的,但仅适用于WinForm应用程序,必须称为微软.VisualBacic图书馆。

因此,我们决定深入探索如何实现这一点。

原理2-命名管道

通过查看WindowsFormsApplicationBaseRun完成的方法( 代码已删除) :

可以推断,微软方案对大量个人计算机终端应用的微软解决方案的内部实现原则如下:

如果创建成功,则用WaitForClientConnectionsAsync正在等待第二号应用程序连接

如果创建失败,则用SendSecondInstanceArgsAsync向第一次申请提供资料。

名称管道提供管道服务器与一个或多个管道客户端之间的进程间通信。 它们提供基于信息的互动, 并允许多个客户端同时使用相同的管道名称连接到服务器进程 。

关于如何使用指示的进一步信息,请见官方出版物《使用命名管道的网络处理之间的通信》[1]。

实现2

以下是如何使用控制台程序创建具体案例应用的一个例子:

static asyncTaskMain(string[] args) { try { using(varpipeServer =newNamedPipeServerStream( pipeName: pipeName, direction: PipeDirection.In, maxNumberOfServerInstances:1, transmissionMode: PipeTransmissionMode.Byte, options: NamedPipeOptions)) { WaitForClientConnectionsAsync(pipeServer,str => Console.WriteLine(str));

Console.WriteLine($"start server{args[0]}"); Console.ReadKey; } } catch { awaitSendSecondInstanceArgsAsync(=>$"call from{args[0]}").ConfigureAwait(false); } }

需要注意的是 WaitForClientConnectionsAsync不能加await 否则,随后的守则将无法执行。

Async Wait for Client 连接器

实现代码如下

try { const int bufferLength = 1024; var buffer = new byte[bufferLength]; using (var stream = new MemoryStream) { while (true) { var bytesRead = await pipeServer.ReadAsync(buffer.AsMemory(0, bufferLength), cancellationTokenSource.Token).ConfigureAwait(false); if (bytesRead == 0) { break; } stream.Write(buffer, 0, bytesRead); }

stream.Seek(0, SeekOrigin.Begin);

callback(Encoding.UTF8.GetString(stream.ToArray)); } } finally { pipeServer.Disconnect; } } }

  • 循环等待客户端连接

  • 接收客户端提供的数据并将其转换为字符串 。

  • 调用callback处理字符串,这里是str => Console.WriteLine(str)

  • 断开客户端连接

循环等待客户端连接

接收客户端提供的数据并将其转换为字符串 。

调用callback处理字符串,这里是str => Console.WriteLine(str)

断开客户端连接

AssyncSend Send SextInstance 配置器

实现代码如下:

await pipeClient.ConnectAsync(cancellationTokenSource2.Token).ConfigureAwait(false);

await pipeClient.WriteAsync(Encoding.UTF8.GetBytes(func), cancellationTokenSource2.Token).ConfigureAwait(false); } }

  • 建立客户与当地管道服务处的连接。

  • 向服务端发送 func 产生的数据,这里是 => $"call from {args[0]}"

建立客户与当地管道服务处的连接。

Demo

创建多开脚本:

start " " "ConsoleApp1.exe" secondInstance

start " " "ConsoleApp1.exe" thirdInstance

安装后,我们发现软件只能打开一次。 他们还从其他各种应用中获得了数据:

参考资料

  • [1] 使用命名的网络-处理通信管道:

    https://docs.microsoft.com/zh-cn/dotnet/standard/io/how-to-use-named-pipes-for-network-interprocess-communication?WT.mc_id=DT-MVP-38491

[1] 使用命名的网络-处理通信管道:

https://docs.microsoft.com/zh-cn/dotnet/standard/io/how-to-use-named-pipes-for-network-interprocess-communication?WT.mc_id=DT-MVP-38491

微软公司最宝贵的专业(MVP)

微软公司最有用的专家是微软公司向第三方技术专家颁发的全球奖项。 在过去29年中,世界各地的技术界领导人因分享在线和离线技能和经验而赢得了荣誉。

MVP是一个自选的专家小组。他们是最有才华和最聪明的人。他是一名专题专家,对社区既热情又有帮助。MVPs向其他人提供服务,包括演讲、回答论坛询问和答复、开发网站、博客、分享视频、开放源码项目、安排集会等等。此外,使微软技术界的成员最大限度地利用微软技术。

更多信息可在官方网站上查阅:

https://mvp.microsoft.com/zh-cn

使用命名的管道进行网络到处理通信

Copyright © 2012-2014 Www.tudoupe.Com. 土豆启动 版权所有 意见建议:tdsky@tudoupe.com

土豆系统,土豆PE,win7系统下载,win7 64位旗舰版下载,u盘启动,u盘装系统,win10下载,win10正式版下载,win10 RTM正式版下载,win8下载,电脑蓝屏,IE11修复,网络受限,4K对齐,双系统,隐藏分区,系统安装不了,U盘装系统,笔记本装系统,台式机装系统,diskgenius运用,GHSOT装系统,U盘修复,U盘技巧,U盘速度,U盘不能格式化,U盘复制发生错误,U盘加密,U盘选购,开机黑屏,蓝屏,进不了系统,上不了网,打不开程序,点击无反应,系统设置,PE个性化,PE添加网络,PE维护系统

点击这里给我发消息