iT邦幫忙

2026 iThome 鐵人賽

DAY 4
0

前輩跟我說,開專案要按 .sln

找到 sln 檔案

我當下其實沒有多想。

反正前輩說按這個,那我就按這個。

結果 Visual Studio 打開後,右邊的方案總管就出現了一大堆資料夾、Project 和檔案。

但我還是忍不住想:

為什麼開專案要點 .sln
它到底做了什麼?

當然又開始問 AI

我先問 AI:

為什麼開 C# 專案要點 .sln

AI 一開始跟我說,.sln 是 Solution 檔案,可以記錄整個方案裡有哪些 Project,以及它們之間的組成關係。

我看完之後,把自己的理解再丟回去問:

所以 .sln 會把相關的 Project 載入到方案總管裡,告訴 Visual Studio 要一起打開哪些 Project,這樣就會開到「整套專案」?
反正就是一個總開關的概念?

然後 AI 再糾正我:

AI 修正我的理解

我的「總開關」比喻不算完全錯,但還是不夠精準。

.sln 比較像是一份:

整套開發方案的清單與組織設定。

它本身不是網站的全部程式碼,也不是把所有程式碼都塞在裡面。

它比較像是在告訴 Visual Studio:

  • 這個 Solution 裡有哪些 Project
  • 這些 Project 放在哪裡
  • 哪些 Project 需要一起載入
  • Solution 目前使用哪些建置設定
  • 某些開發環境相關設定

所以開啟 .sln 後,Visual Studio 才能把整套 Solution 的結構載入方案總管。

菜鳥版理解可以先記成:

.sln 不是整套程式本身,而是整理整套 Solution 的入口。

Solution 和 Project 又差在哪裡?

這裡又出現兩個很容易混在一起的詞:

  • Solution
  • Project

我一開始真的以為它們都只是「專案」的英文。

但在 Visual Studio 裡,它們代表的層級不太一樣。

Project

Project 是一個可以被建置或執行的程式單位。

例如一套系統裡,可能有:

  • 網站 Project
  • API Project
  • 共用程式庫 Project
  • 資料存取 Project
  • 測試 Project

每個 Project 通常會有自己的 .csproj

Solution

Solution 則是把一個或多個 Project 組織在一起的上層容器。

例如:

HospitalSystem.sln
├── HospitalSystem.Web
├── HospitalSystem.Service
├── HospitalSystem.Data
└── HospitalSystem.Tests

這代表同一套系統裡,可能不只有一個網站 Project。

還可能把畫面、商業邏輯、資料存取和測試,拆成不同的 Project。

菜鳥版理解就是:

Solution
└── 裡面可以放很多個 Project

但這裡要注意:

Solution 不等於單一網站。
Project 也不一定都是可以直接啟動的網站。

有些 Project 只是提供其他 Project 使用的程式庫,不會自己跑出一個網頁。

我怎麼確認 .sln 真的載入了整套 Solution?

我沒有只停在 AI 說「它是方案檔」。

我實際做了幾個確認。

第一步:打開 .sln

在檔案總管裡找到 .sln,用 Visual Studio 開啟。

第二步:查看方案總管

打開後,我在方案總管最上層看到 Solution 名稱。

Solution 底下還有一個或多個 Project。

例如:

Solution
├── Web Project
├── Service Project
└── Data Project

這時候就能確認:

.sln 確實把這套方案裡的多個 Project 一起載入了。

第三步:查看啟動專案

我再觀察哪個 Project 是粗體,或到 Solution 上按右鍵查看啟動專案設定。

因為一個 Solution 裡可能有很多 Project,但按下綠色播放鍵時,Visual Studio 還是要知道:

現在到底要啟動哪一個?

所以:

.sln 負責載入整套 Solution
↓
Solution 裡可能有多個 Project
↓
啟動設定決定要執行哪個 Project

這也讓我理解,為什麼有時候按下綠色播放鍵,跑出來的不是自己預期的網站。

不一定是程式壞了。

也有可能只是啟動專案選錯了。

所有 C# 專案都一定要從 .sln 開嗎?

原本我差點直接記成:

C# 專案就是一定要開 .sln

但這個說法也不完全正確。

Visual Studio 也可以開啟:

  • 單一 .csproj
  • 某個程式碼資料夾
  • Git Repository
  • 已經存在的 Solution

只是以我目前公司的企業專案來說,前輩會叫我開 .sln,是因為這套系統包含多個相關 Project。

如果只開其中一個 .csproj,可能看不到其他相關的 Project,部分專案參考或啟動設定也可能和開啟完整 Solution 時不同。

所以比較精準的說法應該是:

目前公司的 C# 專案,通常從 .sln 開啟,才能一次載入這套系統所需要的多個 Project。

不是所有情境都只能按 .sln

而是這樣比較符合目前專案的組織方式。

.sln 裡面到底放了什麼?

我原本以為 .sln 裡面會有很多 C# 程式碼。

後來用文字編輯器打開看了一下,發現裡面主要記錄的不是網站功能,而是一些 Solution 組成資訊。

內容大概會包含:

  • Project 名稱
  • Project 檔案路徑
  • Project 的識別碼
  • Debug、Release 等組態
  • 不同 Project 對應的建置設定

簡化後的概念大概像:

這個 Solution 裡有 Web Project
位置在某個資料夾

這個 Solution 裡有 Service Project
位置在另一個資料夾

目前有 Debug 和 Release 組態

所以 .sln 比較像索引和管理清單。

真正的 C# 程式碼,仍然放在各個 .cs.cshtml 等檔案裡。

總之,目前公司的 C# 專案就是先找 .sln

以前使用 VS Code 時,我通常會:

打開專案資料夾
↓
查看裡面的檔案
↓
開啟 Terminal
↓
輸入指令啟動專案

現在使用 Visual Studio 開公司的 C# 方案時,則通常是:

找到 .sln
↓
用 Visual Studio 開啟
↓
方案總管載入相關 Project
↓
確認啟動專案
↓
按綠色播放鍵

也算是挺方便的啦~

只是第一次看到時,根本不知道自己點下去的到底是什麼 XD

順便認識幾個陌生的副檔名

打開 C# 專案後,除了 .sln,我還看到一堆陌生的副檔名:

  • .csproj
  • .cs
  • .cshtml
  • .dll
  • .pdb
  • .resx

當然又順便全部問了一輪。

副檔名 菜鳥版理解
.sln 用來組織一個或多個 Project 的 Solution 檔案
.csproj 單一 C# Project 的專案設定檔
.cs C# 原始程式碼檔案
.cshtml Razor View 檔案,可以混合 HTML、Razor 語法和 C#
.dll 編譯後產生的程式庫,通常是被其他程式引用,不是直接打開修改
.pdb 提供 Debug 使用的符號與偵錯資訊
.resx 資源檔,可能保存文字、圖片或多國語系內容

.csproj 是什麼?

如果 .sln 是管理整套 Solution,那 .csproj 就是管理單一 Project。

它可能記錄:

  • 使用哪個 .NET 版本
  • 這個 Project 參考了哪些套件
  • 參考了哪些其他 Project
  • 建置時需要哪些設定
  • 有哪些檔案要被包含或處理

菜鳥版先理解成:

.sln 管理一群 Project,.csproj 管理其中一個 Project。

例如:

CompanySystem.sln
├── CompanySystem.Web.csproj
├── CompanySystem.Service.csproj
└── CompanySystem.Data.csproj

.dll 為什麼通常不能直接改?

.dll 通常是程式經過編譯後產生的檔案。

它裡面不是平常直接撰寫的 C# 原始碼格式,所以一般不會像 .cs 一樣直接打開修改。

如果需要修改功能,通常要找到產生這個 .dll 的原始專案,修改 .cs 程式碼後重新建置。

流程可以先理解成:

撰寫 .cs 程式碼
↓
建置或編譯
↓
產生 .dll
↓
其他 Project 或程式引用這個 .dll

這也讓我第一次有感覺到:

我在方案總管裡看到的東西,不一定全部都是拿來直接修改的原始碼。

.cshtml 是不是把 .cs.html 接在一起?

我看到 .cshtml 時,第一個反應是:

這東西去掉 cs,不就很像 HTML?
所以它是 C# 加 HTML 的概念嗎?

這個方向有碰到一點邊,但不能只用副檔名拆字來理解。

.cshtml 是 ASP.NET Core MVC 常見的 Razor View 檔案。

裡面可以寫一般 HTML:

<h1>首頁</h1>

也可以使用 Razor 語法插入 C# 資料:

<h1>@Model.Title</h1>

或者加入條件判斷:

@if (Model.IsLogin)
{
    <p>歡迎回來</p>
}

最後伺服器會處理 Razor 和 C#,再把產生的 HTML 回傳給瀏覽器。

所以流程比較像:

.cshtml 裡有 HTML、Razor 和 C#
↓
伺服器處理
↓
產生 HTML
↓
瀏覽器顯示畫面

菜鳥版可以先理解成:

.cshtml 是可以讓 HTML 搭配 C# 資料產生畫面的 View 檔案。

但不是單純把 .cs.html 兩個副檔名黏在一起而已。

AI 在這篇幫了我什麼?

這次我沒有只問:

.sln 是什麼?

而是一直把自己的理解丟回去確認。

例如:

它是不是整套專案的總開關?
Solution 和 Project 是不是同一個東西?
.sln 後,為什麼會出現很多 Project?
.csproj.sln 的功能差在哪裡?
所有 C# 專案都一定要按 .sln 嗎?

這樣一來一回後,我才慢慢把原本模糊的理解修正成:

.sln
負責組織整套 Solution
↓
Solution 裡可以包含多個 Project
↓
每個 Project 通常有自己的 .csproj
↓
Project 裡才放實際的 .cs、.cshtml 等檔案

不過我還是回到 Visual Studio 裡確認:

  • 方案總管是否真的出現多個 Project
  • 哪個 Project 是啟動專案
  • 每個 Project 底下是否有自己的 .csproj
  • .sln.csproj 裡記錄的內容是否不同

AI 幫我建立初步理解。

真正讓這些名詞連起來的,還是實際查看公司的 Solution 結構。

菜鳥最後先記住什麼?

目前我先記得這個層級:

Solution
│
├── Project A
│   ├── .csproj
│   ├── .cs
│   └── .cshtml
│
├── Project B
│   ├── .csproj
│   └── .cs
│
└── Project C
    ├── .csproj
    └── .cs

以及:

.sln 是整套 Solution 的組織入口。
.csproj 是單一 Project 的設定檔。
.cs 是 C# 程式碼。
.cshtml 是 Razor View 畫面檔案。

結果才剛搞懂一點點,前輩又問我:

妳知道 MVC 架構嗎?

我當下又只能:

蛤……

於是下一篇,只好繼續學習了 XD

下一篇:

MVC 到底是什麼?為什麼專案要拆成 Model、View、Controller?


上一篇
Day 3|Visual Studio 按鈕也太多了吧!新手先認識真的會用到的功能
下一篇
Day 5|前輩問我知道MVC嗎,我回:蛤?
系列文
學過一點 React,卻被撈進 C#:新手用 AI 硬啃 MVC 企業專案的 3 個月實錄5
圖片
  熱門推薦
圖片
{{ item.channelVendor }} | {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

1 則留言

0
ksz54213
iT邦新手 1 級 ‧ 2026-08-04 12:02:24

FYI, 因為 sln 裡面記錄的皆是類似於 UUID 難以維護的字串,在工作上難免會遇到一些 commit 衝突,一個弄不好就有可能導致 file not found 的慘況。

但在 .NET 10 後,推出了 slnx。不同於 sln,slnx 使用了明文路徑的方式進行記錄,大幅降低 sln 原先的痛點哈。

Abbie iT邦新手 5 級 ‧ 2026-08-04 15:48:44 檢舉

挖喔!!原來如此!!感謝前輩補充><!!! 又喜得一個新知!!
筆記多補充一筆: .sln.slnx 的差異~~~

我要留言

立即登入留言