【.NET进程通信】初探.NET中进程间通信的简单的实现

废话不多说,IPC就是进程间通信。

进程间通信可以采用的方法很多,比如创建端口后采用组播技术进行握手连接,这里要讲到的就是通过内存文件映射的方法实现。

先在项目中添加相关API函数:

        [DllImport("kernel32.dll", EntryPoint = "OpenFileMapping", SetLastError = true, CharSet = CharSet.Auto)]
        private static extern IntPtr OpenFileMapping(uint dwDesiredAccess, bool bInheritHandle, String lpName);
        [DllImport("Kernel32.dll")]
        private static extern IntPtr MapViewOfFile(IntPtr hFileMappingObject, uint dwDesiredAccess, uint dwFileOffsetHigh, uint dwFileOffsetLow, uint dwNumberOfBytesToMap);
        [DllImport("Kernel32.dll", EntryPoint = "UnmapViewOfFile", SetLastError = true, CharSet = CharSet.Auto)]
        private static extern bool UnmapViewOfFile(IntPtr lpBaseAddress);
        [DllImport("kernel32.dll", EntryPoint = "CloseHandle", SetLastError = true, CharSet = CharSet.Auto)]
        private static extern bool CloseHandle(IntPtr hHandle);
        [DllImport("Kernel32.dll", EntryPoint = "CreateFileMapping", SetLastError = true, CharSet = CharSet.Auto)]
        private static extern IntPtr CreateFileMapping(uint hFile, IntPtr lpAttributes, uint flProtect, uint dwMaximumSizeHigh, uint dwMaximumSizeLow, string lpName);
        

然后在共享端添加代码:

            string shareName = "XiaoY_H的内存共享";
            char[] myShrCntnt="共享内存密码Fuck985211".ToCharArray();
            IntPtr hMapFile = CreateFileMapping(INVALID_HANDLE_VALUE, IntPtr.Zero, PAGE_READWRITE, 0, 256, shareName);
            IntPtr pBuf = MapViewOfFile(hMapFile, FILE_MAP_ALL_ACCESS, 0, 0, 256);
            Marshal.Copy(myShrCntnt, 0, pBuf, myShrCntnt.Length);

            Console.WriteLine("共享内存建立完毕,它就在这儿:IntPtr->{0:G}",pBuf.ToInt32());
            Console.ReadKey();
            UnmapViewOfFile(pBuf);
            CloseHandle(hMapFile);                   

在被共享端添加代码:

            string shareName = "XiaoY_H的内存共享";
            IntPtr hMapFile = OpenFileMapping(FILE_MAP_ALL_ACCESS, false, shareName);
            if (hMapFile==IntPtr.Zero)
            {
                Console.WriteLine("Null MapFile!");
                return;
            }
            IntPtr pBuf = MapViewOfFile(hMapFile, FILE_MAP_ALL_ACCESS, 0, 0, 256);
            if (pBuf==IntPtr.Zero)
            {
                Console.WriteLine("Null Buffer!");
                return;
            }
            Console.WriteLine("共享内存数据:" + Marshal.PtrToStringUni(pBuf));
            Console.ReadKey();
            UnmapViewOfFile(pBuf);
            CloseHandle(hMapFile);        

【.NET进程通信】初探.NET中进程间通信的简单的实现

时间: 2024-11-04 16:20:07

【.NET进程通信】初探.NET中进程间通信的简单的实现的相关文章

android92 aidl远程进程通信

05项目RemoteService.java package com.itheima.remoteservice; //05项目 import com.itheima.remoteservice.PublicBusiness.Stub; import android.app.Service; import android.content.Intent; import android.os.Binder; import android.os.IBinder; public class Remote

linux高级编程之socket进程通信

Socket套接字不仅可以用于网络通信和局域网通信还可以用于本地的进程通信. 创建套接字时使用本地协议PF_UNIX,套接字分为流失套接字,数据报套接字. Socket本地进程通信较其他的进程间通信方式(管道,system Ⅴ,BSD)使用更加方便.效率. 本地地址结构: Struct  sockaddr_un   //<sys/un.h> { Sa_family_t sun_family; Char sun_path[108]; //套接字的文件路径 } 填充地址结构: 1.定义:struc

Linux进程通信的几种方式总结

进程通信的目的 数据传输 一个进程需要将它的数据发送给另一个进程,发送的数据量在一个字节到几M字节之间 共享数据 多个进程想要操作共享数据,一个进程对共享数据 通知事 一个进程需要向另一个或一组进程发送消息,通知它(它们)发生了某种事件(如进程终止时要通知父进程). 资源共享 多个进程之间共享同样的资源.为了作到这一点,需要内核提供锁和同步机制. 进程控制 有些进程希望完全控制另一个进程的执行(如Debug进程),此时控制进程希望能够拦截另一个进程的所有陷入和异常,并能够及时知道它的状态改变.

微端游戏启动器LAUNCHER的制作之MFC版一(序和进程通信)

额...刚开始信誓旦旦说要写launcher制作的博客,还没写完就被抛到脑后了真是没毅力.最近把之前写的wpf的launcher改成了mfc版,遇到很多问题,写了三个星期才写完,好好记录一下吧.我也想把wpf版的写完,毕竟过了快一年了......我就决定在mfc版中穿插两种方式的对比把我想要写的比较让我头疼的地方写出来吧. 首先说一下改成C++版主要是因为wpf需要的框架支持很多,有的电脑上没有的话就启动不了.mfc也需要很多的库支持,为了避免这个问题我们只能用静态库的方式了,大是大了点但是经过

C#中使用SendMessage进行进程通信的实例

原文:C#中使用SendMessage进行进程通信的实例 1 新建解决方案SendMessageSecondExample 在解决方案下面新建两个项目:Sender和Receiver,两者的输出类型均为"Windows 应用程序".整个程序的结构如下图所示. 2 实现项目Sender Sender仅包含一个名为"消息发送者"的窗体,如下图所示. 编写窗体后端代码,如下所示. using System; using System.Diagnostics; using

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

原文:C#中使用命名管道进行进程通信的实例 1 新建解决方案NamedPipeExample 在解决方案下面新建两个项目:Client和Server,两者的输出类型均为"Windows 应用程序".整个程序的结构如下图所示. 2 实现项目Client Client仅包含一个名为"客户端"的窗体,如下图所示. 编写窗体后端代码,如下所示. using System; using System.IO; using System.IO.Pipes; using Syste

Android中的跨进程通信方法实例及特点分析(二):ContentProvider

1.ContentProvider简单介绍 在Android中有些数据(如通讯录.音频.视频文件等)是要供非常多应用程序使用的.为了更好地对外提供数据,Android系统给我们提供了Content Provider使用,通过它能够訪问上面所说的数据.比如非常多音乐播放器中的扫描功能事实上就用到了Content Provider功能(当然,也有的播放器是自己去实现更底层的功能). 这种优点是统一管理,比方添加了某个音频文件,底层就会将这种变化通知Content Provider.从而当应用程序訪问

Android中的跨进程通信方法实例及特点分析(一):AIDL Service

转载请注明出处:http://blog.csdn.net/bettarwang/article/details/40947481 最近有一个需求就是往程序中加入大数据的采集点,但是因为我们的Android程序包含两个进程,所以涉及到跨进程通信的问题.现将Android中的跨进程通信方式总结如下. Android中有4种跨进程通信方式,分别是利用AIDL Service.ContentProvider.Broadcast.Activity实现. 1.利用AIDL Service实现跨进程通信 这是

Android中AIDL实现进程通信(附源码下载)

AIDL概述 之前的博客<Android中通过Messenger与Service实现进程间双向通信>演示了如何通过Messenger实现与Service进行跨进程通信,即IPC.但用Messenger实现的IPC存在一点不足:Service内部维护着一个Messenger,Messenger内部又维护着一个Hanlder,当多个client向该Service发送Message时,这些Message需要依次进入Hanlder的消息队列中,Hanlder只能处理完一个Message之后,再从消息队