2024/12/04

SharpDevelop 技巧:讓你的 dot NET 程式 "單檔" 行天下

 作者:吳祐賓

 


 

 

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

 


沒有留言:

張貼留言