เมื่อเขียนโค้ด C# แล้ว Build หรือ Run Solution จะสร้างโฟลเดอร์ 2 ตัวคือ bin และ obj ทั้งคู่เก็บ Compiled Code แต่หน้าที่ต่างกัน
ทำไมต้องมี 2 โฟลเดอร์?
กระบวนการ Compile ผ่าน 2 ขั้นตอน:
- Compiling: คอมไพล์แต่ละไฟล์เป็น Unit แยกต่างหาก → เก็บใน obj
- Linking: รวม Units ทั้งหมดเป็น DLL หรือ EXE เดียว → เก็บใน bin
รายละเอียดแต่ละโฟลเดอร์
obj (Intermediate Output)
- เก็บไฟล์ Compile ระหว่างทาง (Intermediate files)
- แต่ละ Project มี obj ของตัวเอง
- ใช้สำหรับ Incremental Compilation - Compile เฉพาะไฟล์ที่เปลี่ยนแปลง
- ตัวอย่าง: โปรเจกต์ใหญ่หลายไฟล์ แก้ไขแค่ 1 ไฟล์ → Compile แค่ไฟล์นั้น → obj เก็บข้อมูลนี้
bin (Final Output)
- เก็บ Assembly ตัวจริง (.dll หรือ .exe) พร้อม Dependencies
- เป็น Output สุดท้ายที่ Deploy/Run ได้
- มี Subfolder:
Debug\net6.0\,Release\net6.0\ตาม Framework และ Config
สรุปความแตกต่าง
| คุณสมบัติ | obj | bin |
|---|---|---|
| ขั้นตอน | Compiling (ระหว่างทาง) | Linking (ผลลัพธ์สุดท้าย) |
| เนื้อหา | Object files, Temp files | DLL/EXE, Dependencies |
| Incremental Build | สำคัญมาก | ไม่เกี่ยวข้อง |
| Deploy | ไม่ต้อง Deploy | Deploy โฟลเดอร์นี้ |
เคล็ดลับ
- ลบ
binและobjแล้ว Build ใหม่ (Clean Build) แก้ปัญหา Cache เก่าได้ dotnet cleanลบทั้งคู่ให้อัตโนมัติ