Marshaling - มันคืออะไรและทำไมเราถึงต้องการ?


94

Marshalling คืออะไรและทำไมเราถึงต้องการ?

ฉันคิดว่ามันยากที่จะเชื่อว่าฉันไม่สามารถส่งintผ่านสายจาก C # ไป C และต้องจัดเรียงใหม่ ทำไม C # ไม่สามารถส่ง 32 บิตไปพร้อมกับสัญญาณเริ่มต้นและสิ้นสุดโดยบอกรหัส C ว่าได้รับint?

หากมีบทเรียนหรือไซต์ที่ดีเกี่ยวกับสาเหตุที่เราต้องใช้มาร์แชลลิ่งและวิธีใช้งานนั่นจะดีมาก


3
ในความเป็นจริงคุณสามารถส่ง 32 บิตไปพร้อมกับสัญญาณเริ่มต้นและสิ้นสุด นั่นจะเป็นการเขียนมาร์แชลลิ่งของคุณเองสำหรับ int แต่คุณจะส่ง Dictionary <CustomClassA, List <CustomClassB>> ไปยังโค้ด C ได้อย่างไร?
Vinko Vrsalovic

4
ความอดทนจะเกิดขึ้นเมื่อคุณพูดว่า "ทับเส้น"
user7116

true ให้ละเว้น Endian ใหญ่ / น้อยหรือรูปแบบอื่น ๆ

56
นี่เป็นคำถามแปลก ๆ มันเหมือนกับการถามว่า "ทำไมเราต้องมีระบบไปรษณีย์ในเมื่อเราสามารถมีระบบที่ผู้ให้บริการจดหมายมารับจดหมายโต้ตอบได้นำไปยังสถานที่กลางเพื่อจัดเรียงข้อมูลจากนั้นจึงส่งมอบให้กับผู้รับ" แต่ ... นั่นคือระบบไปรษณีย์ คุณถามว่าทำไมเราถึงต้องการระบบมาร์แชลในเมื่อเรามี ... ระบบมาร์แชลลิ่งแทน ฉันคิดว่าฉันพลาดประเด็นของคำถามของคุณ คุณสามารถชี้แจง?
Eric Lippert

1
ฉันคิดว่าวิธีที่ดีที่สุดในการทำความเข้าใจคือการทำความเข้าใจว่า "วิธีการ" ทำงานอย่างไรในแอสเซมบลี - วิธีบันทึกแอดเดรสคำสั่งสุดท้ายบนสแต็กพารามิเตอร์ถูกส่งผ่านสแต็กรีจิสเตอร์ตัวชี้สแต็กถูกแก้ไขโดยวิธีการตัวชี้คำสั่ง มีการใช้ register และโดยเฉพาะอย่างยิ่งอาจมีความแตกต่างเล็กน้อยในเทคนิคต่างๆในการนำวิธีไปใช้ ที่จริงแล้วการทำความเข้าใจ "สายไฟ" จะช่วยให้คำถามของคุณกระจ่างขึ้น
ylax

คำตอบ:


77

เนื่องจากภาษาและสภาพแวดล้อมที่แตกต่างกันมีรูปแบบการเรียกที่แตกต่างกันรูปแบบการจัดวางที่แตกต่างกันขนาดดั้งเดิมที่แตกต่างกัน (เปรียบเทียบcharใน C # และcharใน C) รูปแบบการสร้าง / ทำลายวัตถุที่แตกต่างกันและแนวทางการออกแบบที่แตกต่างกัน คุณต้องการวิธีที่จะนำสิ่งของออกจากที่ดินที่มีการจัดการไปยังที่ใดที่หนึ่งซึ่งที่ดินที่ไม่มีการจัดการสามารถมองเห็นและเข้าใจมันได้และในทางกลับกัน นั่นคือสิ่งที่มาร์แชลลิ่งมีไว้เพื่อ


26

รหัส. NET (C #, VB) เรียกว่า "มีการจัดการ" เนื่องจาก "จัดการ" โดย CLR ( รันไทม์ภาษาทั่วไป )

หากคุณเขียนโค้ดใน C หรือ C ++ หรือแอสเซมเบลอร์ทั้งหมดนี้เรียกว่า "ไม่มีการจัดการ" เนื่องจากไม่มี CLR เกี่ยวข้อง คุณต้องรับผิดชอบในการจัดสรร / ยกเลิกการจัดสรรหน่วยความจำทั้งหมด

Marshalingเป็นกระบวนการระหว่างรหัสที่มีการจัดการและรหัสที่ไม่มีการจัดการ มันเป็นหนึ่งในบริการที่สำคัญที่สุดที่นำเสนอโดยCLR


11

Marshalling an intเป็นสิ่งที่ดีที่สุดที่คุณพูด: การคัดลอกหน่วยความจำจากสแต็กที่จัดการของ CLR ไปยังที่ใดที่หนึ่งซึ่งรหัส C สามารถมองเห็น สตริงมาร์แชลออบเจ็กต์อาร์เรย์และประเภทอื่น ๆ เป็นสิ่งที่ยาก

แต่ P / Invoke interop layer จะดูแลสิ่งเหล่านี้ให้คุณเกือบทั้งหมด


3
Marshalling กำลังทำการคัดลอกจริงหรือไม่? ฉันกำลังดูการประมวลผลภาพแบบเรียลไทม์และไม่ต้องการทำสำเนาทุกอย่างในหน่วยความจำ
IAS

7

ดังที่ Vinko กล่าวไว้ในความคิดเห็นคุณสามารถส่งผ่านประเภทดั้งเดิมได้โดยไม่ต้องมีการมาร์แชลพิเศษ สิ่งเหล่านี้เรียกว่าประเภท "blittable" และรวมถึงประเภทต่างๆเช่น byte, short, int, long ฯลฯ และคู่ที่ไม่ได้ลงนาม

หน้านี้มีรายการประเภทที่ไม่สามารถพูดได้และไม่สามารถทำลายได้


7

Marshalling เป็น "สื่อ" สำหรับต้องการคำที่ดีกว่าหรือเกตเวย์เพื่อสื่อสารกับประเภทข้อมูลของโลกที่ไม่มีการจัดการและในทางกลับกันโดยใช้ pinvoke และทำให้มั่นใจได้ว่าข้อมูลจะถูกส่งกลับอย่างปลอดภัย


2

Marshalling กำลังส่งลายเซ็นของฟังก์ชันไปยังกระบวนการอื่นซึ่งอยู่ในเครื่องอื่นและโดยปกติจะดำเนินการโดยการแปลงข้อมูลที่มีโครงสร้างเป็นรูปแบบเฉพาะซึ่งสามารถถ่ายโอนไปยังระบบประมวลผลอื่น ๆ ได้

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.