File solusi (.sln)

Solusi adalah struktur untuk mengatur proyek di Visual Studio. Solusi ini mempertahankan informasi status untuk proyek dalam dua file:

  • .sln file (berbasis teks, dibagikan)

  • .suo file (biner, opsi solusi khusus pengguna)

Untuk informasi selengkapnya tentang file .suo, lihat File Opsi Pengguna Solusi (.suo).

Jika VSPackage Anda dimuat karena direferensikan dalam .sln file, lingkungan akan memanggil ReadSolutionProps untuk membaca dalam .sln file.

File .sln berisi informasi berbasis teks yang digunakan lingkungan untuk menemukan dan memuat parameter nilai nama untuk data yang dipertahankan dan proyek VSPackages yang dirujuknya. Ketika pengguna membuka solusi, lingkungan menelusuri preSolutioninformasi , , Projectdan postSolution dalam .sln file untuk memuat solusi, proyek dalam solusi, dan informasi tetap apa pun yang melekat pada solusi.

Setiap file proyek berisi informasi tambahan yang dibaca oleh lingkungan untuk mengisi hierarki dengan item proyek tersebut. Persistensi data hierarki dikendalikan oleh proyek. Data biasanya tidak disimpan dalam .sln file, meskipun Anda sengaja dapat menulis informasi proyek ke .sln file jika Anda memilih untuk melakukannya. Untuk informasi selengkapnya tentang persistensi, lihat Persistensi Proyek dan Membuka dan Menyimpan Item Proyek.

Header file

Header .sln file terlihat seperti ini:

Microsoft Visual Studio Solution File, Format Version 12.00
# Visual Studio Version 17
VisualStudioVersion = 17.2.32505.173
MinimumVisualStudioVersion = 10.0.40219.1

Definisi

Microsoft Visual Studio Solution File, Format Version 12.00
Header standar yang menentukan versi format file.

# Visual Studio Version 17
Versi utama Visual Studio yang (terbaru) menyimpan file solusi ini. Informasi ini mengontrol nomor versi di ikon solusi.

VisualStudioVersion = 17.2.32505.173
Versi lengkap Visual Studio yang (terbaru) menyimpan file solusi. Jika file solusi disimpan oleh versi Visual Studio yang lebih baru yang memiliki versi utama yang sama. Nilai ini tidak diperbarui sehingga mengurangi churn dalam file.

MinimumVisualStudioVersion = 10.0.40219.1
Versi minimum (terlama) Visual Studio yang dapat membuka file solusi ini.

Isi file

Isi .sln file terdiri dari beberapa bagian berlabel GlobalSection, seperti ini:

Project("{F184B08F-C81C-45F6-A57F-5ABD9991F28F}") = "Project1", "Project1.vbproj", "{8CDD8387-B905-44A8-B5D5-07BB50E05BEA}"
EndProject
Global
  GlobalSection(SolutionNotes) = postSolution
  EndGlobalSection
  GlobalSection(SolutionConfiguration) = preSolution
       ConfigName.0 = Debug
       ConfigName.1 = Release
  EndGlobalSection
  GlobalSection(ProjectDependencies) = postSolution
  EndGlobalSection
  GlobalSection(ProjectConfiguration) = postSolution
   {8CDD8387-B905-44A8-B5D5-07BB50E05BEA}.Debug.ActiveCfg = Debug|x86
   {8CDD8387-B905-44A8-B5D5-07BB50E05BEA}.Debug.Build.0 = Debug|x86
   {8CDD8387-B905-44A8-B5D5-07BB50E05BEA}.Release.ActiveCfg = Release|x86
   {8CDD8387-B905-44A8-B5D5-07BB50E05BEA}.Release.Build.0 = Release|x86
  EndGlobalSection
  GlobalSection(ExtensibilityGlobals) = postSolution
  EndGlobalSection
  GlobalSection(ExtensibilityAddIns) = postSolution
  EndGlobalSection
EndGlobal

Untuk memuat solusi, lingkungan melakukan urutan tugas berikut:

  1. Lingkungan membaca bagian Global dari .sln file dan memproses semua bagian yang ditandai preSolution. Dalam contoh file ini, ada satu pernyataan seperti itu:

    GlobalSection(SolutionConfiguration) = preSolution
         ConfigName.0 = Debug
         ConfigName.1 = Release
    

    Ketika lingkungan membaca GlobalSection('name') tag, lingkungan memetakan nama ke VSPackage menggunakan registri. Nama kunci harus ada di registri di bawah [HKLM\\<Application ID Registry Root\>\SolutionPersistence\AggregateGUIDs]. Nilai default kunci adalah GUID Paket (REG_SZ) dari VSPackage yang menulis entri.

  2. Lingkungan memuat VSPackage, memanggil QueryInterface VSPackage untuk IVsPersistSolutionProps antarmuka, dan memanggil ReadSolutionProps metode dengan data di bagian sehingga VSPackage dapat menyimpan data. Lingkungan mengulangi proses ini untuk setiap preSolution bagian.

  3. Lingkungan melakukan iterasi melalui blok persistensi proyek. Dalam hal ini, ada satu proyek.

    Project("{F184B08F-C81C-45F6-A57F-5ABD9991F28F}") = "Project1",
    "Project1.vbproj", "{8CDD8387-B905-44A8-B5D5-07BB50E05BEA}"
    EndProject
    

    Pernyataan ini berisi GUID proyek unik dan jenis proyek GUID. Informasi ini digunakan oleh lingkungan untuk menemukan file proyek atau file milik solusi, dan VSPackage yang diperlukan untuk setiap proyek. GUID proyek diteruskan ke IVsProjectFactory untuk memuat VSPackage tertentu yang terkait dengan proyek, lalu proyek dimuat oleh VSPackage. Dalam hal ini, VSPackage yang dimuat untuk proyek ini adalah Visual Basic.

    Setiap proyek dapat mempertahankan ID instans proyek yang unik sehingga dapat diakses sesuai kebutuhan oleh proyek lain dalam solusi. Idealnya, jika solusi dan proyek berada di bawah kontrol kode sumber, jalur ke proyek harus relatif terhadap jalur solusi. Ketika solusi pertama kali dimuat, file proyek tidak dapat berada di komputer pengguna. Dengan memiliki file proyek yang disimpan di server relatif terhadap file solusi, lebih mudah untuk file proyek ditemukan dan disalin ke komputer pengguna. Kemudian menyalin dan memuat sisa file yang diperlukan untuk proyek.

  4. Berdasarkan informasi yang terkandung di bagian .sln proyek file, lingkungan memuat setiap file proyek. Proyek itu sendiri kemudian bertanggung jawab untuk mengisi hierarki proyek dan memuat proyek berlapis apa pun.

  5. Setelah semua bagian file diproses .sln , solusi ditampilkan di Penjelajah Solusi dan siap untuk modifikasi oleh pengguna.

Jika ada proyek dalam solusi yang mengimplementasikan VSPackage gagal dimuat, OnProjectLoadFailure metode ini dipanggil dan semua proyek dalam solusi mengabaikan perubahan yang mungkin telah dilakukan selama pemuatan. Untuk kesalahan penguraian apa pun, sebanyak mungkin informasi dipertahankan dengan file solusi. Lingkungan menampilkan kotak dialog yang memperingatkan pengguna bahwa solusi rusak.

Ketika solusi disimpan atau ditutup, QuerySaveSolutionProps metode dipanggil. Ini diteruskan ke hierarki untuk melihat apakah perubahan telah dilakukan pada solusi yang perlu dimasukkan ke .sln dalam file. Nilai null, diteruskan ke QuerySaveSolutionProps dalam VSQUERYSAVESLNPROPS, menunjukkan bahwa informasi sedang dipertahankan untuk solusi. Jika nilainya tidak null, informasi yang dipertahankan adalah untuk proyek tertentu, yang ditentukan oleh penunjuk ke IVsHierarchy antarmuka.

Jika ada informasi yang akan disimpan, antarmuka dipanggil IVsSolutionPersistence dengan penunjuk ke SaveSolutionProps metode . Metode WriteSolutionProps ini kemudian dipanggil oleh lingkungan untuk mengambil pasangan nama-nilai dari IPropertyBag antarmuka dan menulis informasi ke .sln file.

SaveSolutionProps dan WriteSolutionProps objek dipanggil secara rekursif oleh lingkungan untuk mengambil informasi yang akan disimpan dari IPropertyBag antarmuka sampai semua perubahan dimasukkan ke .sln dalam file. Dengan cara ini, Anda dapat memastikan bahwa informasi akan bertahan dengan solusi dan tersedia lain kali solusi dibuka.

Setiap VSPackage yang dimuat dijumlahkan untuk melihat apakah ada yang perlu disimpan ke .sln file. Ini hanya pada waktu pemuatan bahwa kunci registri dikueri. Lingkungan tahu tentang semua paket yang dimuat karena berada dalam memori pada saat solusi disimpan.

Hanya file yang .sln berisi entri di bagian preSolution dan postSolution . Tidak ada bagian serupa dalam file .suo karena solusi membutuhkan informasi ini untuk dimuat dengan benar. File .suo berisi opsi khusus pengguna seperti catatan privat yang tidak dimaksudkan untuk dibagikan atau ditempatkan di bawah kontrol kode sumber.