首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> .NET 網頁程式設計 >> 關於.NET

將 DLL 嵌入 .NET 程式的三種方法比較

     編輯:關於.NET

為了讓小工具部署更輕鬆 (單一 EXE 檔),常需將相依的第三方 DLL 內嵌。本文介紹三種主流做法並比較優劣。

方法一:嵌入資源並在執行時釋放到磁碟

  1. 將 DLL 專案屬性 Build Action 設為 Embedded Resource。
  2. 設定 Embedded Resource
  3. 在 Program.cs 靜態建構函式中讀取資源串流寫入檔案:
private static void ExtractResourceToFile(string resourceName, string filename)
{
    if (!File.Exists(filename))
    using (Stream s = Assembly.GetExecutingAssembly().GetManifestResourceStream(resourceName))
    using (FileStream fs = new FileStream(filename, FileMode.Create))
    {
        byte[] b = new byte[s.Length];
        s.Read(b, 0, b.Length);
        fs.Write(b, 0, b.Length);
    }
}

static Program()
{
    ExtractResourceToFile("EmbeddedDLL2ExeDemo.ThirdPartyDllDemo.dll", "ThirdPartyDllDemo.dll");
}

缺點: 執行目錄會產生實體 DLL 檔,不夠乾淨;啟動稍慢。

方法二:使用 ILMerge 合併組件 (推薦)

ILMerge 是微軟官方工具,可將多個 .NET 組件合併為單一組件,執行時直接從資源載入,不寫入磁碟。

ilmerge EmbeddedDLL2ExeDemo.exe ThirdPartyDllDemo.dll /ndebug /out:EmbeddedDLL2ExeDemo.exe
  • 第一個參數為主要組件 (EXE),後續為要合併的 DLL。
  • /ndebug 移除偵錯資訊;/out 指定輸出檔名。

優點: 真正單一檔案部署,無臨時檔案,效能最佳。
缺點: 不支援含非受控程式碼的混合模式組件;部分參數 (如 /ver) 在某些版本失效。

方法三:使用 .NET 混淆器內建合併功能

多數商業/開源混淆器 (如 ConfuserEx, Dotfuscator, SmartAssembly) 皆提供「合併組件」選項,操作介面友善,適合已引入混淆流程的專案。

比較總結

方法部署乾淨度效能適用場景限制
資源釋放產生臨時檔啟動較慢快速原型、混合模式 DLL需寫入磁碟權限
ILMerge純單一檔案最佳純 .NET 組件、自動化建置不支援非受控代碼
混淆器純單一檔案佳已有混淆需求的專案需額外授權/學習成本

建議優先評估 ILMerge,若組件包含非受控代碼則退而求其次使用資源釋放法。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved