dotnet new membuat kerangka yang tampak kecil, tetapi setiap bagian di dalamnya punya peran tertentu. Memahami struktur project membuat kita tidak bingung saat membaca galat build, mengatur folder output, atau mengelola banyak project sekaligus. Bab ini membedah folder HaloApp yang kita buat pada bab sebelumnya.

Peta Folder HaloApp #

text
HaloApp/
├── Program.cs
├── HaloApp.csproj
├── bin/
│   └── Debug/
│       └── net9.0/
└── obj/

Peran setiap item:

ItemPeran
Program.csKode sumber berisi entry point program
HaloApp.csprojFile definisi project berformat XML
bin/Hasil akhir build, berupa assembly siap dijalankan
obj/File-file intermediate hasil proses build
*.slnSolution yang mengelompokkan beberapa project

Anatomi File .csproj #

Berikut isi HaloApp.csproj yang dibuat template:

xml
<Project Sdk="Microsoft.NET.Sdk">

  <PropertyGroup>
    <OutputType>Exe</OutputType>
    <TargetFramework>net9.0</TargetFramework>
    <ImplicitUsings>enable</ImplicitUsings>
    <Nullable>enable</Nullable>
  </PropertyGroup>

</Project>

Kita bedah baris demi baris:

  1. <Project Sdk="Microsoft.NET.Sdk"> — atribut Sdk mengimpor sekumpulan aturan build dan nilai default bawaan .NET, sehingga file ini tetap pendek.
  2. <OutputType>Exe</OutputType> — Exe menandakan hasil build berupa program yang dapat dieksekusi, bukan pustaka (Library).
  3. <TargetFramework>net9.0</TargetFramework> — project menargetkan .NET 9. Versi ini harus didukung SDK yang terpasang.
  4. <ImplicitUsings>enable</ImplicitUsings> — compiler menambahkan beberapa directive using yang umum secara otomatis, misalnya System.
  5. <Nullable>enable</Nullable> — pemeriksaan nullable reference type aktif; compiler memberi peringatan bila variabel referensi dipakai tanpa memastikan nilainya bukan null.

Folder obj: Ruang Kerja Intermediate #

Folder obj/ menyimpan file antara sebelum hasil akhir ditulis ke bin/. Isi folder obj/ setelah restore dan build pertama:

text
Debug
HaloApp.csproj.nuget.dgspec.json
HaloApp.csproj.nuget.g.props
HaloApp.csproj.nuget.g.targets
project.assets.json
project.nuget.cache

File project.assets.json adalah peta dependensi hasil restore NuGet; file *.cache menyimpan status build agar kompilasi berikutnya lebih cepat. MSBuild menulis dan membaca folder ini tanpa campur tangan kita.

Folder bin: Hasil Akhir Build #

Folder bin/Debug/net9.0/ memuat assembly hasil kompilasi:

text
HaloApp
HaloApp.deps.json
HaloApp.dll
HaloApp.pdb
HaloApp.runtimeconfig.json
FileIsi
HaloApp.dllAssembly berisi IL (Intermediate Language) hasil kompilasi
HaloAppApphost, executable kecil peluncur yang memanggil runtime
HaloApp.runtimeconfig.jsonVersi runtime yang dibutuhkan saat program dijalankan
HaloApp.deps.jsonDaftar dependensi program
HaloApp.pdbSymbol debug untuk menampilkan nama baris saat debugging

Folder bin/ dan obj/ seluruhnya dihasilkan otomatis, sehingga kita dapat menghapus keduanya kapan saja; build berikutnya membuat ulang seluruh isinya. Langkah ini justru solusi klasik ketika build berperilaku aneh — hapus bin/ dan obj/, lalu jalankan dotnet build dari awal.

Solution untuk Banyak Project #

Bila program tumbuh menjadi beberapa project, file .sln mengelompokkan semuanya dalam satu wadah. Visual Studio membuat .sln secara otomatis setiap project baru dibuat dari IDE. Dari terminal, kita membuat solution dengan dua perintah:

bash
dotnet new sln -n BelajarCSharp
dotnet sln BelajarCSharp.sln add HaloApp/HaloApp.csproj

Perintah pertama membuat solution kosong bernama BelajarCSharp; perintah kedua mendaftarkan project HaloApp ke dalamnya. VS Code dengan C# Dev Kit juga membaca file .sln dan menampilkan seluruh project di Solution Explorer.