Marshaling - nó là gì và tại sao chúng ta cần nó?


92

Thống chế là gì và tại sao chúng ta cần nó?

Tôi cảm thấy khó tin rằng tôi không thể gửi intqua dây từ C # đến C và phải điều chỉnh nó. Tại sao C # không thể gửi 32 bit qua với một tín hiệu bắt đầu và kết thúc, nói với mã C rằng nó đã nhận được một int?

Nếu có bất kỳ hướng dẫn hoặc trang web hay về lý do tại sao chúng ta cần điều chỉnh và cách sử dụng nó, điều đó sẽ rất tuyệt.


3
Trên thực tế, bạn chỉ có thể gửi 32 bit qua một tín hiệu bắt đầu và kết thúc. Đó sẽ là cách viết điều phối của riêng bạn cho một int. Nhưng làm thế nào bạn sẽ chuyển một Từ điển <CustomClassA, Danh sách <CustomClassB>> sang mã C?
Vinko Vrsalovic

4
Nỗi nhớ xuất hiện trong tâm trí bạn khi bạn nói "over the wire".
user7116

true cho phép bỏ qua Endian lớn / nhỏ hoặc bất kỳ biến thể nào khác.

54
Đây là một câu hỏi hơi kỳ quặc. Nó giống như việc hỏi "tại sao chúng ta cần một hệ thống bưu điện, trong khi chúng ta có thể đơn giản có một hệ thống mà những người vận chuyển thư nhận thư từ, đưa nó đến các địa điểm trung tâm để phân loại và sau đó chuyển nó đến người nhận?" Nhưng ... đó là một hệ thống bưu điện. Bạn hỏi tại sao chúng ta cần một hệ thống điều phối trong khi thay vào đó chúng ta có thể có ... một hệ thống điều phối. Tôi nghĩ rằng tôi đang thiếu điểm trong câu hỏi của bạn. Bạn có thể làm rõ?
Eric Lippert

1
Tôi nghĩ cách tốt nhất để hiểu điều này là hiểu cách "phương thức" hoạt động trong hợp ngữ - cách địa chỉ lệnh cuối cùng được lưu trên ngăn xếp, các tham số được truyền qua ngăn xếp, thanh ghi con trỏ ngăn xếp được sửa đổi bởi phương thức, con trỏ lệnh đăng ký được sử dụng, và đặc biệt, làm thế nào có thể có những thay đổi nhỏ trong các kỹ thuật khác nhau để thực hiện các phương pháp. Thực tế, hiểu được "dây" sẽ làm sáng tỏ câu hỏi của bạn.
ylax

Câu trả lời:


75

Bởi vì các ngôn ngữ và môi trường khác nhau có các quy ước gọi khác nhau, các quy ước bố cục khác nhau, các kích thước khác nhau của các nguyên bản (xem chartrong C # và chartrong C), các quy ước tạo / phá hủy đối tượng khác nhau và các hướng dẫn thiết kế khác nhau. Bạn cần một cách để đưa những thứ từ vùng đất được quản lý vào một nơi nào đó mà vùng đất không được quản lý có thể nhìn thấy và hiểu nó và ngược lại. Đó là những gì soái ca là để làm.


25

Mã .NET (C #, VB) được gọi là "được quản lý" vì nó được "quản lý" bởi CLR ( Thời gian chạy ngôn ngữ chung )

Nếu bạn viết mã bằng C hoặc C ++ hoặc trình hợp dịch thì tất cả được gọi là "không được quản lý", vì không có CLR nào liên quan. Bạn chịu trách nhiệm về tất cả cấp phát / giảm cấp phát bộ nhớ.

So khớp là quá trình giữa mã được quản lý và mã không được quản lý; Đây là một trong những dịch vụ quan trọng nhất do CLR cung cấp .


11

Marshalling an intlý tưởng là như những gì bạn đã nói: sao chép bộ nhớ từ ngăn xếp được quản lý của CLR vào một nơi nào đó mà mã C có thể nhìn thấy nó. Điều chỉnh chuỗi, đối tượng, mảng và các loại khác là những thứ khó khăn.

Nhưng lớp interop P / Invoke đảm nhận hầu hết tất cả những điều này cho bạn.


2
Marshalling có thực sự thực hiện các hoạt động sao chép không? Tôi đang xem xét các hoạt động xử lý hình ảnh thời gian thực và không muốn phải tạo bản sao của mọi thứ trong bộ nhớ.
ias

7

Như Vinko đã nói trong phần bình luận, bạn có thể vượt qua các kiểu nguyên thủy mà không cần bất kỳ sự sắp xếp đặc biệt nào. Chúng được gọi là các loại "blittable" và bao gồm các loại như byte, short, int, long, v.v. và các đối tác không dấu của chúng.

Trang này chứa danh sách các loại blittable và không blittable .


7

Marshalling là một "phương tiện" để muốn có một từ hay một cổng vào, để giao tiếp với các kiểu dữ liệu của thế giới không được quản lý và ngược lại, bằng cách sử dụng pinvoke và đảm bảo dữ liệu được trả lại một cách an toàn.


2

Marshalling đang chuyển chữ ký của một chức năng tới một quy trình khác trên một máy khác và nó thường được thực hiện bằng cách chuyển đổi dữ liệu có cấu trúc sang một định dạng chuyên dụng, có thể được chuyển sang các hệ thống xử lý khác (tuần tự hóa / giải mã hóa).

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.