.NETZ 原理分析

.NETZ - .NET Executables Compressor 

https://www.cnblogs.com/Safe3/archive/2008/10/16/1312704.html


.NETZ compresses the Microsoft .NET Framework executable files in order to make them smaller. Smaller executables consume less disk space and load faster because of fewer disk accesses.

Unlike binary executable packers .NETZ uses a pure .NET solution and it is written in C#. It can be used to pack .NET executables written in any .NET language.

.NETZ supports both .NET EXE and non-shared DLL files. The compressed applications can be used the in same way as the uncompressed ones, transparently to the end user. .NETZ relies on the open source #ZipLib compression library for .NET to compress the executable data.

The technique .NETZ uses does not work for .NET Compact Framework.

----------------------

压缩过程分析:

1. 将命令行参数中的EXE、DLL文件压缩,并写入资源文件 app.resource。
2. 载入 starter.resources 中的data资源,获取start模版,并做一些替换。该模版是一个cs源文件,主要用来构造压缩后程序的starter。
3. 使用CodeDom创建目标程序(编译时会根据目标程序类型来编译对应的Console或Winexe格式文件)。

(.NETZ 提供源码,你可自行分析细节。)

运行时解压缩过程分析:

1. starter会从资源中载入主 exe 文件数据,解压缩后构造成Assembly对象。
2. 利用反射技术调用该Assembly.EntryPoint方法执行目标程序集。(Assembly.EntryPoint 就是目标程序集的 static Main() 入口方法。)
3. 为正确释放执行DLL,starter增加了一个AppDomain.CurrentDomain.AssemblyResolve事件方法,当目标程序集找不到引用的DLL时会触发该事件,从而让starter有机会从资源文件释放DLL,并创建相应的DLL Assembly。达到整个目标程序的正确执行的目的。

当然.NETZ在细节上处理得很好,创建的压缩程序集可以包含Version和Icon等信息,仔细分析.NetZ对于了解CodeDom、AppDomain、Assembly等知识是很有帮助的。

---------------------------------------------------------------------

以下,我们编写一个例子来印证我们的分析。

创建一个Console程序,该程序调用另一个类库中的方法。

Console test.exe

using System;

namespace Example
{
  class Program
  {
    static void Main()
    {
      new Class1().Test();
      Console.WriteLine("Press Enter key to exit...");
      Console.ReadLine();
    }
  }
}

Library Test.dll

using System;

namespace Example
{
  public class Class1
  {
    public void Test()
    {
      Console.WriteLine(DateTime.Now);
    }
  }
}

编译这两个Project,并确保正确执行。
接下来,我们编写Starter。创建一个新的Console Project,将上面编译的test.exe和test.dll拷贝到该项目目录,设置为嵌入式资源。
修改Starter代码如下:

using System;
using System.Resources;
using System.Reflection;
using System.IO;

namespace MyNamespace
{
  public class Starter
  {
    [STAThread]
    static void Main(string[] args) 
    {
      AppDomain.CurrentDomain.AssemblyResolve += new ResolveEventHandler(CurrentDomain_AssemblyResolve);

Assembly asm = GetAssembly("MyNamespace.Test.exe");
      MethodInfo info = asm.EntryPoint;
      ParameterInfo[] parameters = info.GetParameters();
      if ((parameters != null) && (parameters.Length > 0))
        info.Invoke(null, (object[])args);
      else
        info.Invoke(null, null);
      
    }

private static Assembly GetAssembly(string resName)
    {
      Stream stream = Assembly.GetExecutingAssembly().GetManifestResourceStream(resName);
      byte[] bs = new byte[stream.Length];
      stream.Read(bs, 0, (int)stream.Length);
      Assembly asm = Assembly.Load(bs);

return asm;
    }

private static Assembly CurrentDomain_AssemblyResolve(object sender, ResolveEventArgs args)
    {
      return GetAssembly("MyNamespace.Test.dll");
    }
  }
}

编译执行,印证了我们的分析正确。

.NETZ 原理分析 .NETZ - .NET Executables Compressor .NETZ compresses the Microsoft .NET Framework execu相关推荐

  1. bmp/gif/jpg图象最底层原理分析

    bmp/gif/jpg图象最底层原理分析(1)---- JPG 转载自:http://www.cnblogs.com/glaivelee/archive/2011/10/10/2205151.html ...

  2. RPC 实战与核心原理分析

    RPC 实战与核心原理分析 RPCX是一个分布式的Go语言的 RPC 框架,支持Zookepper.etcd.consul多种服务发现方式,多种服务路由方式, 例子 服务端 package maini ...

  3. android中so文件格式详解,[原创]一 Android ELF系列:ELF文件格式简析到linker的链接so文件原理分析...

    Android ELF系列:ELF文件格式简析和linker的链接so文件原理分析 Android ELF系列:实现一个so文件加载器 Android ELF系列:手写一个so文件(包含两个导出函数) ...

  4. java signature 性能_Java常见bean mapper的性能及原理分析

    背景 在分层的代码架构中,层与层之间的对象避免不了要做很多转换.赋值等操作,这些操作重复且繁琐,于是乎催生出很多工具来优雅,高效地完成这个操作,有BeanUtils.BeanCopier.Dozer. ...

  5. Select函数实现原理分析

    转载自 http://blog.chinaunix.net/uid-20643761-id-1594860.html select需要驱动程序的支持,驱动程序实现fops内的poll函数.select ...

  6. spring ioc原理分析

    spring ioc原理分析 spring ioc 的概念 简单工厂方法 spirng ioc实现原理 spring ioc的概念 ioc: 控制反转 将对象的创建由spring管理.比如,我们以前用 ...

  7. 一次 SQL 查询优化原理分析(900W+ 数据,从 17s 到 300ms)

    点击上方"方志朋",选择"设为星标" 回复"666"获取新整理的面试文章 来源:Muscleape jianshu.com/p/0768eb ...

  8. 原理分析_变色近视眼镜原理分析

    随着眼镜的发展,眼镜的外型变得越来越好看,并且眼镜的颜色也变得多姿多彩,让佩戴眼镜的你变得越来越时尚.变色近视眼镜就是由此产生的新型眼镜.变色镜可以随着阳光的强弱变换不同的色彩. 变色眼镜的原理分析 ...

  9. jieba分词_从语言模型原理分析如何jieba更细粒度的分词

    jieba分词是作中文分词常用的一种工具,之前也记录过源码及原理学习.但有的时候发现分词的结果并不是自己最想要的.比如分词"重庆邮电大学",使用精确模式+HMM分词结果是[&quo ...

  10. EJB调用原理分析 (飞茂EJB)

    EJB调用原理分析 EJB调用原理分析 作者:robbin (MSN:robbin_fan AT hotmail DOT com) 版权声明:本文严禁转载,如有转载请求,请和作者联系 一个远程对象至少 ...

最新文章

  1. Linux中errno使用
  2. 【工具】git笔记(一)
  3. 同一台服务器,mysql登录不了指定端口的问题
  4. 1月26日学习内容整理:reverse函数补充,modelform对象补充,form表单参数补充
  5. flexbox 伸缩布局
  6. 固特异发布人工智能球形轮胎:自动变形、自我修复、超级灵活
  7. linux 安装 maven 、解决:bash: mvn: command not found
  8. 【80万年薪】2019 互联网校招薪酬曝光,看你能拿到多少钱!
  9. 华为P50系列旗舰恐延期至5月发布:首发预装鸿蒙系统
  10. 多种方式创建 Entity Framework Core 上下文
  11. dagger2 注入_Android依赖注入– Dagger 2
  12. Django_3_路由
  13. JAVA 发送邮件功能
  14. Babelua 调试
  15. 推荐3个免费开源的加密软件,知乎高赞
  16. JSP乱码(Tomcat和Weblogic)
  17. angular封装七牛云图片上传,解决同一页面多个上传按钮分别上传
  18. 以后咱家客厅就得装修成这样!
  19. 微信小程序实现城市搜索功能(付源码)
  20. wps中vbe6ext.olb不能被加载问题(附WPS2019宏下载)

热门文章

  1. 备战数学建模23-数据包络分析
  2. in作为介词的用法_介词in的用法
  3. 万年历包括对应节日c语言,C语言 程序设 节日查询和任务提醒系统-万年历.doc
  4. 安科瑞无线测温装置,多点温度在线测温装置
  5. Ubuntu实用安装
  6. 《数据库系统工程师》备考指南
  7. Oracle 数据库认证考试
  8. 论文-Estimation–Action–Reflection: Towards Deep Interaction Between Conversational and Recommender Sys
  9. 参考文献中英文人名_英文人名的缩写和参考文献写法
  10. win 10简繁体切换快捷键