使用LibZ合并.Net程序集

最近写了一个小的WPF程序,发布的时候发现依赖着两三个20~30k的小dll的,感觉有点不爽,就想把它合并一下。以前在WinForm下用过微软的ILMerge合并程序集,不过记得它对WPF程序支持不大好。便在网上搜了一下,找到了一种资源嵌入的方式Combining multiple assemblies into a single EXE for a WPF application,园子里也有文章介绍这种方式:wpf dll和exe合并成一个新的exe

这种方式的原理并不复杂,不过感觉这种通用的方式应该可以通过工具来实现,每个程序都这么实现一把有点麻烦,便再继续搜了一下,在CodePlex上找到了一个叫LibZ Container的程序可以帮助我们快速实现这一过程,它是一个命令行工具,使用方式如下:

????Libz inject-dll
--assembly
MyApplication.exe
--include *.dll
--move

这个工具还有许多其它的参数,具体的可以看看它的详细说明。 由于这种工具的原理是将DLL作为资源嵌入了主程序集中,并且LibZ打包的时候貌似还做了一个压缩的动作,理论上会影响启动速度的。不过需要合并程序集的一般都是些小程序,目前还没有看到什么大的影响。

另外,发现这种工具还蛮多的,当时找到的就有netz(需要FQ)IL-RepackCostura.Fody,简单的试了两个,感觉侧重点有所不同,不过只是打包dll的话,效果基本上都差不多。

需要注意的是:当主程序在XAML中依赖于其它DLL提供的资源文件的时候(主题样式等资源字典),由于对程序集的依赖是作为BAML文件嵌入到了程序中,要合并这种带资源的程序集需要修改这些BAML文件,而这是一件比较麻烦的事情,目前还没有见过那个工具做到了这一点。因此,资源的DLL是不能参与程序集合并的,资源文件的DLL的依赖性是无法去掉的。

时间: 2024-10-22 17:54:55

使用LibZ合并.Net程序集的相关文章

.NET Framwork 之 源代码编译成托管代码托管代码合并成程序集

我们都知道,C#程序需要在 .NET Framework 的环境中运行. 一.程序运行所需的三个关键 1.IL(中间语言):编译器编译源代码时生成的代码. 2. Framework类库(Framework Class Library,FCL):FCL是一组DLL程序集的统称,其中包含数千个类型定义和功能. 3.CLR(公共语言运行时,Common Language Runtime):它和Java虚拟机一样也是一个运行时环境,是一个可由多种编程语言使用的运行环境.CLR的核心功能包括:内存管理.程

源代码编译成托管代码;托管代码合并成程序集;

.NET是如何将源代码编译成托管代码,又是如何将托管代码合并成程序集?首先,我们先了解下常见的CLR,.NET Framework,IL等名词. 一,说说常见的名词 CLR(公共语言运行 时,Common Language Runtime)和Java虚拟机一样也是一个运行时环境,是一个可由多种编程语言使用的运行环境.CLR的核心功能包括:内存管理.程序集加载.安全 性.异常处理和线程同步,可由面向CLR的所有语言使用.并保证应用和底层操作系统之间必要的分离.CLR是.NET Framework的

CLR的执行模型(2):将托管模块合并成程序集

程序集(assembly)是一个抽象概念.首先,程序集是一个或多个模块/资源文件的逻辑性分组.其次,程序集是宠用.安全性以及版本控制的最小单元.取决于所选择的编译器或工具,既可生成单文件程序集,也可以生成多文件程序集.在CLR中,程序集相当于unity的组件Component. 编译器默认将生成的托管模块转换成程序集,既C#编译器是含有清单的托管模块.清单指出程序集只由一个文件构成.所以,对于只有一个托管模块而且无资源的文件项目,程序集就是托管模块,生成过程中无额外步骤.但是,如果需要将一组文件

程序集合并方法

最近项目开发过程中,代码做了多个项目的分层,但是交给其他团队使用的时候,又不想让使用方引用过多的程序集,于是乎在打包的时候将多个程序集合并到一个程序集中进行输出. 具体步骤见下: 使用工具: 微软ILMerge 下载地址:https://www.microsoft.com/en-us/download/details.aspx?id=17630 在工程文件的Project节点下添加如下节点(最好添加在最后面): $(OutDir)YouOutPutName.dll "$(SolutionDir)

重温CLR(二)生成、部署以及程序集

将类型生成到模块中 class Program { static void Main(string[] args) { Console.WriteLine("Hi"); } } 该应用程序定义了program类型,其中有名为Main的public static方法.Main中引用了另一个类型System.Console.System.console是Microsoft实现好的类型,用于实现这个类型的各个方法的IL代码存储在MSCorLib.dll文件中.总之,应用程序定义了一个类型,还

C#~代码执行过程第二步:生成程序集

编译器会通过CSC.exe工具将生成的托管模块连带资源文件合并成程序集. 这个工具完成操作后会生成一个PE32+文件,该文件中包含了一个叫清单的数据块-清单英文为Manifest. 清单包含了丰富的信息: 1.构成程序集的文件: 2.程序集中文件所实现的public类型: 3.与程序集相关的资源文件和数据文件. 此外,在程序集的模块中还包含了与引用的程序集有关的信息,这些信息描述了被引用的程序集的版本等信息. 原文地址:https://www.cnblogs.com/bigbosscyb/p/1

NET Core

[.net 面向对象程序设计深入](8)认识.NET Core  1,概述          .NET 经历14年,在Windows平台上的表现已经相当优秀,但是"跨平台.开源"却是其痛点,从16年开始.NET Core的出现将迎来.NET的真正意义上的跨平台和开源序幕.     .NET Core是一个开源通用的开发框架,支持跨平台,即支持在Window,macOS,Linux等系统上的开发和部署,并且可以在硬件设备,云服务,和嵌入式/物联网方案中进行使用.     .NET Cor

.NET Core 全新认识(转载)

.NET Core 全新认识 cnblogs.com/yubinfeng/p/6626694.html 一.概述      .NET 经历14年,在Windows平台上的表现已经相当优秀,但是"跨平台.开源"却是其痛点,从16年开始.NET Core的出现将迎来.NET的真正意义上的跨平台和开源序幕. .NET Core是一个开源通用的开发框架,支持跨平台,即支持在Window,macOS,Linux等系统上的开发和部署,并且可以在硬件设备,云服务,和嵌入式/物联网方案中进行使用. .

CLR via C# 阅读 笔记

初读 CLR Via C# 有一些 名词需要记忆: 1.CLR: Common Language Runtime (公共语言运行时) 可有多种编程语言使用的Runtime. 其核心功能是: 内存管理. 程序集加载. 安全性. 异常处理和线程同步等: 2. Managed Module (托管模块) 托管模块包括: PE32 或PE32+ .CLR 头 . 元数据 . IL代码. 3.PE: Protable Executable (可移植执行体) . PE32:是 标准32位 windows 可