強迫症福利--收起.NET程式的dll來

来源:https://www.cnblogs.com/podolski/archive/2019/05/09/10836241.html
-Advertisement-
Play Games

作為上床後需要下床檢查好幾次門關了沒有的資深強迫症患者,有一個及其搞我的問題,就是dll問題。 曾幾何時,在沒有nuget的年代,當有依賴項需要引用的時候,只能通過文件引用來管理引用問題,版本問題,更新問題層出不窮,很是難受。 後來出來nuget,喜大普奔,總算解決了引用的問題。開心之餘,依然還有一 ...


作為上床後需要下床檢查好幾次門關了沒有的資深強迫症患者,有一個及其搞我的問題,就是dll問題。

曾幾何時,在沒有nuget的年代,當有依賴項需要引用的時候,只能通過文件引用來管理引用問題,版本問題,更新問題層出不窮,很是難受。

後來出來nuget,喜大普奔,總算解決了引用的問題。開心之餘,依然還有一個很膈應人的問題:生成文件夾滿地的dll,找個exe眼睛很難受。

講道理這個也不是什麼大問題,但是就是心癢癢,就特別想把這些dll收到一個單獨文件夾裡面,外面就留exe和配置等文件。然後就找這個東西:PrettyBin。

PrettyBin

PrettyBin是一個開源的nuget包:https://github.com/slmjy/PrettyBin,使用它可以將.NET Framework程式引用的文件收到lib文件夾裡面,使用起來也非常方便,老樣子,直接nuget安裝。

Install-Package PrettyBin

提示重新載入項目,點擊確定,就完事了。
安裝之前,輸出是這樣的:

安裝之後,輸出是這樣的:

dll之類的文件都進lib文件夾了,感覺世界都乾凈了很多。

補充

  1. 細心的童鞋應該能夠發現,我寫的是.NET Framework的程式引用,.NET Core,.NET Standard呢?
    答案是:.NET Core啥的東西生成的就是dll,都一樣就沒必要了。

  2. 安裝prettybin之後,再安裝新的包會怎麼樣?受不受影響?
    依然有用,不受影響。

  3. 對於新的nuget管理形式PackageReference效果如何怎麼樣?
    這個有說法的,需要先瞭解這個包工作的原理。

原理解析

首先看看安裝的時候,nuget包管理器彈出的提示:

正在執行腳本文件“ConsoleApp4\packages\PrettyBin.1.1.0\tools\init.ps1”
Init BinPrettify
正在執行腳本文件“ConsoleApp4\packages\PrettyBin.1.1.0\tools\install.ps1”
Install PrettifyBin; 
http://schemas.microsoft.com/developer/msbuild/2003
No Target AfterBuild Node. Creating
No ItemGroup whith MoveToLibFolder tag. Creating
No Move tag in AfterBuild Target. Creating
Edititing App.config
runtimeNode items
No probing Node. Creating
已將“PrettyBin 1.1.0”成功安裝到 ConsoleApp4

可以看到,這裡首先執行的是給項目文件添加`msbuild內容,增加了AfterBuild節點,MoveToLibFolder節點和Move節點。

<Import Project="$(MSBuildToolsPath)\Microsoft.CSharp.targets" />
<Target Name="AfterBuild">
<ItemGroup>
    <MoveToLibFolder Include="$(OutputPath)*.dll ; $(OutputPath)*.pdb ; $(OutputPath)*.xml" />
</ItemGroup>
<Move SourceFiles="@(MoveToLibFolder)" DestinationFolder="$(OutputPath)lib" OverwriteReadOnlyFiles="true" />
</Target>

msbuild可以設置生成後的操作,成功生成之後,將目錄下麵的dll文件,pdb文件和xml都轉到了lib文件夾。
然後修改了app.config文件,在runtime底下增加了一個probing節點。

<runtime>
<assemblyBinding xmlns="urn:schemas-microsoft-com:asm.v1">
    <probing privatePath="lib;libs" xmlns="" />
</assemblyBinding>
</runtime>

probing節點提供.NET程式集查找的選項,privatepath指定路徑,詳細資料可以查看MSDN:https://support.microsoft.com/en-us/help/837908/how-to-load-an-assembly-at-runtime-that-is-located-in-a-folder-that-is
補充資料:關於指定程式集位置

所以,prettybin是通過運行powershell腳本設置生成成功後轉移文件,並將程式集查找路徑調整為lib文件夾。

根據https://docs.microsoft.com/zh-cn/nuget/reference/migrate-packages-config-to-package-reference,PackageReference方式nuget是不支持install.ps1腳本的。所以並不能支持prettybin。

新建.NET Framework程式是預設是通過傳統的package.config文件進行包管理的,新建.NET Core和.NET Standard都是預設使用PackageReference包管理。

結論

  1. 如果需要使用PrettyBin,那麼直接預設配置.NET FRAMEWORK項目的nuget管理方式,完美支持。
  2. 如果需要升級新的包管理方式,可以在安裝了PrettyBin之後升級項目,依然支持。
  3. 升級了PackageReference之後,安裝PrettyBin無效。

P.S. 補充不使用prettybin,也不調用AFTERBUILD的一種實現:https://www.broculos.net/2014/03/visual-studio-build-dlls-to-separate.html#.WWiTjJFJLy8


您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • 今天早上到現在老師都沒有講新課,每天都寫博客,今天沒學到新的,也不知道學什麼,好煩啊,外邊還下雨,下一周了。 不知道什麼時候才能停,又想它停又想它繼續下,好糾結。 老師叫我們天天寫博客,叫我們要堅持,感覺班上好多人都沒寫了,感覺就我自己堅持寫,現在好了,今天老師 沒講新課 我只能寫日記了。 很快就要 ...
  • 一,複習 二,random模塊: 三,json模塊: 四,pickle模塊: 五,shelve 模塊: 六,hashlib加密模塊: 七,hmac 加密模塊: 八,shutil 模塊: ...
  • this: 1、使用在類中,可以用來修飾屬性、方法、構造器 2、表示當前對象或者是當前正在創建的對象 3、當形參與成員變數重名時,如果在方法內部需要使用成員變數,必須添加 this 來表明該變數時類成員 4、在任意方法內,如果使用當前類的成員變數或者成員方法可以在其前面添加 this ,增強程式的閱 ...
  • 工作快一年了,一直沒有停下學習的腳步,但是發現自己學的東西太雜太亂也太容易忘記(從小學到大學一直沒有記筆記的習慣),總是反反覆復,所以在此進行總結,也記錄下自己的學習的歷程,從此做一個有內涵的程式猿。。。 ...
  • pip: 一個現代的,通用的 Python 包管理工具。提供了對Python 包的查找、下載、安裝、卸載的功能。 windows:自帶pip,直接使用。 Linux:執行下麵命令即可完成安裝。 Usage: pip <command> [options] 查看版本:pip show package_ ...
  • 1.介面定義 介面屬於一個特殊的類,這個類裡面只能有抽象方法和全局常量 (該概念在JDK1.8之後被打破,在1.8後介面中還可以定義普通方法和靜態方法,在後續章節會詳講) 1.1 介面具有以下幾個原則 介面通過interface關鍵字來實現定義 一個子類如果要繼承介面的話,則需要通過implemen ...
  • 本次內容是基於獨立的“企業微信”而言的; 企業微信有獨立的管理後臺,和一般的服務號,訂閱號後臺不同; 企業微信涉及員工,所以這裡的支付是付款到員工零錢; 官方API文檔: https://work.weixin.qq.com/api/doc#90000/90135/90278 下麵具體步驟: 1:先 ...
  • CodeFirst的開發模式,資料庫的設計細節完全靠代碼來完成,數據實體映射配置正是負責這項工作的,針對一個實體,可以在這裡配置其在資料庫中的數據表關係、數據約束及各個數據欄位的每一個細節配置 ...
一周排行
    -Advertisement-
    Play Games
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...