亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb

首頁 > 編程 > C# > 正文

c#進程之間對象傳遞方法

2019-10-29 21:11:45
字體:
來源:轉載
供稿:網友

1. 起源

KV項目下載底層重構升級決定采用獨立進程進行Media下載處理,以能做到模塊復用之目的,因此涉及到了獨立進程間的數據傳遞問題。

目前進程間數據傳遞,多用WM_COPYDATA、共享dll、內存映射、Remoting等方式。相對來說,WM_COPYDATA方式更為簡便,網上更到處是其使用方法。

而且Marshal這個靜態類,其內置多種方法,可以很方便實現字符串、結構體等數據在不同進程間傳遞。

那么,對象呢?如何傳遞?

2、序列化

想到了,Newtonsoft.Json.dll這個神器。相對于內建的XmlSerializer這個東西,我更喜歡用Json。

那么,如此處理吧,我們來建個Demo解決方案,里面有HostApp、ClildApp兩個項目,以做數據傳遞。

3、ChildApp項目

先說這個,我沒有抽取共用的數據單獨出來,而做為Demo,直接寫入此項目中,HostApp引用此項目,就可引用其中public出來的數據類型。

數據結構部分代碼:

[StructLayout(LayoutKind.Sequential)] public struct COPYDATASTRUCT {  public IntPtr dwData;  public int cbData;  [MarshalAs(UnmanagedType.LPStr)]  public string lpData; } [Serializable] public class Person {  private string name;  private int age;  private List<Person> children;  public Person(string name, int age)  {   this.name = name;   this.age = age;   this.children = new List<Person>();  }  public string Name  {   get { return this.name; }   set { this.name = value; }  }  public int Age  {   get { return this.age; }   set { this.age = value; }  }  public List<Person> Children  {   get { return this.children; }  }  public void AddChildren()  {   this.children.Add(new Person("liuxm", 9));   this.children.Add(new Person("liuhm", 7));  }  public override string ToString()  {   string info = string.Format("姓名:{0},年齡:{1}", this.name, this.age);   if (this.children.Count != 0)   {    info += (this.children.Count == 1) ? "/r/n孩子:" : "/r/n孩子們:";    foreach (var child in this.children)     info += "/r/n" + child.ToString();   }   return info;  } }

窗體代碼:

public partial class ChildForm : Form {  public const int WM_COPYDATA = 0x004A;  private IntPtr hostHandle = IntPtr.Zero;  Person person = new Person("liujw", 1999);  [DllImport("User32.dll", EntryPoint = "SendMessage")]  private static extern int SendMessage(   IntPtr hWnd,    // handle to destination window   int Msg,     // message   int wParam,    // first message parameter   ref COPYDATASTRUCT lParam // second message parameter  );  public ChildForm(string[] args)  {   InitializeComponent();   if (args.Length != 0)    this.hostHandle = (IntPtr)int.Parse(args[0]);  }  private void btnSubmit_Click(object sender, EventArgs e)  {   this.person.Name = txtName.Text;   int age;   this.person.Age = int.TryParse(txtAge.Text, out age) ? age : 0;   this.person.AddChildren();   if (this.hostHandle != IntPtr.Zero)   {    string data = GetPersionStr();    COPYDATASTRUCT cds = new COPYDATASTRUCT();    cds.dwData = (IntPtr)901;    cds.cbData = data.Length + 1;    cds.lpData = data;    SendMessage(this.hostHandle, WM_COPYDATA, 0, ref cds);   }  }  private string GetPersionStr()  {   return JsonConvert.SerializeObject(this.person);  } }

這樣在窗體按鈕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;  } }

以上就是本文的全部內容,希望本文的內容對大家的學習或者工作能帶來一定的幫助,同時也希望多多支持VEVB武林網!


注:相關教程知識閱讀請移步到c#教程頻道。
發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb
日韩电影免费观看中文字幕| 国产在线精品一区免费香蕉| 久99久在线视频| 欧美在线国产精品| 亚洲高清一二三区| 欧美国产日韩一区二区三区| 亚洲高清免费观看高清完整版| 国产精品视频自拍| 亚洲国产精品专区久久| 色妞久久福利网| 亚洲精品久久久久久久久久久久| 亚洲精品成人久久久| 亚洲精品456在线播放狼人| 亚洲日本中文字幕免费在线不卡| 亚洲第一页在线| 国产精品va在线播放我和闺蜜| 欧美成人亚洲成人| 精品成人av一区| 欧美日韩激情视频8区| 亚洲片在线资源| 欧美一区亚洲一区| 欧美高清视频在线| 亚洲欧美日韩天堂一区二区| 亚洲精品小视频| 18一19gay欧美视频网站| 国语自产精品视频在线看抢先版图片| 欧美视频二区36p| 精品国产乱码久久久久久天美| 欧美一乱一性一交一视频| 久久精品亚洲国产| 亚洲激情在线视频| 欧美成年人视频网站欧美| 久久精品成人动漫| 日韩高清电影免费观看完整版| 亚洲第一区中文字幕| 中文字幕亚洲综合久久| 久久成人18免费网站| 欧美一级大片在线免费观看| 国产精品流白浆视频| 亚洲精品av在线播放| 亚洲欧美日本伦理| 日韩免费在线视频| 日韩av片电影专区| 日韩电影视频免费| 亚洲欧美激情一区| 欧美午夜性色大片在线观看| 亚洲欧美综合区自拍另类| 国产精品偷伦一区二区| 久久香蕉国产线看观看网| 中文字幕亚洲一区二区三区五十路| 亚洲欧美日韩天堂| 欧美性猛交xxxx偷拍洗澡| 亚洲 日韩 国产第一| 亚洲自拍偷拍色片视频| 欧美亚洲另类在线| 亚洲精品一区二区三区婷婷月| 羞羞色国产精品| 国产成人精品午夜| 91手机视频在线观看| 亚洲成人三级在线| 性欧美xxxx| 成人精品一区二区三区电影黑人| 欧美日韩国产精品一区二区三区四区| 国产精品亚洲片夜色在线| 欧美一区二区三区图| 亚洲欧美国产一区二区三区| 欧美视频中文在线看| 国产精品扒开腿爽爽爽视频| 亚洲美女精品久久| 亚洲最新中文字幕| 欧美日韩亚洲网| 日韩精品极品毛片系列视频| 色综合色综合网色综合| 中文字幕国产精品久久| 国产亚洲一区精品| 久久视频在线免费观看| www.日韩不卡电影av| 97av在线影院| 超薄丝袜一区二区| 欧美精品电影在线| 亚洲性视频网站| 日韩精品中文字幕在线播放| 一本色道久久88综合亚洲精品ⅰ| 久久九九热免费视频| 中文字幕亚洲综合久久| 日韩电影大片中文字幕| 久久精品中文字幕电影| 午夜精品三级视频福利| 久久久精品日本| 日韩欧美中文在线| 精品国产福利在线| 国产欧美日韩丝袜精品一区| 国产亚洲一区二区精品| 日韩三级成人av网| 色中色综合影院手机版在线观看| 激情成人在线视频| 亚洲美女激情视频| 2019精品视频| 日韩美女av在线免费观看| 国产日韩欧美在线视频观看| 国产激情视频一区| 亚洲成人精品久久久| 国产精品爱久久久久久久| 欧美一区二区影院| 91社影院在线观看| 国产精品视频导航| 91地址最新发布| 久久久午夜视频| 中文字幕国产日韩| 亚洲第一色在线| 911国产网站尤物在线观看| 欧美xxxx做受欧美| 欧美另类老女人| 国产日韩欧美电影在线观看| www国产精品视频| 欧美成人精品一区| 九九视频直播综合网| 日韩精品极品视频免费观看| 色老头一区二区三区| 久久久精品影院| 亚洲国产精彩中文乱码av| 日韩av在线精品| 久久精品国产一区二区电影| 日本不卡高字幕在线2019| 欧洲永久精品大片ww免费漫画| 欧美精品18videos性欧美| 91久久综合亚洲鲁鲁五月天| 欧美专区在线观看| 在线观看免费高清视频97| 国产精品免费在线免费| 亚洲天堂av网| 456亚洲影院| 91av在线播放| xvideos成人免费中文版| 亚洲欧洲日韩国产| 国产精品丝袜久久久久久不卡| 2018国产精品视频| 欧美性猛交xxx| 日韩精品在线免费| 国产日产欧美a一级在线| 欧美成年人网站| 亚洲国产日韩精品在线| 韩国日本不卡在线| 搡老女人一区二区三区视频tv| 久久久久国产一区二区三区| 国产精品女人久久久久久| 亚洲精品www久久久久久广东| 亚洲激情小视频| 国a精品视频大全| 色诱女教师一区二区三区| 久久精品国产亚洲精品2020| 国产91露脸中文字幕在线| 亚洲999一在线观看www| 久久偷看各类女兵18女厕嘘嘘| 国产精品视频白浆免费视频| 欲色天天网综合久久| 91视频免费网站| 这里只有视频精品| 美日韩精品免费视频| 久久精品电影网站| 亚洲成人av中文字幕| 这里只有精品视频在线| 777午夜精品福利在线观看| 欧美成人精品h版在线观看|