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
[serializable]
public class person
public string name
set
} public int age
set
} public list children
}public void addchildren()
public override string tostring()
,年齡:", this.name, this.age);
if (this.children.count != 0)
return info;
} }窗體**:
程式設計客棧public partial class childform : form
private void btnsubmit_click(object sender, eventargs e)
}private string getpersionstr()
}這樣在窗體按鈕btnsubmit_click事件中,完成了資料向hostapp的字串形式傳遞。
如何獲取宿主程式的視窗控制代碼呢?改造下childapp的program.cs過程即可:
///
/// 應用程式的主入口點。
///
[stathread]
static void main(string args)
3、hostapp專案
我們權且稱之為宿主專案吧,其窗體**為:
public partial class mainform : form
protected override void wndproc(ref message m)
}private void restoreperson(string data)
private void btnsubmit_click(object sender, eventargs e)
private void runchildprocess()
}它的作用就是接收子程序傳遞回來的字串,用jsonconvert反序列化為person物件。
是不是很簡單呢?
其實就是用了wm_copydata的字串傳遞功能,加上json的序列化、反序列化,而實現c#不同程序間的物件傳遞
4、效果圖:
5、2017-03-24追加:
今天又發現用json序列化較為複雜的字串時,出現轉義錯誤,導致反序列化失敗。於時改用二進位制序列化,轉其為base64字串進行傳遞,問題解決。
**如下:
public static class serializehelper
catch (exception ex)
失敗,原因:", obj, ex.message));
}} ///
/// 反序列化字串到物件
///
/// 要轉換為物件的字串
/// 反序列化出來的物件
public static t deserialize(string str)
catch (exception ex)
失敗,原因:", obj, ex.message));
}return obj;
} }本文標題: c#程序之間物件傳遞方法
本文位址:
json物件與C 物件傳遞
c 物件不能直接傳遞js js物件不能直接傳遞給c 可以使用序列化當做中間層來進行傳遞物件 序列化 在中間將格式轉換進行傳遞,中間物件可以跨語言,c 能認識,js也能認識,這種資料格式。比如 json,xml 原理如圖 步驟 在c 裡引入序列化的命名空間 例項化序列化的類 把c 物件序列化成json...
winform程序之間傳遞訊息
兩個程序ff.exe與jj.exe分別是傳送方和接受方 傳送方 region 向程序傳送訊息 const intwm copydata 0x004a dllimport user32.dll entrypoint sendmessage private static extern intsendme...
c 本地程序之間進行通訊
c 程序之間進行通訊 介面 namespace 程序通訊 dllimport user32.dll public static extern intsendmessage int hwnd,int msg,int wparam,refcopydatastruct lparam dllimport u...