前陣子神僵,答應(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)容如下:
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)被打包在其中了指孤!
雙擊運(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生成的更小哄啄。
看起來(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還做了一些裁剪