进程之间的通信是为了解决不同进程之间的数据传输问题,这样可以让不同程序交互数据。实现进程通信的方式:1、剪切板;2、COM;3、内存映射文件;4、WCF
1、剪切板Clipboard在进程间传送对象
剪切板是一个供应用程序使用的公有区域。在.NET中定一个了一个DataFormats类,此类包含一些静态字段,定义了剪切板中可以存放的数据类型。使用Clipboard类可以向剪切板中放入数据。
如将文字放入剪切板,使用方法SetDataObject即可:Clipboard.SetDataObject(“剪切板文字2”); 在读取的时候,先判断剪切板中是否有文字,然后再读取:
IDataObject data = Clipboard.GetDataObject(); if (data.GetDataPresent(DataFormats.Text)) { label1.Text = data.GetData(DataFormats.Text).ToString(); }
将自定义的数据放置到剪切板,自定义一个图片类,并标记为可序列化(此处使用的命名空间是:TestClipboard)。将自定义数据类型对象放置到剪切板的关键是DataObject类,它实现了IDataObject接口。它就像一个容器,存放将被放置在剪切板上的数据。
[Serializable] public class MyPic { /// <summary> /// 图片 /// </summary> public Image Img; /// <summary> /// 图片信息 /// </summary> public string ImgInfo; } public void SetMyPicToClipboard() { MyPic obj = new MyPic(); obj.Img = Properties.Resources.Image; obj.ImgInfo = "测试将自定义类型保存至剪切板"; //创建数据对象,并将数据装入 IDataObject dataObj = new DataObject(obj); //其他类型也可以放置在同一数据对象中 /* dataObj.SetData(DataFormats.UnicodeText, "测试文字"); dataObj.SetData(DataFormats.Bitmap, Properties.Resources.Image); */ //复制到剪切板,第二个参数表示程序退出时不清空 Clipboard.SetDataObject(dataObj, true); }
但是,使用Clipboard.SetDataObject方法将一个DataObject对象放到剪切板后,外界访问时,需要指定对象的完整类型名称。如果某种数据类型只能在指定的进程中访问,则可以使用该方式,指定命名空间。
//首先判断剪切板上是否有我的数据:需要完全限定命名空间类型 if (Clipboard.ContainsData("WindowsFormsApplication1.MyPic")) { IDataObject dataObj = Clipboard.GetDataObject();//读取数据 MyPic myPic = dataObj.GetData("WindowsFormsApplication1.MyPic") as MyPic;//转换数据 pictureBox1.Image = myPic.Img; textBox1.Text = myPic.ImgInfo; }
2、使用FileSystemWatcher实现进程同步
该组件可以监控特定的文件夹或文件,比如在此文件夹中某文件被删除或内容被改变时引发对应的事件。通过该组件让多个进程同时监控一个文件,以此可以充当“临时”进程间通信渠道。
实现进程同步的关键点是:正确设置文件的共享和读写权限。
/// <summary> /// 实现写入数据 /// </summary> /// <param name="fileName"></param> public void SetText(string fileName) { using (FileStream fs = new FileStream(fileName, FileMode.Create, FileAccess.Write, FileShare.Read)) { using (StreamWriter writer = new StreamWriter(fs, Encoding.UTF8)) { writer.Write("内容"); } } } /// <summary> /// 实现读取数据 /// </summary> /// <param name="fileName"></param> public void ReadText(string fileName) { using (FileStream fs = new FileStream(fileName, FileMode.Open, FileAccess.Read, FileShare.ReadWrite)) { using (StreamReader reader = new StreamReader(fs, Encoding.UTF8)) {<strong>本文来源gaodai#ma#com搞@代~码^网+</strong> string txt = reader.ReadToEnd(); } } }