將.NET應(yīng)用合并打包成單文件的兩個(gè)方法

前陣子神僵,答應(yīng)了幫一位哥們做一個(gè)桌面應(yīng)用工具雁刷。

好吧,說(shuō)干就干保礼!花了一個(gè)周末的時(shí)候沛励,應(yīng)用功能的開(kāi)發(fā)算是搞定了,剩下來(lái)就是交付的問(wèn)題了炮障。這時(shí)目派,我看到release目錄里一堆的dll,程序代碼的潔癖再也壓制不住了胁赢。于是址貌,臨時(shí)給自己增加一個(gè)目標(biāo):把這些丑陋的dll給隱藏起來(lái),放在一個(gè)子目錄里,當(dāng)然最好是全部打包成一個(gè)exe文件练对。

如果是.NET Core開(kāi)發(fā)的應(yīng)用,那就很好辦吹害,打包指令加上self-contained就可以了螟凭。例如:

dotnet publish -c Release -r win-x64 --self-contained

好是不死,因?yàn)榻M件依賴的原因它呀,我不得不使用.NET Framework螺男。因此,只能求助互聯(lián)網(wǎng)給我思路了纵穿。很快我便找到了兩方案下隧,都能夠完美解決我的需求。

下面我就分別介紹一下吧谓媒。

一淆院、ILMerge

獲得ILMerge

  • 下載源代碼

git clone https://github.com/dotnet/ILMerge.git

  • 編譯代碼
SET MSBUILD="C:\Program Files\Microsoft Visual Studio\2022\Community\MSBuild\Current\Bin\MsBuild.exe"

%MSBUILD% ILMerge\ILMerge.csproj /t:Rebuild /p:Configuration=Release;OutDir=.\bin

創(chuàng)建項(xiàng)目

創(chuàng)建一個(gè)名為MergeAppDemo的項(xiàng)目,項(xiàng)目中引用了我們熟悉的第三方庫(kù)Newtonsoft.Json句惯。然后正常編譯出來(lái)的內(nèi)容如下:

image.png

ILMerge打包腳本

執(zhí)行以下命令

ILMerge.exe /log:merge.log /t:winexe /out:target\MergeAppDemo.exe source\MergeAppDemo.exe source\Newtonsoft.Json.dll

幾秒鐘后土辩,得到一個(gè)新的可執(zhí)行文件。并且我們發(fā)現(xiàn)了它的Size抢野,增大了不少拷淘。看來(lái)Newtonsoft.Json.dll已經(jīng)被打包在其中了指孤!

image.png

雙擊運(yùn)行MergeAppDemo.exe启涯,太好了,成功了恃轩!

將ILMerge腳本整合項(xiàng)目工程

如果大家覺(jué)得每次生成編譯還要額外多執(zhí)行一次ILMerge腳本太過(guò)麻煩结洼,我們可以將腳本寫(xiě)入在項(xiàng)目工程配置里,那么就可以簡(jiǎn)化成详恼,每次Release發(fā)布成功后补君,自動(dòng)執(zhí)行ILMerge腳本,一氣呵成昧互。

首先挽铁,用文本編輯器打開(kāi)工程文件MergeAppDemo.csproj,找到編譯參數(shù)的配置節(jié)點(diǎn)敞掘,添加PostBuildEvent的腳本內(nèi)容叽掘。

  <PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Release|AnyCPU' ">
    <PlatformTarget>AnyCPU</PlatformTarget>
    <DebugType>pdbonly</DebugType>
    <Optimize>true</Optimize>
    <OutputPath>bin\Release\</OutputPath>
    <DefineConstants>TRACE</DefineConstants>
    <ErrorReport>prompt</ErrorReport>
    <WarningLevel>4</WarningLevel>

    <PostBuildEvent>
    ILMerge.exe /log:merge.log /t:winexe /out:$(ProjectDir)bin\MergeAppDemo.exe $(ProjectDir)bin\Release\MergeAppDemo.exe $(ProjectDir)bin\Release\Newtonsoft.Json.dll
</PostBuildEvent>
        
  </PropertyGroup>

二、Costura.Fody

安裝Costura.Fody

要使用Costura.Fody玖雁,你首先需要將其安裝到你的項(xiàng)目中更扁。你可以通過(guò)NuGet包管理器來(lái)安裝它。在你的Visual Studio中,打開(kāi)“包管理器控制臺(tái)”浓镜,然后輸入以下命令:

Install-Package Costura.Fody

編譯項(xiàng)目

安裝好Costura.Fody之后溃列,無(wú)需做任何配置,直接編譯項(xiàng)目膛薛。轉(zhuǎn)到在bin/Release目錄听隐,就可以找到已經(jīng)打包好的exe文件,而且Size比ILMerge生成的更小哄啄。

image.png

看起來(lái)十分完美雅任,同樣雙擊運(yùn)行MergeAppDemo.exe,也可以正常執(zhí)行咨跌!

總結(jié)

本文介紹了兩種.NET應(yīng)用程序的打包工具沪么,分別是ILMerge和Costura.Fody。他們都能完成目標(biāo)锌半,把各種依賴的dll和其他資源全部打包在單一的exe文件中禽车。

我個(gè)人推薦Costura.Fody。因?yàn)橄鄬?duì)而言Costura.Fody實(shí)現(xiàn)更加簡(jiǎn)單方便:

  • 配置簡(jiǎn)單拳喻,直接Nuget引入即可哭当,不像ILMerge還需要額外編寫(xiě)腳本
  • 而且編譯打包速度更快,幾乎感覺(jué)不到因打包產(chǎn)生的延遲
  • 生成文件的Size更小冗澈,似乎Costura.Fody還做了一些裁剪
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末钦勘,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子亚亲,更是在濱河造成了極大的恐慌彻采,老刑警劉巖,帶你破解...
    沈念sama閱讀 216,692評(píng)論 6 501
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件捌归,死亡現(xiàn)場(chǎng)離奇詭異肛响,居然都是意外死亡,警方通過(guò)查閱死者的電腦和手機(jī)惜索,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,482評(píng)論 3 392
  • 文/潘曉璐 我一進(jìn)店門(mén)特笋,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái),“玉大人巾兆,你說(shuō)我怎么就攤上這事猎物。” “怎么了角塑?”我有些...
    開(kāi)封第一講書(shū)人閱讀 162,995評(píng)論 0 353
  • 文/不壞的土叔 我叫張陵蔫磨,是天一觀的道長(zhǎng)。 經(jīng)常有香客問(wèn)我圃伶,道長(zhǎng)堤如,這世上最難降的妖魔是什么蒲列? 我笑而不...
    開(kāi)封第一講書(shū)人閱讀 58,223評(píng)論 1 292
  • 正文 為了忘掉前任,我火速辦了婚禮搀罢,結(jié)果婚禮上蝗岖,老公的妹妹穿的比我還像新娘。我一直安慰自己榔至,他們只是感情好剪侮,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,245評(píng)論 6 388
  • 文/花漫 我一把揭開(kāi)白布。 她就那樣靜靜地躺著洛退,像睡著了一般。 火紅的嫁衣襯著肌膚如雪杰标。 梳的紋絲不亂的頭發(fā)上兵怯,一...
    開(kāi)封第一講書(shū)人閱讀 51,208評(píng)論 1 299
  • 那天,我揣著相機(jī)與錄音腔剂,去河邊找鬼媒区。 笑死,一個(gè)胖子當(dāng)著我的面吹牛掸犬,可吹牛的內(nèi)容都是我干的袜漩。 我是一名探鬼主播,決...
    沈念sama閱讀 40,091評(píng)論 3 418
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼湾碎,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼宙攻!你這毒婦竟也來(lái)了?” 一聲冷哼從身側(cè)響起介褥,我...
    開(kāi)封第一講書(shū)人閱讀 38,929評(píng)論 0 274
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤座掘,失蹤者是張志新(化名)和其女友劉穎,沒(méi)想到半個(gè)月后柔滔,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體溢陪,經(jīng)...
    沈念sama閱讀 45,346評(píng)論 1 311
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,570評(píng)論 2 333
  • 正文 我和宋清朗相戀三年睛廊,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了形真。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 39,739評(píng)論 1 348
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡超全,死狀恐怖咆霜,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情卵迂,我是刑警寧澤裕便,帶...
    沈念sama閱讀 35,437評(píng)論 5 344
  • 正文 年R本政府宣布,位于F島的核電站见咒,受9級(jí)特大地震影響偿衰,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,037評(píng)論 3 326
  • 文/蒙蒙 一下翎、第九天 我趴在偏房一處隱蔽的房頂上張望缤言。 院中可真熱鬧,春花似錦视事、人聲如沸胆萧。這莊子的主人今日做“春日...
    開(kāi)封第一講書(shū)人閱讀 31,677評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)跌穗。三九已至,卻和暖如春虏辫,著一層夾襖步出監(jiān)牢的瞬間蚌吸,已是汗流浹背。 一陣腳步聲響...
    開(kāi)封第一講書(shū)人閱讀 32,833評(píng)論 1 269
  • 我被黑心中介騙來(lái)泰國(guó)打工砌庄, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留羹唠,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 47,760評(píng)論 2 369
  • 正文 我出身青樓娄昆,卻偏偏與公主長(zhǎng)得像佩微,于是被迫代替她去往敵國(guó)和親。 傳聞我的和親對(duì)象是個(gè)殘疾皇子萌焰,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,647評(píng)論 2 354

推薦閱讀更多精彩內(nèi)容