作者:吳祐賓
SharpDevelop 可以編譯小巧可愛的執行檔,但遇到需要三方的函式庫時,就必須連同其 DLL 檔一同複製過去,例如我之前一篇「SharpDevelop 使用 NuGet 套件管理器,以 NPOI 為例」中就需要 NPOI 的相關 DLL。有時這類的小工具我僅需要一個單檔傳遞,可以省下許多部署的時間。
這個好用的工具就是「iLmerge」,專門用來整合所有資源檔為單一執行檔的好工具。底下是 SharpDevelop 的設定方式。
iLmerge 所需環境
專案必須導入相關 DLL,在 iLmerge 執行時會使用到它們,要注意的是,這些檔案放在 iLmerge.exe 所在目錄是行不通的。
- BouncyCastle.Crypto.dll
- ICSharpCode.SharpZipLib.dll
加入相依參考 (Add Reference)
上面提到 iLmerge 所需套件,我使用的版本是:
- portable.bouncycastle.1.9.0
- sharpziplib.1.3.3
修改專案檔內容 (csproj)
SharpDevelop 也使用到 Bouncycastle 和 Sharpziplib,所以,加入上述相依參考後,編譯時會出現錯誤訊息:
同一個相依組件的不同版本之間發生衝突。請將專案檔中的 "AutoGenerateBindingRedirects" 屬性設為 true。
解決方式,使用記事本開啟專案檔 csproj,在 <PropertyGroup> 區塊裡加入以下內容:
<PropertyGroup>
...
<AutoGenerateBindingRedirects>true</AutoGenerateBindingRedirects>
</PropertyGroup>
修改專案檔選項 (Project Options)
- 在 SharpDevelop 中開啟您的專案。
- 在「Project」選單中,選擇「Project Options...」。
- 選擇「Build Events」頁籤。
- 在「Build Events」中,添加「Post-build event command line」來執行 ILMerge。
設定建置事件
以下是一個範例建置後事件命令列,您可以根據您的需求修改:
"$(SolutionDir)\packages\MSBuild.ILMerge.Task.1.1.3\tools\ILMerge.exe" /target:winexe /out:"$(TargetDir)$(TargetName)-merged.exe" "$(TargetPath)" "$(TargetDir)*.dll" /wildcards
說明
- $(SolutionDir): 方案目錄的路徑。
- $(TargetDir): 輸出目錄的路徑。
- $(TargetName): 目標檔案的名稱(不含副檔名)。
- $(TargetPath): 目標檔案的完整路徑。
- /wildcards: 使用萬用字元合併所有 DLL 文件。
總結
SharpDevelop 編譯出的執行檔若需使用第三方函式庫,則需一併複製 DLL 檔。為解決此問題,可使用 iLmerge 工具將所有資源檔整合為單一執行檔。
設定步驟:
導入 DLL:將 BouncyCastle.Crypto.dll 和 ICSharpCode.SharpZipLib.dll 導入專案。
修改專案檔:在 SharpDevelop 的專案選項中,設定建置後事件命令列,使用 ILMerge 合併 DLL 檔案。
透過以上設定,即可輕鬆產生單一執行檔,方便部署和傳遞。
和你分享
See also
- Portable.BouncyCastle 1.9 - NuGet
- ILMerge 3.0.41 - NuGet
- 如何:啟用和停用自動繫結重新導向 - Microsoft
- 頁首圖片來源:攝影師:SHVETS production: https://www.pexels.com/zh-tw/photo/7203788/
沒有留言:
張貼留言