หมวดหมู่: C# Programming

C#: build .exe with versionC#: build .exe with version

ในการพัฒนาซอฟต์แวร์ด้วย C# การจัดการเวอร์ชัน (Versioning) ของไฟล์ที่ Build ออกมาเป็นสิ่งสำคัญอย่างยิ่ง โดยเฉพาะเมื่อทีมงานต้องทำการทดสอบ (Testing) ในสภาพแวดล้อมที่แตกต่างกัน การต้องคอยเปลี่ยนชื่อไฟล์ `.exe` ด้วยการเพิ่มหมายเลขเวอร์ชันด้วยมือถือเป็นงานที่น่าเบื่อและเสี่ยงต่อความผิดพลาดสูง

บทความนี้จะแนะนำวิธีการใช้คุณสมบัติของ MSBuild (Microsoft Build Engine) เพื่อให้ระบบสามารถสร้างไฟล์ `.exe` พร้อมแนบหมายเลขเวอร์ชันของ Assembly โดยอัตโนมัติในขั้นตอน Post-Build Event ซึ่งช่วยเพิ่มประสิทธิภาพและความน่าเชื่อถือให้กับกระบวนการ Build ของคุณ

⚙️ หลักการทำงาน: การใช้ MSBuild Targets

หัวใจของการแก้ปัญหานี้คือการเพิ่ม Custom Targets เข้าไปในไฟล์โปรเจกต์ (`.csproj`) โดยเราจะใช้ Target ที่ทำงานหลังจากการ Build หลักเสร็จสิ้น (PostBuild) เพื่อดึงข้อมูลเวอร์ชันของ Assembly ที่ถูกสร้างขึ้นมา แล้วใช้คำสั่งระบบปฏิบัติการ (เช่น `copy` ใน Windows) เพื่อคัดลอกไฟล์และเปลี่ยนชื่อให้มีเวอร์ชันกำกับ

🛠️ ขั้นตอนการติดตั้ง Code

  1. เปิดไฟล์ .csproj ของโปรเจกต์ที่ต้องการแก้ไข
  2. เพิ่มบล็อกโค้ด XML ของ Target เข้าไปในส่วนท้ายของไฟล์ (ก่อนแท็ก )

โค้ดตัวอย่างที่สมบูรณ์สำหรับการเพิ่ม Versioning:

XML

<Target Name="GetAssemblyVersion" AfterTargets="Build">
    <GetAssemblyIdentity AssemblyFiles="$(TargetPath)">
      <Output TaskParameter="Assemblies" ItemName="MyAssemblyIdentities" />
    </GetAssemblyIdentity>
    <Message Text="[INFO] Assembly Version Detected: %(MyAssemblyIdentities.Version)" />
  </Target>
  <Target Name="PostBuild" AfterTargets="GetAssemblyVersion">
    <Exec Command="copy /Y "$(ProjectDir)$(OutDir)$(TargetName).exe" "$(ProjectDir)$(OutDir)$(TargetName) v.%(MyAssemblyIdentities.Version)_$(ConfigurationName).exe" />
  </Target>
</Project>

💡 คำอธิบายโค้ด (Technical Deep Dive)

  • GetAssemblyIdentity: Target นี้ทำหน้าที่ค้นหาข้อมูลตัวตนของ Assembly ที่ถูกสร้างขึ้นมา โดยดึงค่าเวอร์ชัน (Version) ออกมาเก็บไว้ในตัวแปร MyAssemblyIdentities
  • PostBuild: Target นี้จะทำงานหลังจาก GetAssemblyVersion เสร็จสิ้น มันใช้คำสั่ง Exec เพื่อรันคำสั่ง Command Line (ในที่นี้คือ copy)
  • copy /Y ...: คำสั่งนี้จะคัดลอกไฟล์ .exe เดิม และเปลี่ยนชื่อไฟล์ปลายทางให้เป็น [ชื่อโปรแกรม] v.[เวอร์ชัน]_[Configuration].exe โดยใช้ตัวแปร %(MyAssemblyIdentities.Version) ที่เราดึงมาได้

✅ สรุปและข้อควรระวัง (Conclusion)

การใช้ MSBuild Targets ในลักษณะนี้เป็นวิธีที่ทรงพลังในการทำให้กระบวนการ Build เป็นไปโดยอัตโนมัติ (Automation) ทำให้มั่นใจได้ว่าทุกครั้งที่ Build ระบบจะสร้างไฟล์ที่ระบุเวอร์ชันอย่างถูกต้องโดยไม่ต้องมีการแทรกแซงด้วยมือ

ข้อควรระวังคือ หากคุณเปลี่ยนชื่อไฟล์ในโค้ดนี้ ต้องแน่ใจว่าพาธ (Path) ของไฟล์ต้นฉบับและปลายทางถูกต้องตามโครงสร้างโปรเจกต์ของคุณเสมอ