c#进程之间对象传递方法

2019-12-30 17:06:29王冬梅

这样在窗体按钮btnSubmit_Click事件中,完成了数据向HostApp的字符串形式传递。

如何获取宿主程序的窗口句柄呢?改造下ChildApp的Program.cs过程即可:


/// <summary>
  /// 应用程序的主入口点。
  /// </summary>
  [STAThread]
  static void Main(string[] args)
  {
   Application.EnableVisualStyles();
   Application.SetCompatibleTextRenderingDefault(false);
   Application.Run(new ChildForm(args));
  }

3、HostApp项目

我们权且称之为宿主项目吧,其窗体代码为:


public partial class MainForm : Form
 {
  public const int WM_COPYDATA = 0x004A;
  public MainForm()
  {
   InitializeComponent();
  }
  protected override void WndProc(ref Message m)
  {
   base.WndProc(ref m);
   switch (m.Msg)
   {
    case WM_COPYDATA:
     COPYDATASTRUCT copyData = new COPYDATASTRUCT();
     Type type = copyData.GetType();
     copyData = (COPYDATASTRUCT)m.GetLParam(type);
     string data = copyData.lpData;
     RestorePerson(data);
     break;
   }
  }
  private void RestorePerson(string data)
  {
   var person = JsonConvert.DeserializeObject<Person>(data);
   if (person != null)
    txtInfo.Text = person.ToString();
  }
  private void btnSubmit_Click(object sender, EventArgs e)
  {
   RunChildProcess();
  }
  private void RunChildProcess()
  {
   string appPath = Path.GetDirectoryName(Application.ExecutablePath);
   string childPath = Path.Combine(appPath, "ChildApp.exe");
   Process.Start(childPath, this.Handle.ToString());
  }
 }

它的作用就是接收子进程传递回来的字串,用JsonConvert反序列化为Person对象。

是不是很简单呢?

其实就是用了WM_COPYDATA的字符串传递功能,加上Json的序列化、反序列化,而实现c#不同进程间的对象传递

4、效果图:

c#,进程间,传递对象

5、2017-03-24追加:

今天又发现用Json序列化较为复杂的字串时,出现转义错误,导致反序列化失败。于时改用二进制序列化,转其为base64字串进行传递,问题解决。

代码如下:


public static class SerializeHelper
 {
  /// <summary>
  /// 序列obj对象为base64字串
  /// </summary>
  /// <param name="obj"></param>
  /// <returns></returns>
  public static string Serialize(object obj)
  {
   if (obj == null)
    return string.Empty;
   try
   {
    var formatter = new BinaryFormatter();
    var stream = new MemoryStream();
    formatter.Serialize(stream, obj);
    stream.Position = 0;
    byte[] buffer = new byte[stream.Length];
    stream.Read(buffer, 0, buffer.Length);
    stream.Close();
    return Convert.ToBase64String(buffer);
   }
   catch (Exception ex)
   {
    throw new Exception(string.Format("序列化{0}失败,原因:{1}", obj, ex.Message));
   }
  }
  /// <summary>
  /// 反序列化字符串到对象
  /// </summary>
  /// <param name="str">要转换为对象的字符串</param>
  /// <returns>反序列化出来的对象</returns>
  public static T Deserialize<T>(string str)
  {
   var obj = default(T);
   if (string.IsNullOrEmpty(str))
    return obj;
   try
   {
    var formatter = new BinaryFormatter();
    byte[] buffer = Convert.FromBase64String(str);
    MemoryStream stream = new MemoryStream(buffer);
    obj = (T)formatter.Deserialize(stream);
    stream.Close();
   }
   catch (Exception ex)
   {
    throw new Exception(string.Format("序列化{0}失败,原因:{1}", obj, ex.Message));
   }
   return obj;
  }
 }