关闭RTTI反射机制,减小Delphi2010程序的尺寸

自从Delphi2010增强了RTTI反射机制后,编译出来的程序变得更大了,这是因为默认情况下 Delphi2010 给所有类都加上了RTTI信息(呵呵,不管你用不用它,好像实用价值确实不高,至少目前我不会去用的)。虽说对程序的运行速度影响不大,但会增加安装程序的大小,这也是我们不愿看到的。有没有办法禁用RTTI信息,从而减小编译后程序的大小呢?,从文档中我们找到了方法。

一、在工程中用编译指令禁用RTTI

禁用的方法很简单,就是要在工程(dpr文件中。Delphi2010下项目文件是dproj文件,但dpr文件仍然是默认的编写代码的项目文件)的Uses语句前添加下面的定义就可以了:

{ Reduce EXE size by disabling as much of RTTI as possible (delphi 2009/2010) }

{$IF CompilerVersion >= 21.0}

{$WEAKLINKRTTI ON}

{$RTTI EXPLICIT METHODS([]) PROPERTIES([]) FIELDS([])}

{$IFEND}

OK,这样重新编译后你会发现,确实把EXE文件大小减小了,但这还不够,请继续往下看。

二、重建无RTTI信息的VCL/RTL

下面我们进行关键的操作,因为VCL和RTL单元还是带RTTI信息的,我们要把它们的RTTI信息去掉。打开delphi2010新建一个工程,并保存,这里我们为方便讨论,把它保存到c:/nortti目录,在它下面建一子目录delphi2010,完成后目录如下:c:/nortti/delphi2010。

在DPR的uses段中添加所有使用到的VCL/RTL单元,呵呵,这样可能会很乱,所以我把所有单元名放到一个包含文件中去了(.INC文件),引用一下就可以了(注意,这里是所有单元名,真正使用时你只需保留用到的单元名),然后单击project菜单中的options项,编辑Unit output directory项的值为 c:/nortti/delphi2010。编译该项目,如果有错误提示,就删除那些单元引用。(注:当JPEG单元重建时你需要拷贝Source/Win32/vcl/Imaging/JPGImage/obj目录下的文件到你项目的目录),编译完成后关闭项目。

提示:可以用下面这个批处理文件产生上面说的单元列表

@echo off

del unitlist.inc

dir /b "C:/Program Files/Embarcadero/RAD Studio/7.0/source/Win32/vcl/*.pas" >> unitlist.inc

dir /b "C:/Program Files/Embarcadero/RAD Studio/7.0/source/Win32/rtl/win/*.pas" >> unitlist.inc

dir /b "C:/Program Files/Embarcadero/RAD Studio/7.0/source/Win32/rtl/common/*.pas" >> unitlist.inc

rem Manually add some system units (we cannot add the entire dir or problems crop up)

echo SysUtils.pas >> unitlist.inc

echo Types.pas >> unitlist.inc

echo Variants.pas >> unitlist.inc

echo VarUtils.pas >> unitlist.inc

然后打开生成的unitlist.in文件,查找并替换所有的?.pas?为?,?。

呵呵,说了这么多,大家有点晕吧,还好,作者提供了一个项目,http://www.zipplet.co.uk/getfile.php/rttidisable.zip,大家下载下来后,修改一下就可以直接用,记得要修改输出目录哟!

三、在工程中使用新生成的单元

打开delphi2010,修改全局单元查找路径,因为编译器总是按顺序查找单元,我们修改后让它去使用我们重建的单元。

Tool菜单 -> Options 菜单, 浏览 Environment Options -> Delphi Options -> Library - Win32。在Library path最前面添加我们重建单元的完整路径。

这样做后,新建工程就会自动使用我们重建的无RTTI的单元了。最后别忘了在DPR工程中使用编译指令禁用RTTI哟!

各位可以自己比较一下编译后的文件大小,还是很明显的,另外大家还可以用upx、aspack压缩一下,那样EXE就会更小了。

 

本文来自Delphi园地,转载请标明出处:http://www.delphifans.com/infoView/Article_6493.html

时间: 2024-09-20 21:01:34

关闭RTTI反射机制,减小Delphi2010程序的尺寸的相关文章

关于Record类型RTTI反射的用途和方法

  问题的引入: 准备做一个多国语言软件,发现信息变量(都是字符串)数量庞大,如果简单的通过 "变量=readstring"从ini文件中获取的话,几百个变量就是几百行,这个工作量非常大,而且也不易维护.如果使用RTTI反射机制,未来变量变化时,赋值程序不用修改,只需修改变量结构,这是一劳永逸的做法. 注意:本例程使用delphi2010,delphi老版本不支持record类型的反射.如果使用老版本,需把record类型换为自定义类,这里只演示使用Record类型的方法. 办法如下:

Java反射机制剖析:定义和API

1.什么是Java反射机制 Java的反射机制是在程序运行时,能够完全知道任何一个类,及其它的属性和方法,并且能够任意调用一个对象的属性和方法.这种运行时的动态获取就是Java的反射机制.其实这也是Java是动态语言的一个象征. 用一句话来概括反射就是加载一个运行时才知道的类以及它的完整内部结构. 2.为什么要有Java反射机制 我们为什么要用Java的反射机制呢? 我认为有两种: 第一种:反射的目的就是为了扩展未知的应用.比如你写了一个程序,这个程序定义了一些接口,只要实现了这些接口的dll都

Java中的类反射机制

一.反射的概念 :反射的概念是由Smith在1982年首次提出的,主要是指程序可以访问.检测和修改它本身状态或行为的一种能力.这一概念的提出很快引发了计算机科学领域关于应用反射性的研究.它首先被程序语言的设计领域所采用,并在Lisp和面向对象方面取得了成绩.其中LEAD/LEAD++ .OpenC++ .MetaXa和OpenJava等就是基于反射机制的语言.最近,反射机制也被应用到了视窗系统.操作系统和文件系统中. 反射本身并不是一个新概念,它可能会使我们联想到光学中的反射概念,尽管计算机科学

简述.Net 中的反射机制

概述反射 通过反射可以提供类型信息,从而使得我们开发人员在运行时能够利用这些信息构造和使用对象. 反射机制允许程序在执行过程中动态地添加各种功能. 运行时类型标识 运行时类型标识(RTTI),可以在程序执行期间判定对象类型.例如使用它能够确切地知道基类引用指向了什么类型对象. 运行时类型标识,能预先测试某个强制类型转换操作,能否成功,从而避免无效的强制类型转换异常. 在c#中有三个支持RTTI的关键字:is . as  .typeof. 下面依次介绍他们 is运算符: 通过is运算符,能够判断对

关于Java反射机制的几个问题

如何在运行时确定对象类型 运行时类型识别(Run-time Type Identification, RTTI)主要有两种方式, 一种是在编译时和运行时已经知道了所有的类型,另外一种是反射机制. 类型信息在运行时是如何表示的,是由Class对象完成的,它包含了与类有关的信息. 类是程序的重要组成部分,每个类都有一个Class对象,每当编写并编译了一个新类就会产生一个Class对象,它被保存在一个同名的.class文件中. 在运行时,当我们想生成这个类的对象时,运行这个程序的Java虚拟机(JVM

java反射机制剖析(一)—简介

    由之前动态代理的学习再次接触到反射这个知识点,第二次接触了所以做了一些稍微深入的了解.那么,对于反射这部分的内容我打算分三篇博客来总结.本篇博客先对反射做一个大概的了解,包括反射有关的RTTI.定义的理解以及涉及到的其他知识的简介. 回顾     java之前我接触反射这个知识,是在大话设计中的抽象工厂模式里,通过反射+配置文件来优化抽象工厂提高其应对需求变更的灵活性.当时对于反射的认知仅仅是它是一种技术,一种实例化对象的技术,一种实例化对象不依赖于写死的代码的技术.简单的说就是,它是一

Java反射机制的学习

Java反射机制是Java语言被视为准动态语言的关键性质.Java反射机制的核心就是允许在运行时通过Java Reflection APIs来取得已知名字的class类的相关信息,动态地生成此类,并调用其方法或修改其域(甚至是本身声明为private的域或方法). 也许你使用Java已经很长时间了,可是几乎不会用到Java反射机制.你会嗤之以鼻地告诉我,Java反射机制没啥用.或许在J2EE.J2SE等平台,Java反射机制没啥用(具体我也不了解,不多做评论),但是在Android应用开发中,该

java反射机制的实现原理

java反射机制的实现原理反射机制:所谓的反射机制就是java语言在运行时拥有一项自观的能力.通过这种能力可以彻底的了解自身的情况为下一步的动作做准备.下面具体介绍一下java的反射机制.这里你将颠覆原来对java的理解. Java的反射机制的实现要借助于4个类:class,Constructor,Field,Method:其中class代表的时类对象,Constructor-类的构造器对象,Field-类的属性对象,Method-类的方法对象.通过这四个对象我们可以粗略的看到一个类的各个组 成

AJAX的JavaScript的反射机制

ajax|javascript 什么是反射机制 反射机制指的是程序在运行时能够获取自身的信息.例如一个对象能够在运行时知道自己有哪些方法和属性. 在JavaScript中利用for(-in-)语句实现反射 在JavaScript中有一个很方便的语法来实现反射,即for(-in-)语句,其语法如下: for(var p in obj){      //语句} 这里var p表示声明的一个变量,用以存储对象obj的属性(方法)名称,有了对象名和属性(方法)名,就可以使用方括号语法来调用一个对象的属性