使用ilmerge实现.net程序静态链接

ILMerge实战:.NET程序集合并原理与Visual Studio集成指南 在.NET开发中,程序集(Assembly)是代码部署的基本单元,它包含了IL中间语言代码和元数据。当项目依赖多个外部库时,发布目录会散落大量DLL文件,给分发和部署带来复杂性。通过程序集合并技术,可以将主程序与依赖库融合为单一可执行文件,从根本上简化部署流程并提升用户体验。ILMerge作为微软官方工具,在IL层面进行静态合并,通过重命名类型和重定向引用来解决冲突,生成标准的.NET程序集。这项技术特别适用于需要交付给非技术用户的桌面工具和客户端应用,能有效减少文件数量,避免依赖缺失导致的运行时错误。本文 阅读详情


当编写规模稍大一点的程序时,需要进行模块划分。我们一般是对每个模块建一个工程,输出一个类库,这样就形成了一个exe加多个类库的解放方案。这样本身是没有什么问题的,就是发布上稍微有点麻烦,需要发布一个exe加多个dll文件。特别是那些需要经常更新的程序,其实本身可能并不大,一共也就几百kb,但每次还要发布三四个dll确实令人厌烦,做成安装包就更没必要了。

在C++中,我们一般可以通过静态链接解决这种问题,但在.net中却不行,每个类库只能输出dll,VisualStudio官方也没有提供静态链接的选项,其实从理论上讲要想合并似乎也不难,ildasm能够把.NET程序反编译成il,那么把两个il合并到一个il当中再用il编译就可以了。虽然M$却没有直接提供这种功能,但M$的一位大牛提供了一个工具ILMerge可以实现这种功能,可以在http://research.microsoft.com/~mbarnett/ILMerge.aspx下载。

网上也有一些文章对这个工具进行了介绍,margiex的blog中的说明就介绍的较简明扼要,这里转录一下:

ilmerge /ndebug /target:exe /targetplatform:v1.1 /out:newclient.exe oldclient.exe /log AutoUpdater.dll DockingSuite.dll DocumentManager.dll FileHelpers.dll OutlookBar.dll SandBar.dll ICSharpCode.SharpZipLib.dll

解释如下:

  1. target: 指定输出组件的类型,有DLL/EXE/WINEXE; (如果是EXE,则程序在执行的时候将出现一个DOS窗口(即使是WINFORM的程序). 因此应该设置target为winexe)
  2. targetplatform: 输出组件的.net运行版本;
  3. out: 合并后的组件全名;
    后面是主要的被合并的组件名称, 及相关所有的其它DLL;
    上面的示例只是合并为EXE, 也可以多个DLL合并成一个DLL使用, 各自的命名空间不会改变; 
  • 不能合并interop这种由COM转换过来的DLL; (可以合并,但相关依赖的DLL必须也一起合并, 第一次合并的时候只有Excel.dll,总是报错,以为是interop的缘故,后来才发现是没有合并vbide.dll的缘故,复制到目录再一起合并,一切OK.)
  • 如果有资源DLL, 应该将要被合并的oldclient.exe先改为别的名称,然后合并后的输出命名为:oldclient.exe,因为资源文件名是:oldclient.resources.dll,而ILMERGE不能合并资源文件,否则在导出后将找不到此资源文件。(如果哪位知道如何合并资源文件,请指教,谢谢)
  • 虽然合并后的EXE比较大,但在用户那里只有一个EXE,这样直观的多,也容易升级维护.

原文地址:http://www.cnblogs.com/margiex/archive/2008/06/24/302329.html

具体的详细使用文档请参看它的说明文档,还是很简单的。

另外,也可以通过编程的方式来调用ILMerge的库来实现简化合并,这里转录一下CodeProject上的一篇文章Post build step static linking tool for C#, using ILMerge的代码:


using System;
using System.Text;
using System.Collections;


namespace HTMerge
{
    
class Program
    {   
        
static void Main(string[] args)
        {
            
try
            {
                String strDir 
= "";
                
if (args.Length != 1)
                {
                    Console.WriteLine(
"Usage: HTMerge directoryName");
                    
return;
                }
                
else
                {
                    strDir 
= args[0];
                }

                String[] exeFiles 
= System.IO.Directory.GetFiles(strDir, "*.exe");
                String[] dllFiles 
= System.IO.Directory.GetFiles(strDir, "*.dll");

                ArrayList ar 
= new ArrayList();

                Boolean bAdded 
= false;

                
//there might be more than 1 exe file, 
                
//we go for the first one that isn't the vshost exe
                foreach (String strExe in exeFiles)
                {
                    
if (!strExe.Contains("vshost"))
                    {
                        ar.Add(strExe);
                        bAdded 
= true;
                        
break;
                    }
                }

                
if (!bAdded)
                {
                    Console.WriteLine(
"Error: No exe could be found");
                    
//I know multiple returns are bad�
                    return;
                }

                bAdded 
= false;

                
foreach (String strDLL in dllFiles)
                {
                    ar.Add(strDLL);
                    bAdded 
= true;
                }

                
//no point merging if nothing to merge with!
                if (!bAdded)
                {
                    Console.WriteLine(
"Error: No DLLs could be found");
                    
//I know multiple returns are bad�
                    return;
                }


                
//You will need to add a reference to ILMerge.exe from Microsoft
                
//See http://research.microsoft.com/~mbarnett/ILMerge.aspx
                ILMerging.ILMerge myMerge = new ILMerging.ILMerge();

                String[] files 
= (String[])ar.ToArray(typeof(string));

                String strTargetDir 
= strDir + "\\Merged";

                
try
                {
                    System.IO.Directory.CreateDirectory(strTargetDir);
                }
                
catch
                {
                }

                
//Here we get the first file name 
                
//(which was the .exe file) and use that
                
// as the output
                String strOutputFile = System.IO.Path.GetFileName(files[0]);

                myMerge.OutputFile 
= strTargetDir + "\\" + strOutputFile;
                myMerge.SetInputAssemblies(files);

                myMerge.Merge();
            }
            
catch (Exception ex)
            {
                Console.WriteLine(String.Format(
"Error :{0}",ex.Message));
            }

        }
    }
}

另外,需要说明的是,这个工具目前支持的是.net 2.0,那些.net 3.0 3.5的程序由于是和.net2.0同一个clr,也可以使用(我试过的)。

ILMerge UI:.NET程序集合并工具的图形化界面 ILMerge UI 是一个基于命令行工具 ILMerge 的图形化界面版本。它为开发者提供了更直观、简便的方式来合并多个 .NET 程序集,从而优化部署和减少应用程序的依赖性。通过图形化界面,开发者能够轻松地选择输入和输出文件,完成合并操作,并对合并过程进行自定义配置。静态链接是一种程序链接方法,它在程序构建阶段将所有需要的库文件(如DLLs和其它对象文件)中的代码和数据复制到最终的可执行文件中。这种方式创建出的可执行文件具有无需外部依赖即可独立运行的优点。 阅读详情

相关推荐

ILMerge安装包

ILMerge是一个实用程序,可用于将多个.NET程序集合并为单个程序集。ILMerge采取了一套输入组件并将它们合并为一体目标装配。输入程序集列表中的第一个程序集是一次装配。当主程序集是可执行文件时,则将目标程序集创建为具有与主程序集相同的入口点的可执行文件。另外,如果主程序集有一个强名称,并且提供了一个.snk文件,那么目标程序集将使用指定的键重新签名,以便它也有一个强名称。 ILMerge被打包为一个控制台应用程序。但是,它的所有功能也可以通过编程方式使用。 有几个选项可以控制ILMerge的行为。有关详细信息,请参阅该工具附带的文档。 ILMerge在v2.0.NET运行时中运行,但它也能够合并v1或v1.1程序集。但是,它只能为v2程序集合并PDB文件。 目前,ILMerge只在基于Windows的平台上工作。它还不支持转子或Mono。 如果您在使用ILMerge时遇到任何问题,请联系mbarnett_at_microsoft_dot_com。更多详细信息可在ILMerge网站.

VC.Net中创建与使用静态链接库(lib)和动态链接库(dll),以及它们的区别.

  VC.Net中创建与使用静态链接库(lib)和动态链接库(dll),以及它们的区别. 收藏 document.body.oncopy = function() { if (window.clipboardData) { setTimeout(

dadahacker的笔记 856

.net exe dll 合并ILMergeGui.2.0.10.0

.net exe dll 合并ILMergeGui.2.0.10.0 .net exe dll 合并ILMergeGui.2.0.10.0 包含完整的合并工具,绿色工具,直接运行即可

ILMerge参考文档

ILMerge Michael BarnettResearch in Software Engineering (RiSE)Microsoft ResearchCopyright © Microsoft Corporation. All rights reserved. 原文链接:https://github.com/dotnet/ILMerge/blob/master/ilmerge-man...

weixin_30614587的博客 708

.Net使用ILMerge实现程序集合并

有完整的实例,演示了如何通过C#编码控制对几个dll或exe程序集进行合并。在发布一些客户端软件的时候特别有用。可以打包你的文件,只留下一个Exe

IBM System x3650 M5 IMM配置

1、IMM基本介绍 IMM,全称是Intel Mobile Module是IBM服务器上的集成管理模块,该模块是独立于服务器系统,可以通过一个单独的IP地址,使用Web和虚拟端口方式直接启动、停止和管理远程服务器,即使主板、处理器或者内存故障导致主机无法启动,也依然可以远程管理服务器,可以远程直接操作启动画面和服务器工作界面。 2、IP地址配置 2.1 通过Web方式修改IP地址 IBM服...

血饮渊虹的博客 4万+

VS2015 .Net4.5.2利用ILMerge工具将多个DLL类库合并成一个exe文件

# 1、通过vs自带的NuGet下载ILMerge 2、下载后在解决方案所在目录下找到 packages\ILMerge.3.0.41\tools\net452 看到exe文件就可以使用了 3、WIN+ R 进入CMD 4、进入ILmerge所在的目录 进盘用 D: 命令 D为盘符,具体根据自己的来 进入后,复制 解决方案所在目录\packages\ILMerge.3.0.41\tools\net452 输入ILMerge 出现以下界面即可 5、将dll合并进exe ILMerge /ndebug

xya644的博客 2385

雷电模拟器安装面具环境并过软件检测系列(看这一篇就够了!)

雷电模拟器安装面具环境并过基本软件的环境检测

qq_45059975的博客 6万+

用 .NET NativeAOT 构建完全 distroless 的静态链接应用

如此一来,我们不需要配置任何的环境,也不需要保留任何的依赖项,更不需要安装任何的第三方库,只需要把我们构建出来的 Test 这个可执行程序拷贝到任何一台 x64 的 Linux 机器上,就能运行输出我们想要的结果。这种情况下,P/Invoke 方法会直接进入编译出的二进制的导入表,如果启动时缺失了对应的方法会直接启动失败。有了 Direct P/Invoke,我们需要调用的符号已经躺在了我们二进制的导入表里,那么我们其实只要把静态库链接到我们的二进制里去,我们的应用就能无需任何的依赖直接启动了。

weixin_55010563的博客 630

用数据分析优化彩票决策:放弃预测,专注理性投入

彩票本质上是负和博弈的概率系统,其核心并非号码预测,而是对玩法规则、返奖率(RTP)、投入策略与心理约束的量化决策。基于组合数学与二项分布的分析方法,可精确计算各奖项概率、评估不同玩法的实际回报效率,并构建个人资金-风险-目标模型。数据的价值不在于打破随机性,而在于识别非随机环节——如奖池跃升期的RTP波动、固定奖的保底收益、冷热号背后的分奖博弈结构。这种以决策优化为导向的数据实践,适用于将彩票视为受控实验的理性参与者,而非追求玄学中奖的投机者。

frank1998819 644

ArcGIS中地理坐标系与投影坐标系以及投影转换

简单介绍arcgis软件中坐标系定义、设置和常见问题。

weixin_41399650的博客 8万+

如何使用ILMerge:合并.NET程序集的终极指南

ILMerge是一款强大的静态链接工具,专为合并多个.NET程序集而设计。无论是简化部署流程还是减少应用程序依赖项,ILMerge都能帮助开发者轻松将多个DLL和EXE文件合并为单一可执行文件,显著提升项目管理效率。 ## 📦 快速安装ILMerge的两种方法 ### 通过NuGet包管理器图形界面安装 1. 在Visual Studio的**解决方案资源管理器**中右键点击项目引用 2.

gitblog_01165的博客 406

手把手教你在Keil/IAR中移植SEGGER_RTT组件(避坑指南+性能对比)

本文详细介绍了在Keil/IAR开发环境中移植SEGGER RTT调试组件的完整流程与优化技巧。通过对比传统串口调试,SEGGER RTT凭借零硬件占用、高速传输和双向交互等优势,显著提升嵌入式开发效率。文章包含配置步骤、性能调优方案及常见问题解决方案,是嵌入式开发者必备的实用指南。

y7z8a的博客 245

ILMerge 工具指南

ILMerge 是一个用于 .NET 应用程序的静态链接器工具,它能够将多个 .NET 程序集合并成一个单一的可执行文件。由微软研究团队开发,ILMerge 可以帮助开发者减少部署时的文件数量,简化安装过程,同时也方便管理依赖项。它支持将主程序集与其他库、框架组件等合并在一起,使得最终的输出文件只需运行即可,无需额外加载外部程序集。 ## 2. 项目快速启动 ### 安装步骤 1. 打开 V...

gitblog_00347的博客 1089

保姆级教程:在ROS Noetic下,手把手教你将自定义A*全局规划器打包成插件(附避坑指南)

本文提供了一份详细的ROS Noetic下自定义A*全局规划器插件开发指南,涵盖从环境准备、算法优化到插件配置与调试的全流程。通过实战案例和避坑技巧,帮助开发者高效实现机器人导航中的全局路径规划,特别适合需要优化ROS导航栈的开发者。

weixin_29168675的博客 285

让 SAP HANA 查询飞起来:彻底避开隐式类型转换的性能暗礁

SAP HANA性能优化:警惕隐式类型转换陷阱 隐式类型转换是SAP HANA项目中常见的性能隐患。当SQL表达式两侧数据类型不匹配时,系统会自动进行类型转换,这种看似便利的操作可能导致: 过滤条件无法下推,扫描范围扩大 列存引擎优势丧失,触发中间结果物化 执行计划走向低效路径 治理方案包括: 从源头统一数据类型,确保常用比较字段类型一致 将显式转换应用于常量而非整列 使用生成列预先转换存储,避免运行时计算 排查方法: 通过SQL Plan Cache定位高频查询 分析执行计划中的转换迹象 重点关注VARC

2007 年 ~ 2025 年,深耕 SAP 技术 18 年 11万+

【亲测免费】 ILMerge 使用教程

ILMerge 是一个用于.NET程序的静态链接器,它能够将多个.NET程序集合并到一个单一的可执行文件中。这个教程将引导您了解如何安装、配置并使用ILMerge。 ## 1. 项目目录结构及介绍 在下载ILMerge源代码后,您会看到如下的基本目录结构: ``` ILMerge/ │ README.md │ LICENSE.txt │ ├── src/ │ ├── ILMerg...

gitblog_00435的博客 1163

set_input_delay/set_output_delay介绍

针对这一类的情况,在做block时,cts之后,便需要将update_io_latency给关闭。那么,计算的timing就是错误的了。对于hier flow来讲,切分block,进行timing budget的时候,clock tree还未长。计算block端口上的timing,通常需要用到set_input_delay和set_output_delay告知工具外部电路的延迟信息,以方便工具计算端口上的timing。此时,工具在计算in2reg的timing时,便会将2.67ns的delay带进来。

芯冰乐 320

ILMerge 项目安装与配置指南

ILMerge 是一个用于 .NET 平台的静态链接工具,它能够将多个 .NET 程序集合并为一个单一的程序集。这个工具对于需要减少部署文件数量或简化依赖管理的开发者来说非常有用。ILMerge 主要使用 C# 语言编写,并且是开源的,可以在 GitHub 上找到其源代码。 #### 2. 项目使用的关键技术和框架 ILMerge 主要依赖于 .NET 框架,特别是 .NET Framewor...

gitblog_01288的博客 1051

温度PID控制PLC程序

温度PID稳定控制程序,适用于欧姆龙PLC,对其他PLC也具有很大参考价值

LinePhone3.2.7(android端最新版本) sip客户端

SIP客户端For android:LinePhone3.2.7(最新版本),官网地址:http://www.linphone.org/

【亲测免费】 ILMerge 使用指南

ILMerge 是一款强大的工具,用于将多个 .NET 组件合并成一个单独的程序集,特别适合希望减少应用程序部署时文件数量的情况。本文档旨在指导您完成 ILMerge 的安装、使用以及基础API的调用方法。 ## 安装指南 **通过NuGet包管理器** 1. 打开Visual Studio中的解决方案。 2. 在“解决方案资源管理器”中选择您的项目。 3. 右键点击“管理NuGet包”。 ...

gitblog_01260的博客 1158

最新的sdio 4.0 spec 协议标准 带书签 高清完整PDF版

Part-E1-SDIO-Specification-Ver4.00-Final-120220.pdf:最新的sdio 4.0 spec 协议标准 带书签 高清完整PDF版,包括SDIO 接口的外设,SDIO 接口官方协议等。

ILMerge完全指南:如何将多个.NET程序集合并为单个文件的终极教程

ILMerge是一款强大的.NET程序集静态链接工具,能够将多个.NET程序集合并为单个文件。本教程将详细介绍如何使用ILMerge实现这一目标,让你的.NET应用部署更加简单高效。 ## 什么是ILMerge? ILMerge是一个免费的命令行工具,它可以将多个.NET程序集(DLL或EXE)合并成一个单独的程序集。这对于简化应用部署、减少文件数量以及保护代码具有重要意义。ILMerge既可

gitblog_00435的博客 357

lwip-2.0.3

lwip是瑞典计算机科学院(SICS)的Adam Dunkels 开发的一个小型开源的TCP/IP协议栈。实现的重点是在保持TCP协议主要功能的基础上减少对RAM 的占用。

ILMerge入门:从安装到合并的5分钟快速上手指南

ILMerge是一款强大的.NET程序集静态链接工具,能够将多个.NET程序集合并为单个程序集,帮助开发者简化部署流程并减少依赖项管理复杂度。本文将带你快速掌握ILMerge的安装与基础使用方法,只需5分钟即可完成从环境配置到成功合并程序集的全过程。 ## 📦 快速安装ILMerge:3种简单方法 ### 通过NuGet包管理器安装(推荐) 1. 在Visual Studio中,右键点击项

gitblog_00016的博客 983

ILMerge 项目常见问题解决方案

ILMerge 是一个用于将多个 .NET 程序集合并为一个程序集的工具。它是一个静态链接器,可以将多个输入程序集合并成一个目标程序集。ILMerge 主要用于 .NET 开发环境,支持将不同版本的 .NET 程序集合并。 ILMerge 的主要编程语言是 C#,因为它是一个 .NET 工具,主要使用 C# 编写。 ## 2. 新手在使用 ILMerge 项目时需要特别注意的 3 个问题及详细...

gitblog_01088的博客 621
上一篇: ILMerge的使用注意事项
下一篇: C#编写基于.Net IOCP的高性能服务器
CodingSir
博客等级 码龄21年 2149粉丝 812原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值