程序集中的类顺序

时间:2012-06-26 18:28:59

标签: c# class compiler-construction .net-assembly

什么决定了程序集中类的顺序?

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


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

订单似乎是由编译器决定的一种奇怪的方式。

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

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


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

3 个答案:

答案 0 :(得分:3)

我要在这里坚持一下,并说这是一个实现细节,可能由任何特定的编译器决定。

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

我给你留下Eric's blog的以下引语:

  

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

     

没有

答案 1 :(得分:2)

  

什么决定了程序集中类的顺序?

编译器。

  

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

直接写你自己的IL。


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

答案 2 :(得分:1)

由于多年来我一直没有这方面的工作,所以我尽力回忆起这一点,但是大部分内容都是我从Serge Lindin阅读“Expert .NET 2.0 Il Assembler”并编写自己的反汇编程序时所记得的。 。所以FWIW:

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