CFSDN nhấn mạnh vào giá trị tạo ra nguồn mở và chúng tôi cam kết xây dựng nền tảng chia sẻ tài nguyên để mọi nhân viên CNTT có thể tìm thấy thế giới tuyệt vời của bạn tại đây.
Bài viết blog CFSDN này các phương pháp chuyển đối tượng giữa các tiến trình c# được tác giả sưu tầm và biên soạn. Nếu các bạn quan tâm đến bài viết này thì nhớ like nhé.
1. Xuất xứ.
Việc xây dựng lại và nâng cấp lớp dưới cùng của bản tải xuống dự án kv đã quyết định sử dụng một quy trình độc lập để xử lý tải xuống phương tiện để đạt được mục đích tái sử dụng mô-đun, do đó nó liên quan đến vấn đề truyền dữ liệu giữa các quy trình độc lập.
Hiện tại, việc truyền dữ liệu giữa các tiến trình chủ yếu sử dụng wm_copydata, dll dùng chung, ánh xạ bộ nhớ, điều khiển từ xa và các phương pháp khác. Nói một cách tương đối, phương thức wm_copydata đơn giản hơn và các phương thức sử dụng của nó có ở khắp mọi nơi trên Internet.
Hơn nữa, nguyên soái lớp tĩnh có nhiều phương thức tích hợp sẵn, có thể dễ dàng truyền dữ liệu như chuỗi và cấu trúc giữa các quy trình khác nhau.
Vậy còn đồ vật thì sao? Làm thế nào để giao hàng?
2. Tuần tự hóa.
Tôi đã nghĩ đến tạo tác newtonsoft.json.dll. So với xmlserializer tích hợp sẵn, tôi thích sử dụng json hơn.
Vì vậy, hãy giải quyết vấn đề theo cách này. Hãy xây dựng một giải pháp demo với hai dự án: Hostapp và Clildapp để truyền dữ liệu.
3. dự án ứng dụng trẻ em.
Hãy để tôi nói về điều này trước. Tôi không trích xuất dữ liệu được chia sẻ một cách riêng biệt mà viết nó trực tiếp vào dự án này dưới dạng bản demo. Khi ứng dụng chủ tham chiếu đến dự án này, nó có thể tham chiếu các loại dữ liệu công khai trong đó.
Mã phần cấu trúc dữ liệu:
?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
|
[structlayout(layoutkind.sequential)]
công cộng
cấu trúc
sao chép dữ liệu
{
công cộng
intptr dwdata;
công cộng
số nguyên
cbdate;
[marshalas(loại không được quản lý.lpstr)]
công cộng
sợi dây
dữ liệu lp;
}
[có thể tuần tự hóa]
công cộng
lớp học
người
{
riêng tư
sợi dây
tên;
riêng tư
số nguyên
tuổi;
riêng tư
danh sách trẻ em;
công cộng
người(
sợi dây
tên,
số nguyên
tuổi)
{
cái này
.name = tên;
cái này
.age = tuổi;
cái này
.trẻ em =
mới
danh sách();
}
công cộng
sợi dây
tên
{
lấy
{
trở lại
cái này
.tên; }
bộ
{
cái này
.name = giá trị; }
}
công cộng
số nguyên
tuổi
{
lấy
{
trở lại
cái này
.tuổi; }
bộ
{
cái này
.age = giá trị; }
}
công cộng
danh sách trẻ em
{
lấy
{
trở lại
cái này
.những đứa trẻ; }
}
công cộng
vô hiệu
thêm trẻ em()
{
cái này
.trẻ em.thêm(
mới
người(
"lục"
, 9));
cái này
.trẻ em.thêm(
mới
người(
"lửm"
, 7));
}
công cộng
ghi đè
sợi dây
chuỗi()
{
sợi dây
thông tin =
sợi dây
.định dạng(
"Tên: {0}, Tuổi: {1}"
,
cái này
.tên,
cái này
.tuổi);
nếu như
(
cái này
.children.count != 0)
{
thông tin += (
cái này
.children.count == 1) ?
"\r\nCon:"
:
"\r\nTrẻ em:"
;
foreach
(var con
TRONG
cái này
.những đứa trẻ)
thông tin +=
"\r\n"
+ child.tostring();
}
trở lại
thông tin;
}
}
|
Mã mẫu:
?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
|
công cộng
một phần
lớp học
childform : biểu mẫu
{
công cộng
hằng số
số nguyên
wm_copydata = 0x004a;
riêng tư
intptr hosthandle = intptr.zero;
người người =
mới
người(
"liujw"
, 1999);
[dllim nhập khẩu(
"user32.dll"
, điểm vào =
"gửi tin nhắn"
)]
riêng tư
tĩnh
bên ngoài
số nguyên
gửi tin nhắn(
intptr hwnd,
số nguyên
tin nhắn,
số nguyên
wparam,
tham khảo
sao chép dữ liệu lparam
);
công cộng
dạng trẻ em(
sợi dây
[] đối số)
{
khởi tạo thành phần();
nếu như
(đối số chiều dài != 0)
cái này
.hosthandle = (intptr)
số nguyên
.parse(đối số[0]);
}
riêng tư
vô hiệu
nhấp chuột gửi
sự vật
người gửi, eventargs e)
{
cái này
.person.name = txtname.text;
số nguyên
tuổi;
cái này
.người.tuổi =
số nguyên
.tryparse(txtage. văn bản,
ngoài
tuổi) ? tuổi : 0;
cái này
.person.addchildren();
nếu như
(
cái này
.hosthandle != intptr.zero)
{
sợi dây
dữ liệu = getpersionstr();
sao chép dữ liệu cd =
mới
sao chépdatastruct();
cds.dwdata = (intptr)901;
cds.cbdata = chiều dài dữ liệu + 1;
cds.lpdata = dữ liệu;
gửi tin nhắn(
cái này
.hosthandle, wm_copydata, 0,
tham khảo
đĩa CD);
}
}
riêng tư
sợi dây
lấy persionstr()
{
trở lại
jsonconvert.serializeobject(
cái này
.người);
}
}
|
Bằng cách này, trong sự kiện btnsubmit_click của nút biểu mẫu, dữ liệu sẽ được chuyển đến ứng dụng chủ ở dạng chuỗi.
Làm cách nào để lấy tay cầm cửa sổ của chương trình chủ? Chỉ cần sửa đổi quy trình chương trình.cs của ứng dụng con:
?
1
2
3
4
5
6
7
8
9
10
|
///
/// Điểm vào chính của ứng dụng.
///
[stathread]
tĩnh
vô hiệu
chủ yếu(
sợi dây
[] đối số)
{
ứng dụng.enablevisualstyles();
ứng dụng.setcompatibletexttrenderingdefault(
SAI
);
ứng dụng.chạy(
mới
childform(đối số));
}
|
3. Dự án ứng dụng máy chủ.
Hãy gọi nó là dự án máy chủ và mã mẫu của nó là:
?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
|
công cộng
một phần
lớp học
mainform: biểu mẫu
{
công cộng
hằng số
số nguyên
wm_copydata = 0x004a;
công cộng
biểu mẫu chính()
{
khởi tạo thành phần();
}
được bảo vệ
ghi đè
vô hiệu
wndproc(
tham khảo
tin nhắn m)
{
căn cứ
.undproc(
tham khảo
m);
công tắc
(tin nhắn m.)
{
trường hợp
wm_copydata:
sao chép dữ liệu sao chép dữ liệu =
mới
sao chépdatastruct();
gõ type = copydata.gettype();
copydata = (copydatastruct)m.getlparam(type);
sợi dây
dữ liệu = copydata.lpdata;
khôi phục người(dữ liệu);
phá vỡ
;
}
}
riêng tư
vô hiệu
người phục hồi(
sợi dây
dữ liệu)
{
var person = jsonconvert.deserializeobject(dữ liệu);
nếu như
(người !=
vô giá trị
)
txtinfo.text = person.tostring();
}
riêng tư
vô hiệu
nhấp chuột gửi
sự vật
người gửi, eventargs e)
{
chạy tiến trình con();
}
riêng tư
vô hiệu
chạy tiến trình con()
{
sợi dây
apppath = path.getdirectoryname(application.executablepath);
sợi dây
childpath = path.combine(apppath,
"childapp.exe"
);
tiến trình.start(childpath,
cái này
.handle.tostring());
}
}
|
Chức năng của nó là nhận chuỗi được trả về bởi tiến trình con và giải tuần tự hóa nó thành một đối tượng người bằng cách sử dụng jsonconvert.
Chẳng phải nó rất đơn giản sao?
Trên thực tế, nó sử dụng chức năng truyền chuỗi của wm_copydata, cộng với tuần tự hóa và giải tuần tự hóa json, để thực hiện chuyển đối tượng giữa các quy trình C# khác nhau.
4. Kết xuất:

5, được thêm vào ngày 24-03-2017:
Hôm nay tôi phát hiện ra rằng khi sử dụng json để tuần tự hóa một chuỗi phức tạp hơn, đã xảy ra lỗi thoát khiến quá trình khử tuần tự không thành công. Lúc đó tôi chuyển sang tuần tự hóa nhị phân và chuyển nó thành chuỗi base64 để truyền và vấn đề đã được giải quyết.
Mã này như sau:
?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
|
công cộng
tĩnh
lớp học
tuần tự hóa người trợ giúp
{
///
/// Đối tượng obj chuỗi là chuỗi base64
///
/// |
công cộng
tĩnh
sợi dây
tuần tự hóa(
sự vật
đối tượng)
{
nếu như
(đối tượng ==
vô giá trị
)
trở lại
sợi dây
.trống;
thử
{
định dạng var =
mới
trình định dạng nhị phân();
nơi luồng =
mới
luồng bộ nhớ();
formatter.serialize(luồng, obj);
luồng.vị trí = 0;
byte
[] bộ đệm =
mới
byte
[stream.length];
stream.read(bộ đệm, 0, độ dài bộ đệm);
stream. đóng();
trở lại
convert.tobase64string(bộ đệm);
}
nắm lấy
(ngoại lệ)
{
ném
mới
ngoại lệ(
sợi dây
.định dạng(
"Việc tuần tự hóa {0} không thành công, lý do: {1}"
, đối tượng, ví dụ: tin nhắn));
}
}
///
/// Giải tuần tự hóa chuỗi thành đối tượng
///
/// Chuỗi cần chuyển đổi thành đối tượng
/// Đối tượng được giải tuần tự hóa
công cộng
tĩnh
t hủy tuần tự hóa(
sợi dây
đường)
{
var obj =
mặc định
(t);
nếu như
(
sợi dây
.isnullorempty(str))
trở lại
đối tượng;
thử
{
định dạng var =
mới
trình định dạng nhị phân();
byte
[] bộ đệm = chuyển đổi.frombase64string(str);
luồng bộ nhớ =
mới
memorystream(bộ đệm);
obj = (t)formatter.deserialize(luồng);
stream. đóng();
}
nắm lấy
(ngoại lệ)
{
ném
mới
ngoại lệ(
sợi dây
.định dạng(
"Việc tuần tự hóa {0} không thành công, lý do: {1}"
, đối tượng, ví dụ: tin nhắn));
}
trở lại
đối tượng;
}
}
|
Trên đây là toàn bộ nội dung bài viết này mình mong rằng nội dung bài viết này có thể mang lại sự giúp đỡ nào đó cho việc học tập cũng như công việc của mọi người. Mình cũng mong các bạn có thể ủng hộ mình nhé! .
Liên kết gốc: http://www.cnblogs.com/crwy/p/6568871.html.
Cuối cùng, bài viết về phương pháp truyền đối tượng giữa các tiến trình C# kết thúc tại đây. Nếu bạn muốn biết thêm về phương thức truyền đối tượng giữa các tiến trình C#, vui lòng tìm kiếm bài viết CFSDN hoặc tiếp tục duyệt qua các bài viết liên quan. tương lai blog của tôi! .
Tôi là một lập trình viên xuất sắc, rất giỏi!