sách gpt4 ăn đã đi

phương thức chuyển đối tượng C# giữa các tiến trình

In lại Tác giả: qq735679552 Thời gian cập nhật: 27-09-2022 22:32:09 27 4
mua khóa gpt4 giày nike

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,    // xử lý đến cửa sổ đích
    số nguyên tin nhắn,     // tin nhắn
    số nguyên wparam,    // tham số tin nhắn đầu tiên
    tham khảo sao chép dữ liệu lparam // tham số tin nhắn thứ hai
   );
   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:

phương thức chuyển đối tượng C# giữa các tiến trình

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! .

27 4 0
qq735679552
Hồ sơ

Tôi là một lập trình viên xuất sắc, rất giỏi!

Nhận phiếu giảm giá taxi Didi miễn phí
Phiếu giảm giá taxi Didi
Chứng chỉ ICP Bắc Kinh số 000000
Hợp tác quảng cáo: 1813099741@qq.com 6ren.com
Xem sitemap của VNExpress