Assembly #2: Create your own Assembly

    บทนี้เรามาสร้าง Assembly ใช้เองกัน การสร้าง Assembly นั้นไม่ใช่เรื่องยากเลย เราสามารถใช้ csc.exe ซึ่งเป็นตัวคอมไพเลอร์ของภาษา C# นั่นเอง มาเป็นตัวสร้าง Assembly หรือมิฉะนั้น เราใช้ al.exe ซึ่งเป็นโปรแกรมที่ออกแบบมาเพื่อจัดการ Assembly โดยเฉพาะ (ถ้าคุณคุ้นเคยกับ Borland มันก็เทียบได้ กับ tlib.exe หรือ lib.exe ถ้าเป็น Microsoft)

    เรามาลองดูให้ละเอียดขึ้นอีก เราจะรู้ว่า Assembly 1 ตัว นั้นจะประกอบด้วย Module หลาย Module โดยที่ Module แต่ละ Module จะเก็บ Class ที่คอมไพล์แล้วนั่นเอง    มีจุดหนึ่งที่เราควรมาคุยกันก่อน คือ Assembly ใน .NET Framework นั้นแตกต่างจาก Library ของระบบอื่นๆ ตรงที่ ระบบทั่วไปนั้น Library ถือว่าเป็นแฟ้มข้อมูลแฟ้มเดียว แต่สำหรับ Assembly แล้ว 1 Assembly สามารถประกอบขึ้นจากแฟ้มข้อมูลหลายตัวครับ

   คุณอาจสงสัยว่า ถ้า Assembly ถูกสร้างขึ้นมาจาก Module เพียง Module เดียว แบบนี้ Assembly และ Module มันก็ไม่มีอะไรแตกต่างกันเลยสิ ไม่ใช่นะครับ Assembly นอกจากประกอบขึ้นจาก Module แล้ว มันยังมีส่วนที่เรียกว่า Manifest เพื่อแสดงให้เห็นว่าแต่ละ Module ประกอบด้วย Interface อะไรบ้าง

    เรามาเริ่มกันเลยดีกว่า สมมุติว่าคุณมี Library ตัวหนึ่ง ดังนี้

 

mylib.cs

using System;
namespace MyLib
{
	public class MyLib1
	{
		public void Plan()
		{
			Console.WriteLine("Plan");
		}
	
		public void Do()
		{
			Console.WriteLine("Do");
		}
	}
	internal class MyLib2
	{
		public void P1()
		{
			Console.WriteLine("P1");
		}
		
		public void P2()
		{
			Console.WriteLine("P2");
		}
	}
}

 มี keyword ตัวหนึ่งใน code นี้ ที่ผมไม่เคยพูดถึงในที่ใดมาก่อน นั่นคือ internal ครับ มันเป็นสถานะที่ 3 นอกเหนือจาก private และ public มันอยู่ระหว่าง private และ public นั่นเอง คือมัน public เฉพาะ class ที่อยู่ใน Assembly เดียวกัน และมองเป็น private ได้ ถ้ามองจากภายนอก

ดังนั้น MyLib2 นี้ ภายนอกเรียกใช้ไม่ได้ ผมสร้าง MyLib2 เพื่อเป็นสื่อในการอธิบาย internal เท่านั้นเองครับ

 

    สมมุติว่าคุณอยากสร้างเป็น Assembly คุณสามารถทำได้โดย ใช้ csc.exe ดังนี้

DOS Prompt


C:\cs>csc /t:library mylib.cs
Microsoft (R) Visual C# Compiler Version 7.00.9254 [CLR version v1.0.2914]
Copyright (C) Microsoft Corp 2000-2001. All rights reserved.

C:\cs>dir mylib.*

Volume in drive C is NEMO
Volume Serial Number is 323F-110C
Directory of C:\cs

MYLIB CS          338 08-15-01 8:43p mylib.cs
MYLIB DLL    3,072 08-15-01 9:09p mylib.dll
2 file(s) 3,410 bytes
0 dir(s) 1,220,833,280 bytes free

C:\cs> _

 

หรือคุณใช้ al.exe คุณต้องใช้ csc.exe เพื่อคอมไพล์เป็น module ก่อน เพราะ al.exe ไม่สามารถคอมไพล์ Source Code ภาษา C# ได้โดยตรง ดังนี้ครับ

DOS Prompt

C:\cs>csc /t:module mylib.cs
Microsoft (R) Visual C# Compiler Version 7.00.9254 [CLR version v1.0.2914]
Copyright (C) Microsoft Corp 2000-2001. All rights reserved.


C:\cs>dir mylib.*

Volume in drive C is NEMO
Volume Serial Number is 323F-110C
Directory of C:\cs

MYLIB      CS      338 08-15-01 8:43p mylib.cs
MYLIB~1 NET 2,048 08-15-01 10:05p mylib.netmodule
2 file(s) 2,386 bytes
0 dir(s) 1,220,800,512 bytes free

C:\cs>al /t:library /out:mylib.dll mylib.netmodule
Microsoft (R) Assembly Linker Version 7.00.9254 [CLR version v1.0.2914]
Copyright (C) Microsoft Corp 2000-2001. All rights reserved.


C:\cs>dir mylib.*

Volume in drive C is NEMO
Volume Serial Number is 323F-110C
Directory of C:\cs

MYLIB CS           338 08-15-01 8:43p mylib.cs
MYLIB~1 NET 2,048 08-15-01 10:05p mylib.netmodule
MYLIB DLL      3,072 08-15-01 10:07p mylib.dll
3 file(s) 5,458 bytes
0 dir(s) 1,220,792,320 bytes free

C:\cs> _

เรามาลองดู Code ตัวเรียกกัน

start.cs

using System;
class Start
{
	public static void Main()
	{
		MyLib.MyLib1 x = new MyLib.MyLib1();
		x.Plan();
	}
}

ถ้าคุณอยากใช้ using MyLib; ก็ไม่ผิดกติกาแต่อย่างใด

เวลาคอมไพล์ใช้อย่างนี้ครับ

DOS Prompt

C:\cs>csc /r:mylib.dll start.cs
Microsoft (R) Visual C# Compiler Version 7.00.9254 [CLR version v1.0.2914]
Copyright (C) Microsoft Corp 2000-2001. All rights reserved.


C:\cs>start
Plan

C:\cs>