• 欢迎访问搞代码网站,推荐使用最新版火狐浏览器和Chrome浏览器访问本网站!
  • 如果您觉得本站非常有看点,那么赶紧使用Ctrl+D 收藏搞代码吧

c# 如何实现不同进程之间的通信

c# 搞代码 4年前 (2022-01-09) 21次浏览 已收录 0个评论

进程之间的通信是为了解决不同进程之间的数据传输问题,这样可以让不同程序交互数据。实现进程通信的方式: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();
    }
  }
}

搞代码网(gaodaima.com)提供的所有资源部分来自互联网,如果有侵犯您的版权或其他权益,请说明详细缘由并提供版权或权益证明然后发送到邮箱[email protected],我们会在看到邮件的第一时间内为您处理,或直接联系QQ:872152909。本网站采用BY-NC-SA协议进行授权
转载请注明原文链接:c# 如何实现不同进程之间的通信
喜欢 (0)
[搞代码]
分享 (0)
发表我的评论
取消评论

表情 贴图 加粗 删除线 居中 斜体 签到

Hi,您需要填写昵称和邮箱!

  • 昵称 (必填)
  • 邮箱 (必填)
  • 网址