Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/flash/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 为什么可变长度不增加部件的尺寸?_C#_.net Assembly - Fatal编程技术网

C# 为什么可变长度不增加部件的尺寸?

C# 为什么可变长度不增加部件的尺寸?,c#,.net-assembly,C#,.net Assembly,我已经编写了一个程序,它不做任何有用的事情,这是静态的void Mainstring[]args: 它是在默认的控制台应用程序类中编写的, 对就是这样。 确切地说是12.800字节 然后我将变量a转换成了一个奇怪的、可疑的、超巨大的超IgA变量,而不是真正意义上的读写。 我编译了它,大小大约是12.800字节 为什么呢?如果我反编译它,我可以看到长文件名。我还看到,调用变量根本不会增加大小,因为它与某种数字相关联,如果它是a,则该数字是相同的。然而,我认为: .locals init (

我已经编写了一个程序,它不做任何有用的事情,这是静态的void Mainstring[]args:

它是在默认的控制台应用程序类中编写的, 对就是这样。 确切地说是12.800字节

然后我将变量a转换成了一个奇怪的、可疑的、超巨大的超IgA变量,而不是真正意义上的读写。 我编译了它,大小大约是12.800字节

为什么呢?如果我反编译它,我可以看到长文件名。我还看到,调用变量根本不会增加大小,因为它与某种数字相关联,如果它是a,则该数字是相同的。然而,我认为:

.locals init
(
    [0] int32 someSortOfRidiculousSuspiciousWeirdAndSuperSuperEnormousMegaHyperGigaVariableNameThatsNotReallyFunToReadOrWrite
)
当它再次被num1not a替换时,它会大大减小,正如您所想,但我看不到它在文件大小的任何地方

为什么呢

另外:我认为属性窗口清除:右键单击windows->assemlby属性中的文件是不正确的。当我添加一些Console.WriteLineTest时,它的大小也不会增加

编辑: 人们建议将我的变量名设置为大于512字节。
如果变量名超过512个字符512个字节,则编译器错误标识符太长

二进制文件往往是整个磁盘块大小。12800正好是512*25


请尝试添加至少512个字符的数据,以确保您需要另一个数据块。

二进制文件往往是整个磁盘块大小。12800正好是512*25


请尝试添加至少512个字符的数据,以确保您需要另一个块。

这受PE32文件的内部结构、Windows EXE和DLL文件的文件格式的影响。此文件中的节具有最小大小。实际上由项目中的设置控制。项目+属性、生成选项卡、高级按钮、文件对齐设置。任何C项目都将此设置为512字节,这是PE32文件允许的最小值

进一步的细节是局部变量发生了什么。该变量的名称实际上未存储在.NET程序集中。您使用的反编译器从PDB文件中检索到它。否则,像ILSpy和Reflector这样的反编译器需要为没有PDB的程序集(如.NET Framework程序集)上的局部变量生成假名称的原因就是


因此,无论为变量选择什么名称,程序集永远不会变大。只有PDB文件。您所做的更改需要添加至少511字节的MSIL和/或元数据,以可靠地增加EXE/DLL文件的大小。

这受PE32文件的内部结构、Windows EXE和DLL文件的文件格式的影响。此文件中的节具有最小大小。实际上由项目中的设置控制。项目+属性、生成选项卡、高级按钮、文件对齐设置。任何C项目都将此设置为512字节,这是PE32文件允许的最小值

进一步的细节是局部变量发生了什么。该变量的名称实际上未存储在.NET程序集中。您使用的反编译器从PDB文件中检索到它。否则,像ILSpy和Reflector这样的反编译器需要为没有PDB的程序集(如.NET Framework程序集)上的局部变量生成假名称的原因就是


因此,无论为变量选择什么名称,程序集永远不会变大。只有PDB文件。您所做的更改需要添加至少511字节的MSIL和/或元数据,以可靠地增加EXE/DLL文件的大小。

显然,变量名存储在程序集中的一个块中,该块的最小大小大于较长名称所需的大小。@HansPassant Ohhh这就解释了一切!显然,变量名存储在程序集中的块中,其最小大小大于较长名称所需的大小。@HansPassant Ohhh这就解释了一切!您应该将answer-ish.Variable名称存储在PDB中,而不是存储在程序集中。大多数磁盘倾向于使用4k分配。您指的是文件对齐变量名存储在PDB中,而不是程序集中。大多数磁盘倾向于使用4k分配。您指的是文件对齐方式,因此在程序集中名称只是一个数字?是的。与ldloc.0加载该变量一样,0只需要MSIL中的一个字节。+1。若要查看程序集大小的更改,您需要更改程序集元数据的一些名称,如方法/类名,您仍然需要进行足够的更改以克服节大小粒度。因此,在程序集中,名称只是一个数字?是的。与ldloc.0加载该变量一样,0只需要MSIL中的一个字节。+1。要查看程序集大小的变化,您需要更改程序集元数据的一些名称,如方法/类名,您仍然需要进行足够的更改以克服节大小粒度。
.locals init
(
    [0] int32 someSortOfRidiculousSuspiciousWeirdAndSuperSuperEnormousMegaHyperGigaVariableNameThatsNotReallyFunToReadOrWrite
)