程序集中的类顺序

是什么决定了大会中class级的顺序?

并且……有没有办法改变它?


附加信息:您可以通过自己反思来检查订购,或者您可以使用ILDASM之类的工具,禁用字母排序,然后您也可以获得订单。

顺序似乎是由编译器决定的奇怪方式。

我已经尝试了一些东西……比如重命名类(顺序保持不变),还编辑.csproj文件来改变.cs文件的顺序。

我的主要关注点是VS2008,C#,。net 3.5。


更新:我确实有一个场景,订单很重要(外部程序通过reflection通过我的assembly) – 我需要特殊订单。 除此之外 – 你是完全正确的 – 订单真的不应该紧。

我将在这里强调我的脖子,并说这是一个实现细节 ,可能由任何特定的编译器决定。

由于这是一个实现细节,您不应该或不需要担心。 当然,如果这真的很重要(看不清楚原因),你总能编写自己的IL。

我从Eric的博客中留下以下引用:

编译相同的C#程序两次保证产生相同的二进制输出?

没有。

是什么决定了大会中class级的顺序?

编译器。

并且……有没有办法改变它?

直接写你自己的IL。


话虽这么说,程序集中类型的顺序确实无关紧要。 您可以在不考虑订单的情况下使用这些类型。

由于我多年没有使用它,我试图尽可能地回忆起这一点,但是大部分内容都是我从Serge Lindin阅读“Expert .NET 2.0 Il Assembler”并编写我自己的反汇编程序时所记得的。 所以FWIW:

在托管代码(即Java或.NET)的世界之前,代码和数据的布局更加严格,因为使用了将代码和数据作为原始字节从存储分层到内存中的加载器。 随着托管环境的出现,增加了一个层,可以读取存储,然后通过作为带有Meta数据的数据图将其视为要映射到内存的数据。 因此,Meta数据可用于将代码和数据布局到存储器中。 快速扫描书中的答案,我能找到的唯一注意点是“ILAsm中的清单声明顺序”。 112.“ILAsm(而不仅仅是ILAsm)中的一般规则是”声明,然后参考。“”因此,一些Meta数据有关于排序的规则,但由于Meta数据保存了对存储中实际代码和数据的引用,只有元数据具有特定的顺序,我们用于具有特定顺序的代码和数据现在可以是无序的。 FWIW。 如果几年前你问过我,我可能会为你写一整篇论文。