C# 程序集查找規(guī)則及項目中nuget包中的dll的管理
現(xiàn)在有一個項目A,需要通過nuget包引入一些dll,如何處理引入的dll分兩種情況:
前提,nuget包所在的packages目錄 文件夾無論如何都要上傳。
1、項目A生成目錄輸出在bin/Debug(Release)及應用程序根目錄下
此時,Nuget包引入的dll,復制到本地,保持默認的True即可,因為這些dll會跟隨項目A.dll一起被復制到應用程序根目錄下
2、項目A生成目錄輸出在bin/debug(release)/xxx/項目A.dll
這時,nuget包引入的dll,
2.1、復制到本地的屬性 需要改成False;
2.2、 nuget引入的dll需要上傳到Bin/Debug(Release)下面;
因為,如果如果保持默認,即:復制到本地選項為True,那么nuget引入的這些dll會隨項目生成在bin/debug(release)/xxx/項目A.dll,所在的同一個文件夾中。(這樣不好,后續(xù)會提到)
3、其它項目B想要使用項目A引入的nuget包中的dll;那項目B需要再引入一次nuget包么?
答案是,不需要也不能夠,
先說不能夠,在同一個工程下存在兩份nuget,將來大概率會受到版本不一致帶來維護成本的困擾
再說不需要,A項目引入了nuget包后,它必然將nuget包上傳了,并且可能也上傳到了bin/Debug(Release)一份
此時B需要做的就是:
3.1、看A項目引用的nuget包中的dll中的位置,把路徑拷一份,然后添加引用,瀏覽這個路徑對應的dll,引入進來;
3.2、將復制到本地設(shè)置為False.
4、最后提一下,為什么說2.1那里要改成False,因為一旦你把nuget中的dll復制到自己的目錄下,那當其他人在操作3.1步驟時,還要依賴你這個項目有沒有被編譯,這可能又滋生了生成順序的問題。所以不要把nuget包中的dll,生成在自己項目的私有目錄下是一個好習慣。
5、應用程序加載我們需要的dll時,它是怎么工作的:
- 先從主程序配置文件中查找app.config
- 上一步未找到 則從全局環(huán)境(dotnet framework v4.6.x)中查找,比如微軟提供的System.xxx.dll就是這樣加載進來的
- 上一步未找到 則從應用程序根目錄下查找
- 若還沒找到 則拋出異常 (若未做其它補救措施 即:在代碼中動態(tài)加載程序集dll),程序崩潰:
報錯信息大致為:未能加載文件或程序集 xxxxxxxx或它的某一個依賴項。系統(tǒng)找不到指定的文件。
目前還沒有提及從第三方獲取的dll,如何管理的問題,新開一篇再記錄,bye!

浙公網(wǎng)安備 33010602011771號