我编写的程序没有做任何有用的事情,这是static void Main(string[] args)
:
int a = 0;
a++; // ... for another 2048 times
// not in a for loop or something
// just this a++ 2048 times
它是在默认的控制台应用程序类中编写的, 是。它就是这样做的。 它实际上是12.800字节。
然后我将变量a
改为someSortOfRidiculousSuspiciousWeirdAndSuperSuperEnormousMegaHyperGigaVariableNameThatsNotReallyFunToReadOrWrite
。
我编译了它,大小非常相似(12.800字节)。
为什么?如果我反编译它,我可以看到长文件名。我还看到调用变量根本不会增加大小,因为它与某种数字相关联,如果它是a
则会相同。但是我看到了这个:
.locals init
(
[0] int32 someSortOfRidiculousSuspiciousWeirdAndSuperSuperEnormousMegaHyperGigaVariableNameThatsNotReallyFunToReadOrWrite
)
当它被num1
(而不是a
再次替换时,这会明显变小,正如您所想的那样)但我无法在任何地方看到它文件大小!
为什么?
另外:我认为assemlby的属性窗口(清除:右键单击windows中的文件 - >属性)是不对的。当我添加一些Console.WriteLine("Test")
时,也不会增加大小。
编辑: 人们建议我的变量名称> 512字节。 如果我的变量名称达到> 512个字符(512字节),我得到编译器错误"标识符太长"
答案 0 :(得分:6)
这受到PE32文件的内部结构,Windows EXE和DLL文件的文件格式的影响。此文件中的部分具有最小大小。实际上由项目中的设置控制。项目+属性,构建选项卡,高级按钮,文件对齐设置。任何C#项目都将此设置为512字节,这是PE32文件允许的最小值。
进一步的细节是局部变量会发生什么。事实上,该变量的名称并未存储在.NET程序集中。您使用的反编译器从PDB文件中检索它。否则,像ILSpy和Reflector这样的反编译器需要为没有PDB的程序集上的局部变量生成伪名称,例如.NET Framework程序集。
所以无论你为变量选择什么名称,程序集都不会变大。只是PDB文件。您所做的更改需要添加至少511个字节的MSIL和/或元数据,以可靠地增加EXE / DLL文件的大小。
答案 1 :(得分:0)
二进制文件往往是整个磁盘块大小。 12800恰好是512 * 25。
尝试添加至少512个字符的数据,以确保您需要另一个块。