Archive
เรื่องของ Managed Code
เมื่อเราทำงานกับ .NET Framework เราจะได้เจอกับคำว่า “Managed code” ในเอกสารนี้จะอธิบายความหมายของคำนี้รวมถึงข้อมูลต่าง ๆ ที่เกี่ยวข้องที่ต้องรู้
เพื่อให้ง่ายต่อความเข้าใจ ว่า Managed code คืออะไร ให้คำจำกัดความง่าย คือ Code ที่ทำงานภายใต้การจัดการของ Runtime ซึ่งการหมายถึง Common Language Runtime หรือ CLR ไม่ว่าจะเป็น .NET Framework .NET Core หรือ Mono ก็ตาม CLR มีหน้าที่ในการ compiling Managed code ให้เป็น Machine Code และทำการ และสั่งให้ทำงาน ซึ่งใน CLR นั้นมีบริการต่าง ๆ ที่สำคัญให้ เช่น Automatic Memory management , security boundaries, type safety เป็นต้น
ในทางตรงกันข้าม ในวิถีของการทำงาน C/C++ ในที่นี้เราเรียกว่า Unmanaged code ซึ่งในโลกของ Unmanaged code นั้น Operating System มีหน้าที่ load และ run โปรแกรม นอกจากนี้โปรแกรมเมอร์จะต้องจัดการเอง เช่น เรื่องการใช้การจอง Memories จะต้องจองและคืนเอง เป็นต้น
สำหรับ Managed Code นั้นเขียนขึ้นจากภาษาระดับสูง (high-level language ) ที่สามารถประมวลผลบน .NET ได้ เช่น C# , Visual Basic, F# และอื่น ๆ เมื่อเราทำการ Compile Code ที่เขียนขึ้นจากภาษาเหล่านี้ด้วย Complier ของ Managed Code เราจะยังไม่ได้ Machine code เลย สิ่งที่ได้เราจะเรียกว่า Intermediate Language Code ซึ่งจะต้องถูกแปลงเป็น Machine Code ด้วย CLR อีกครั้งหนึ่ง แต่ C++ นั้นเป็นภาษาหนึ่งที่ถูกยกเว้นจากข้อกำหนดดังกล่าวข้างต้น เนื่องจากมันสามารถที่จะ Compile ออก มาเป็น Machine code หรือ Unmanage binaries และประมวลผลบน Windows ได้เลย (ไม่ต้องทำงานบน CLR) ตามภาพ

Marshaling with C# แนะนำเรื่อง Marshaling
Marshaling คือกระบวนการในการสร้างทางเชื่อมต่อระหว่าง Manage Code และ Unmanaged code ก็คือการย้ายข้อมูลจากสภาพแวดล้อมแบบ managed ไปยัง unmanaged หรือในทางกลับกัน ซึ่งนี้ก็เป็นส่วนหนึ่งของ Core Services ของ CLR (Common Language Runtime) ด้วยเหตุที่ว่า โดยมากแล้วชนิดของข้อมูล (Types) ในสภาวะแวดล้อมแบบ Unmanaged นั้นไม่มีใน สภาวะแวดล้อมแบบManaged จึงจำเป็นจะต้องสร้าง Function ในการแปลงไปมาระหว่าง Managed Type และ Unmanaged Type ซึ่งนี่ก็คือการทำงานของกระบวนการ Marshaling.
เพื่อเป็นการ ทำความเข้าใจอีกครั้ง เราเรียก .NET Code ว่าเป็น Managed ก็เพราะว่ามันอยู่ภายใต้การควบคุมของ CLR ฉะนั้น Code อื่น ๆ นอกเหนือจากนี้เราเรียกว่า เป็น Unmanaged
Why Marshaling? ทำไมต้องมีกระบวนการนี่ด้วย
เป็นที่ทราบกันในหมู่นักพัฒนาโปรแกรมแล้วว่า ความเข้ากันได้ระหว่าง Managed และ Unmanaged นั้นไม่มี หรือจะกล่าวอีกอย่างหนึ่งได้ว่า .NET ไม่มีชนิดข้อมูลดังตัวอย่างนี้ HRESULT DWORD และ HANDLE ซึ่งมีอยู่ใน Unmanaged Code. ซึ่งก็ทำให้เราต้องหาแบบข้อมูลแทนหรือสร้างขึ้นมาเองเพื่อใช้งาน การกระทำนี้ก็คือการ Marshaling
ตัวอย่าง เช่น DWORD ของ Unmanaged code มันคือ unsigned 32-bit integer ซึ่งเราสามารถ marshal ด้วย System.UInt32 ใน .NET ดังนั้น System.UInt32 ก็เป็นแบบข้อมูลแทน DWORD ของ Unmanaged . หรือ ตัวอย่างอื่น ๆ เช่นในกรณีที่ชนิดข้อมูลเป็นแบบ Compound Types เช่น Structure , union ซึ่งไม่มีแบบข้อมูลรองรับใน สภาวะแวดล้อมของ Managed ดังนั้นจึงต้องมีการสร้างขึ้นใช้เอง(structures/classes) เพื่อใช้รองรับชนิดข้อมูล ของ Unmanaged types ที่เราต้องการใช้