protect

ถ้าเอาบทความไปเผยแพร่แล้วไม่ให้เครดิต ดำเนินคดีด้วย พรบ. คอมพิวเตอร์ฉบับใหม่ ขั้นสูงสุดและไม่ยอมความครับ

วันศุกร์ที่ 30 ตุลาคม พ.ศ. 2558

Assembly Module : ตอนที่ 5 TypeDef table และสมาชิก (3)


เรามาต่อจาก บทความที่แล้วกันเลย ด้วยตัวอย่าง code จากบทความที่แล้ว ผมแสดงให้ดูถึงรายละเอียดของ Table TypeDef ไปแล้วในบทความนี้จะมาพูดถึงรายละเอียดของ table อื่นๆ ที่สัมพันธ์กับ table TypeDef กันครับ

จาก execute file ที่ได้จากตัวอย่างบทความที่แล้ว ถ้าเราเปิดด้วย ILDasm แล้วไปที่เมนู View -> MetaInfo -> Show!

ลองเลื่อนรายละเอียดของ metadata มาจนถึงรูปข้างล่างครับ



Method #1 (06000001)  จะเป็นสมาชิกของ table TypeDef
   #1 จะหมายถึง Index ของ method แล้วจะมีค่าบวกไปเรื่อยๆ สำหรับ method ถัดไป
   06000001 โดยที่ตัวเลข 06 ที่อยู่ข้างหน้า เป็น reference code สำหรับ runtime เพื่อให้ runtime ทราบขณะกำลัง compile ว่านี้คือ table MethodDef แน่นอนครับตัวเลขที่เป็นตัวเลขฐาน 16

ส่วนรายละเอียดข้างล่าง ของ Method #1 (06000001) ผมจะอธิบายเป็นบางส่วนก่อน ส่วนที่ยังไม่อธิบายจะไปอธิบายในบทความถัดๆ ไปน่ะครับ

MethodName 
จากตัวอย่างในรูปคือ .ctor หมายถึงเป็น constructor ก็คือมีชื่อเดียวกับชื่อของ TypeDef

Flags
บอกให้รู้ว่า method นี้มี flags อะไรบ้าง เช่น public (ส่วน flags ชนิดอื่น ผมจะอธิบายในส่วนถัดไปน่ะครับ)

RVA (Relative Virtual Address)
เป็น address ที่เก็บ IL code ของ method นี้ หมายความว่าเมื่อ runtime ทำงาน runtime จะไป compile IL code ของ method ที่ address 0x00002050 (ยังจำได้ไหมครับ managed execute file แบ่งออกเป็น 4 ส่วน สามารถย้อนไปอ่านได้ที่นี้ครับ)

ImplFlags
เป็น falgs ที่บอกว่า method นี้ถูก implement มาอย่างไร ในตัวอย่างหมายความว่า method นี้เป็นชนิด IL และสามารถ manage ได้

ReturnType
จากตัวอย่างเป็น Void คือ ไม่มีค่า return กลับ

No arguments
ไม่มีพารามิเตอร์สำหรับ method นี้ 

ที่นี้เราลองมาดู method Main กันบ้างน่ะครับ




 ใน method Main จะสังเกตุเห็นคำว่า [ENTRYPOINT] ซึ่งเป็นตัวบอก runtime ว่านี้เป็น method แรกเมื่อมีการ execute โปรแกรม 
RVA : 0x000020c2 บอกให้รู้ตำแหน่งของ IL code ของ entrypoint 
1 Arguments คือ method นี้ต้องการ 1 พารามิเตอร์ โดยมี Type SZArray ที่เก็บค่า string ของ Array
Signature : 00 01 01 1d 0e เป็น index ที่ชี้ไปที่ table ParamDef 
1 Parameters เป็นรายละเอียดของ table ParamDef ที่เกี่ยวกับ parameter นี้ จำนวน parameter จะเท่ากับจำนวน Arguments เสมอ

 พบกันใหม่บทความหน้าครับ
TuChay 

วันพฤหัสบดีที่ 29 ตุลาคม พ.ศ. 2558

Assembly Module : ตอนที่ 5 TypeDef table และสมาชิก (2)


ตอนที่แล้วผมแนะนำรายละเอียดของ table ต่างๆ ที่อยู่ในส่วนของ Definition table ไปแล้ว ที่นี้เราลองมาดูเนื้อหาของ table จากตัวอย่าง code C# ดูน่ะครับ

ลองดูตัวอย่าง code ง่ายๆ น่ะครับ

using System;

namespace CTS
{
    class Program
    {
        public int thisIsField;
        public event EventHandler thisIsEvent;
        public Program()
        {

        }

        ~Program()
        {

        }

        public string thisIsProperty
        {
            get { return ""; }
            set {}
        }


        public void thisIsMethod()
        {

        }

        public void thisIsMethod(int param)
        {

        }

        public string this[int inderxer]
        {
            get { return ""; }
            set { }
        }

        static void Main(string[] args)
        {
         
        }
    }

    public class ThisIsSecondType
    {
        public ThisIsSecondType()
        {

        }
    }
}


ตัวอย่าง code นี้มาจาก code ของ Common Type System (CTS) ตอนที่ 2  แต่ผมเพิ่มเข้าไปอีกหนึ่ง Type คือ ThisIsSecondType จากนั้น compile code เพื่อที่จะได้ execute file แล้วเปิด execute file ที่ได้ด้วย ILDasm น่ะครับ จากนั้นไปที่เมนู View -> MetaInfo -> Show!

เรามาดู information ของ table TypeDef ก่อน รูปข้างล่างเป็นตัวอย่างรายละเอียดของ table TypeDef




ที่บรรทัด TypeDef #1 (02000002)
   #1 จะเป็น index ของ Type โดยตัวเลขที่เพิ่มขึ้นไปทีล่ะหนึ่งสำหรับ Type ถัดไป
  02000002 ตัวเลข 02 ที่อยู่ข้างหน้า เป็น reference code สำหรับ runtime เพื่อให้ runtime ทราบขณะกำลัง compile ว่านี้คือ table TypeDef  โดย table TypeDef จะ start ที่ 0x02 ตัวแรก 0x หมายถึงเลขฐาน16 หมาความว่าตัวเลข 02000002 เป็นตัวเลขฐาน 16 น่ะครับ

ดังนั้นตัวเลข 02000010 ฐาน 10 จะมีค่าไม่เท่ากับ 02000010 ฐาน 16 

รายละเอียดข้างล่างอีก 3 บรรทัดจะเป็นรายละเอียดของ Type
    TypeDefName เป็นชื่อของ Type โดยชื่อของ Type จะรวม namespace หน้าชื่อของ Type ใน C# code
    Flags เป็นตัวบอกชนิดของ Type จะสังเกตุว่าใน 1 Type สามารถมีได้หลาย flag
    Extends เป็นตัวบอกให้รู้ว่า Type นี้มีการสืบถอดมาจาก Type ไหนบ้าง

อันนี้สำคัญน่ะครับ Type ทุก Type ที่เขียนขึ้นภายใต้ .Net Framework จะถูกสืบทอดมาจาก Type System.Object เสมอครับ นั้นคือเหตุผลว่าทำไม Type ทุก Type ที่เราสร้างขึ้นจึงมี method ToString() ทุกครั้ง

ที่นี้ลองมาดู Type ThisIsSecondType ใน code น่ะครับ จะเป็นได้ดังรูปข้างล่าง



สิ่งที่ต่างจาก Type Program (Type แรกของ table TypeDef) คือ Index ของ Type เป็นหมายเลข 2 และเลข reference เป็น 0x02000003 (จริงๆ ก็คือ 02000003 แหละครับ แต่ใส่ 0x เพื่อย้ำให้รู้ว่านี้เป็นเลขฐาน 16)

Flags ของ Type ThisIsSecondType เราระบุว่าเป็น public ในขณะที่ Type Program เราไม่ได้ระบุดังนั้น C# compiler จะให้ Type Program มี flag เป็น NotPublic เป็นค่า default

พบกันใหม่บทความหน้าครับ
TuChay




วันอังคารที่ 27 ตุลาคม พ.ศ. 2558

Assembly Module : ตอนที่ 5 TypeDef table และสมาชิก (1)


TypeDef table เป็น table ที่อยู่ในส่วนของ Definition table มี reference code 0x02 ตอนทำ runtime (reference code ผมจะอธิบายพร้อมยกตัวอย่างในตอนถัดไปครับ) ใน 1 Module จะมี TypeDef แค่ 1 table เท่านั้น ทำหน้าที่เก็บรายละเอียดของ Type ที่เป็นสมาชิกของ module โดยแต่ล่ะแถวของ table จะเก็บข้อมูลของ Type แต่ล่ะชนิด ข้อมูลในแถวจะเก็บรายละเอียดของข้อมูลดังนี้

1) ชื่อของ Type
2) base type ที่มีการสืบทอดมา
3) flags access modifiers ของ Type (เช่น public, private)
4) Index ของ method ที่ Type นี้เป็นเจ้าของ ข้อมูลของ method จะอยู่ใน table MethodDef โดยมี index นี้เป็นตัวเชื่อมระหว่าง TypeDef กับ MethodDef
5) Index ของ field ที่ Type นี้เป็นเจ้าของ ข้อมูลของ field จะอยู่ใน table FieldDef โดยมี index นี้เป็นตัวเชื่อมระหว่าง TypeDef กับ FieldDef
6) Index ของ property ที่ Type นี้เป็นเจ้าของ ข้อมูลของ property จะอยู่ใน table PropertyDef โดยมี index นี้เป็นตัวเชื่อมระหว่าง TypeDef กับ PropertyDef
7) Index ของ event ที่ Type นี้เป็นเจ้าของ ข้อมูลของ event จะอยู่ใน table EventDef โดยมี index นี้เป็นตัวเชื่อมระหว่าง TypeDef กับ EventDef

จากคำอธิบายข้างต้นเราจะเห็นความสัมพันธ์ของ database อย่างง่ายๆ โดยมี TypeDef เป็น table หลักและมี table อื่นๆ เป็นตัวเก็บรายละเอียดของ Type

เรามาดู table ย่อยที่มีความสัมพันธ์กับ TypeDef โดยมีรายละเอียดดังนี้

1) MethodDef
    เป็น table ที่เก็บรายละเอียดของ method ที่เป็นสมาชิกของ Type มี reference code 0x06 ตอนทำ runtime โดยรายละเอียดที่เก็บใน table มีดังนี้
   - ชื่อของ method
   - flags access modifiers ของ method (เช่น public, private)
   - Index ของ parameter ของ method (signature) ข้อมูลของ parameter จะอยู่ใน table ParamDef โดยมี index นี้เป็นตัวเชื่อมระหว่าง TypeDef กับ ParamDef

2) ParamDef
    เป็น table ที่เก็บรายละเอียดของ parameter ของ method  มี reference code 0x08 ตอนทำ runtime ใน 1 แถวจะเก็บรายละเอียดของ พารามิเตอร์ที่ถูกกำหนดใน method โดยข้อมูลในแต่ล่ะแถวจะเก็บรายละเอียดดังนี้
    - Type ของ parameter
    - ชื่อของ parameter
    - flag ของ parameter เช่น in, out, retval

2) FieldDef
  เป็น table ที่เก็บรายละเอียดของ filed ที่เป็นสมาชิกของ Type มี reference code 0x04 ตอนทำ runtime โดยรายละเอียดที่เก็บใน table มีดังนี้
    - Type ของ field
    - ชื่อของ field
    - flag ของ field เช่น private, public

3) PropertyDef
    เป็น table ที่เก็บรายละเอียดของ property ที่เป็นสมาชิกของ Type มี reference code 0x17 ตอนทำ runtime โดยรายละเอียดที่เก็บใน table มีดังนี้
    - Type ของ property
    - ชื่อของ property
    - flag ของ propertyเช่น private, public


4) EventDef

    เป็น table ที่เก็บรายละเอียดของ event ที่เป็นสมาชิกของ Type มี reference code 0x14 ตอนทำ runtime โดยรายละเอียดที่เก็บใน table มีดังนี้
    - Type ของ event
    - ชื่อของ event
    - flag ของ event เช่น private, public


ในตอนหน้าเราจะมาดูวิธีการอ่านรายละเอียดของ table TypeDef และ table อื่นๆ ที่ TypeDef มีการอ้างถึงกันครับ

พบกันใหม่บทความหน้าครับ
TuChay


วันจันทร์ที่ 19 ตุลาคม พ.ศ. 2558

Assembly Module : ตอนที่ 5 ModuleDef table


Table แรกและเป็น table ที่สำคัญในส่วนของ Definition table คือ ModuleDef เป็น table ที่เก็บรายละเอียดของ module ได้แก่

 1) ชื่อของ module และนามสกุลของ module
เราสามารถแก้ไขชื่อและนามสกุลในส่วนของ table ModuleDef ได้แต่เนื่องจากมีหลาย table ใน metadata ทำการ link ไปที่ข้อมูลของ ModuleDef เพื่อป้องกันความผิดพลาดในการทำ runtime จึงไม่ควรเปลี่ยนชื่อและนามสกุลใน ModuleDef โดยเด็ดขาด

2) MVID - Module Version Identifier
 จะเป็นค่า uniqe ที่จะไม่ซ้ำกันและค่าจะเปลี่ยนไปเรื่อยๆ ทุกๆ ครั้งที่มีการ compile code แม้แต่ code เดียวกันถ้า compile code 2 ครั้ง ค่า MVID ทั้งสองครั้งก็จะมีค่าไม่เหมือนกัน รูปแบบของ MVID จะเป็นรูปแบบเดียวกับ GUID โดยมีการ checksums เพื่อนำมาสร้างค่า MVID

ที่ .Net Framework มีเปลี่ยนแปลงค่า MVID ทุกครั้งที่มีการ compile code เป็นเพราะว่า โดยปกติบริษัทที่จำหน่าย software มักจะมีบริษัทที่สาม (Third party company) หรืออาจจะเป็นแผนกตรวจสอบคุณภาพ (QC) ภายในบริษัท จะทำหน้าที่ตรวจสอบคุณภาพและรับประกันคุณภาพของ software ก่อนที่ software จะถูกนำออกจำหน่าย หน้าที่นี้รวมถึงการตรวจสอบ source code ดังนั้นบริษัทที่สามต้องการยืนยันว่า code ที่ได้มาตรงกับ execute file ที่กำลังตรวจสอบ, ทดสอบ และ เตรียมตัวที่จะจำหน่าย ดังนั้นรหัส MVID จึงเป็นตัวช่วยในระบบการตรวจสอบได้ถูกต้องแม่นยำ

ในหนึ่ง module จะมี table นี้แค่เพียง table เดียวเท่านั้น

จากตัวอย่าง code  ของตอนที่ 2 เราสามารถดูข้อมูลของ ModuleDef ได้ด้วย ILDasm และเลือกที่เมนู View แล้วเลือก MetaInfo แล้วเลือก Show! จะได้ดังรูป




ข้อมูลในกรอบสีแดงคือข้อมูลใน table ModuleDef จริงๆ แล้ว metadata จะเก็บข้อมูลในรูปแบบ table แต่ข้อจำกัดในเรื่องการแสดงผลของ ILDasm จึงไม่สามารถแสดงผลในรูปแบบของตารางได้ ILDasm จึงแสดงข้อมูลในตารางทั้งหมดออกมาดังรูปข้างบน

นอกจากนี้เรายังสามารถดู MVID ผ่าน ทาง command ได้ด้วยคำสั่ง

    c:\>ildasm /all /text Program.exe | find /v "// Time-date stamp:" | find /v "// MVID" | find /v "//  Checksum:" > Program.txt


คำสั่งข้างบนจะเป็นการดึงข้อมูลของ header ใน manage file แล้วบันทึกลงใน text file จากตัวอย่าง text file ของเราคือ Program.txt ดังนั้นเราจึงสามารถ compare ข้อมูลใน header file ด้วยคำสั่ง fc ลองดูตัวอย่างวิธีการใช้ตามรูปข้างล่างน่ะครับ



บทความหน้าพบกับ table ที่ 2 ของ Definition table ครับ ซึ่งจะเป็น table อะไรนั้น .... พบกันใหม่บทความหน้าครับ
TuChay

วันพฤหัสบดีที่ 15 ตุลาคม พ.ศ. 2558

Assembly Module : ตอนที่ 4 table ต่างๆ ใน Metadata


execute file ชนิด Managed module จะมี header file ที่มีส่วนสำคัญอยู่ 4 ส่วนดังที่ผมได้เคยอธิบายไปแล้ว หนึ่งใน 4 ส่วนของ header file คือ metadata

Metadata เป็นพื้นที่เล็กๆ ไว้เก็บข้อมูลของ module โดยทำการจัดเก็บในรูปแบบของตาราง (table) โดยสามารถแบ่งออกตารางได้เป็น 3 กลุ่มใหญ่ๆ คือ

Definition tables
table ชนิดนี้จะเก็บข้อมูลของ module นั้นๆ เช่น version, MVID และ Type ชนิดต่างๆ ที่ถูกสร้างขึ้นใน module.

Reference tables
table ชนิดนี้จะเก็บรายละเอียดของ library ที่ module มีการอ้างถึง เช่นรายละเอียดของ System.Console จะถูกเก็บไว้ใน table ส่วนนี้

Manifest tables
table ชนิดนี้แหละครับ เป็นตัวบอกว่า execute file เป็น Assembly Module หรือ Managed module

ในบทความหน้าผมจะอธิบายรายละเอียด tables ที่อยู่ในกลุ่มของ Definition tables ทั้งหมดพร้อมทั้งโชว์ให้ดูว่าเราจะดูข้อมูล tables ของส่วนนี้ได้ที่ไหน

พบกันใหม่บทความหน้าครับ
TuChay

วันพุธที่ 14 ตุลาคม พ.ศ. 2558

Assembly Module : ตอนที่ 3 รู้จักกับ Response File


ก่อนที่จะขึ้นรายละเอียดของ Metadata ผมขออธิบายอีกนิดเกี่ยวกับการ save พารามิเตอร์ในการ compile code ลงใน file

โดยปกติตอนที่เรา compile code ด้วยคำสั่ง csc เราอาจจะต้อง reference หลายๆ library ซึ่งจะต้องใส่ /r กับ library ทุกตัว ดังนั้นคำสั่ง csc จะยาวมาก csc หรือ C# Compiler ได้อนุญาติให้เอาพารามิเตอร์ใส่ไว้ลงใน file โดยเรียก file ชนิดนี้ว่า response file ที่มีนามสกุล .rsp เมื่อ คำสั่ง csc compile code และต้องการใช้พารามิเตอร์ใน response file ก็จะใช้เครื่องหมาย @ นำหน้า response file นั้น

ตัวอย่างของ response file




 เมื่อ csc ทำการ conpile code ก็สามารถทำได้ด้วยคำสั่ง

               csc @MyResponse.rsp program.cs

ที่นี้เราจะลดข้อผิดพลาดในการใส่ พารามิเตอร์ของ csc และเรายังใช้พารามิเตอร์ชุดนี้กับ project อื่นๆ ได้อีกด้วย

C# compiler ยังอนุญาติให้มี response มากว่า 1 file ลองดูตัวอย่างครับ

     csc @MyResponse.rsp @AnotherResponse.rsp program.cs

ในบทความที่แล้วผมได้ยกตัวอย่างการ compile code โดยไม่ใส่พารามิเตอร์อะไรเลยเป็นเพราะว่า C# compiler มีการเรียกใช้ response file ที่เป็น global ชื่อ response file ที่เป็น global นี้จะถูกเก็บไว้ในชื่อ csc.rsp โดยถูกเก็บไว้ที่ %SystemRoot%\Microsoft.NET\Framework\vX.X.X

%SystemRoot% คือ directory ที่เก็บ System ของ Windows โดยส่วนใหญ่คือ c:\Windows
vX.X.X คือ version ของ csc โดยปกติจะเป็น version เดียวกับ .Net Framework เราสามารถเช็ค version ของ csc ได้โดยพิมพ์คำสั่ง csc และ enter ดังรูปตัวอย่างข้างล่างครับ



ในรูปข้างล่างเป็นตัวอย่างเนื้อหาของ file csc.rsp


%SystemRoot%\Microsoft.NET\Framework\vX.X.X นอกจากจะเก็บ global response file แล้วยังเก็บ standard library ที่ชื่อ MSCorLib.dll ด้วย

ถ้าเราไม่ต้องการใช้ response file ตัวที่เป็น global เราก็สามารถใส่พารามิเตอร์ /noconfig นอกจากนั้นเรายังใส่พารามิเตอร์ /looger ให้กับ csc เพื่อที่จะ log ข้อมูลของการ compile code ได้ด้วย แต่พารมิเตอร์ /logger ใช้ได้กับ .Net Framework version 4.5 เป็นต้นไป

Response file ที่ผมอธิบายมาทั้งหมดนี้จะใช้ได้เฉพาะ csc compiler เท่านั้นน่ะครับจะไม่สามารถใช้ได้กับ Visual Studio สำหรับ Visual Studio ผมจะอธิบายอย่างละเอียดในบทความถัดๆ ไปครับ

บทความหน้าผมจะเริ่มอธิบายรายละเอียดของ metadata ที่ทำให้ managed module กลายมาเป็น Assembly module น่ะครับ

พบกันใหม่บทความหน้าครับ
TuChay







วันจันทร์ที่ 12 ตุลาคม พ.ศ. 2558

Assembly Module : ตอนที่ 2 จาก Type สู่ Assembly Module


เราได้เรียนรู้แล้วว่าการเขียนโปรแกรมด้วยภาษาในตระกูลของ ,Net Framework ซึ่งมีกฏของ CTS ระบุไว้ว่าใน 1 program จะต้องมีอย่างน้อย 1 Type หรือ 1 class การแปลงจาก Type มาเป็น assembly module เป็นยังไง เรามาลองดูตัวอย่าง code ง่ายๆ ตาม code ข้างล่างน่ะครับ

using System;

public class Program
{
    public static void Main()
    {
            System.Console.WriteLine("Hello World");
   
    }
}

code ข้างบนให้เขียนด้วยโปรแกรม notepad แล้ว save เป็น file ชื่อ Program.cs ที่ผมให้เขียนด้วยโปรแกรม notepad เพราะในบทความถัดไปผมจะอธิบายเรื่อง .netmodule ซึ่ง VisualStudio ไม่อนุญาติให้ compile code เป็น .netmodule เฉพาะคำสั่ง csc เท่านั้นที่อนุญาติ

จากนั้นเปิดโปรแกรม Command Prompt ของ Visual Studio .Net ตามรูปน่ะครับ





แล้วก็เริ่ม compile code ด้วยคำสั่ง

          csc.exe /out:Program.exe /t:exe /r:MSCorLib.dll Program.cs

คำสั่ง csc.exe เป็นคำสั่งของ C# compiler โดยมีรายละเอียดของพารามิเตอร์ดังต่อไปนี้

 /out:Program.exe (/out = output) เพื่อให้ compiler สร้าง execute file ที่ชื่อ Program.exe

/t:exe (/t = target) โดยปกติ C# compiler แบ่งโปรแกรม execute file ที่ใช้บน Windows ออกเป็น 2 ชนิดได้แก่ GUI (graphisl user interface) และ CUI (Console user interface)
พารามิเตอร์ /t:exe จะเป็นการ compiler ให้ comiple code แล้วสร้าง execute file ในรูปแบบ CUI ( Console user interface)
พารามิเตอร์ /t:winexe  จะเป็นการบอก compiler ให้ compile เป็นแบบ GUI (graphical user interface)
พารามิเตอร์ /t:library จะเป็นการบอก compiler ให้ compile เป็นแบบ library

พารามิเตอร์ /t:exe และ พารามิเตอร์ /t:winexe C# compiler จะสร้าง entry point ลงไปใน CLR Healder ด้วย ดังนั้นตัว code จำเป็นต้องมี function Main อยู่เสมอ

/r:MSCorLib.dll (/r = reference) เนื่องจากใน code มีการใช้ Type System.Console ซึ่งเป็น library มาตรฐานอยู่ใน MSCorLib.dll เราจึงต้องมีการ บอกให้ compiler ทำการ reference Type ภายใน library MSCorLib.dll

เนื่องจาก Type ที่เป็นพื้นฐานต่างๆ เช่น int byte double ต่างเป็น Type ที่อยู่ใน library MSCorLib.dll และทุกๆ โปรแกรมส่วนใหญ่จะมีการใช้ที่บ่อยครั้ง ดังนั้น C# compiler ก็จะอัตโนมัติ reference ไปที่ library นี้ โดยที่ ไม่จำเป็นต้องระบุ /r:MSCorLib.dll ก็ได้

defaul target ของ C# Compiler เป็น CUI รวมทั้ง default output file name ก็เป็นชื่อเดียวกับชื่อ file ของ source code (ในตัวอย่างคือ Program.cs) ดังนั้นเราจึงตัด พารามิเตอร์ /t:exe และ พารามิเตอร์ /out:Program.exe ออกไปได้เช่นกัน

ดังนั้น เมื่อต้องการ compile code ก็สามารถเขียนสั้นๆ ได้เป็น

                   csc.exe Program.cs

สำหรับคำสั่ง csc ยังมี พารามิเตอร์อีกหนึ่งตัวคือ /nostdlib สำหรับกรณีที่เราไม่ต้องการใช้ standard library ของ .Net Framework หมายความเราทำ library ของตัวเองขึ้นมาทั้งหมด ดังนั้นการใช้ /nostdlib เมื่อ compile code ไปแล้วเราจะได้ managed module และยังเป็น Assembly Module ในตัวเดียวกัน

แต่จาก code ตัวอย่างจะเห็นว่า Program.cs ไม่สามารถทำงานได้ด้วยตัวเองยังต้องใช้ standard library ของ .Net Framework  ดังนั้นตัวโครงสร้างของ execute file Program.exe ในส่วนของ metadata (metadata เป็นตัวเก็บข้อมูลของ Type ที่ผมได้อธิบายคร่าวๆ แล้วที่ บทความนี้) จึงเป็นตัวทำให้ Program.exe กลายเป็น Assembly Module

metadata ผมจะอธิบายอย่างละเอียดในบทความถัดไปครับ

พบกันใหม่บทความหน้าครับ
TuChay

วันพฤหัสบดีที่ 1 ตุลาคม พ.ศ. 2558

Assembly Module : ตอนที่ 1 บทนำ


บทความที่ผ่านมาผมได้แนะนำให้รู้จักกับ Managed Module กันมาแล้ว ซึ่งใน Managed module จะมีทั้งหมด 4 ส่วนคือ PE, CLR Header, Metadata และ IL language แต่จริงๆแล้วโปรแกรมที่เราเขียนขึ้นจะทำงานได้ไม่ใช่แค่ Managed module เพราะโปรแกรมจะมีการเรียกใช้ library พื้นฐาน ต่างๆของ .Net framework เช่น int หรือ string ซึ่งเป็น Type ที่อยู่ใน namespace System ของ MSCorelib.dll

การทำงานรวมกันระหว่างโปรแกรมที่เราเขียนและ library อื่นๆ ไม่ว่าจะเป็นของ .Net framework หรือ library ของคนอื่นๆ จะทำงานร่วมกันภายใต้ Assembly module ที่ผมกำลังจะอธิบายต่อจากนี้

เนื่องจากผมจะพยายามอธิบายในเรื่องของหลักการ ดังนั้นตัวอย่างการเขียน code จะเน้นไปที่เขียน code ด้วย notepad และการ compile code ก็จะใช้คำสั่ง csc ผ่าน command เพราะว่า Visual Studio มี option ที่ให้นักพัฒนาสามารถ config compiler ได้โดยที่ไม่ต้องรู้รายละเอียดมากนัก จนทำให้เราขาดความรู้ความเข้าใจอย่างลึกซึ้งเกี่ยวกับ .Net framework ผมหวังว่าบทความต่อไปนี้ผู้อ่านจะเข้าใจหลักการพื้นฐาน ของ .Net framework มากขึ้นครับ

พบกันใหม่บทความหน้าครับ
TuChay