# 在 .NET 專案引用動態連結程式庫(DLL)的正確方式 [](https://hackmd.io/t_Qpt9pJS8mw_XmDzT_NCg) ## 如何使用別人寫得DLL檔案 一般不建議直接引用別人寫得DLL檔案,因為 C# 有 NuGet Server,現今大部分的免費套件在上面都能找得到,如果是公司內部的 Library,也可以請技術顧問架一個限內網連線的 NuGet Server,然後讓人將撰寫後的 Library 包成 NuGet 檔案放上去,需要引用的人在自己的 Visual Studio 增加這個 NuGet Server 連結即可使用,至於為何要使用 NuGet 下載套件,而非直接引用 DLL 檔案? * NuGet 升降版方便。 * DLL 檔案有 Framework 的相容性問題,現在NuGet上的套件,很多都有做多 Framework 版本,當你從 NuGet 下載時,NuGet 會依照你專案的 Framework 找最適合的版本來安裝,不過也就是說專案 Framework 版本變更時,需要在套件管理員打指令把引用的套件重新安裝,並手動重新修改被還原的設定檔。 * 套件與套件間有相依性問題,NuGet 在安裝時,會幫你把與要安裝套件所相依的其他套件也一起安裝。 ## 以 NuGet 的作法來說明正確 DLL 檔案的引用 當從 NuGet 安裝套件時,會在方案底下產生一個「packages」的資料夾,裡面會存放著剛剛安裝套件的 DLL 檔案,開啟專案檔(.csproj)會發現引用的 DLL 來源都是存放在「packages」底下。  也就是說要正確引用方式如下: 1. 在方案底下(如果方案不是版控根目錄層,也可以再往上放),開啟一個資料夾,名稱建議不要叫packages,免得弄混。 2. 將要引用的 DLL 檔案放置此資料夾底下,各專案加入參考時,皆引用這個資料夾底下的 DLL 檔案。 3. 此資料夾必須要上版控,「packages」不用上版控是因為 NuGet 可以設定從 NuGet Server 來還原「packages」底下的 DLL。 ## 直接引用別人寫的 DLL 檔案需注意事項 * 新手常犯的錯誤引用方式 1. 專案的「bin」資料夾為編譯後的輸出目錄,正常來說是不上版控的,如果有正確的引用 DLL 檔案的話,當「bin」底下無此 DLL 檔案,專案編譯時,是可以重新將 DLL 檔案從來源處複製到「bin」底下,但當你把 DLL 檔案放置在「bin」底下來引用時,專案檔(.csproj)所記錄的 DLL 檔案來源也是在「bin」底下,當你把「bin」底下的 DLL 檔案刪除再重新建置時,就會因為來源 DLL 檔案不存在而無法複製到「bin」底下。  2. 無法針對同方案底下的多個專案,控管引用的 DLL 版本,因為很多人不太會注意其他專案到底額外引用哪些 DLL 檔案,而每次引用 DLL 檔案,都是將 DLL 放在「bin」底下,而非同一來源處,很可能不同專案引用到不同版本。 * Website Project(WSP) 並無專案檔,是在哪邊紀錄 DLL 檔案的位置引用呢? WSP 加入參考時,除了在資料夾「bin」底下產生 DLL 檔案時,還會再多建立一個檔名為「{DLL名稱}.dll.refresh」檔案,開啟檔案後可以看到裡面紀錄了DLL檔案的引用來源。   雖然理論上「bin」不上版控,但是底下的「.dll.refresh」檔案是要上版控。 ###### tags: `.NET` `.NET Framework`
×
Sign in
Email
Password
Forgot password
or
By clicking below, you agree to our
terms of service
.
Sign in via Facebook
Sign in via Twitter
Sign in via GitHub
Sign in via Dropbox
Sign in with Wallet
Wallet (
)
Connect another wallet
New to HackMD?
Sign up