繁体   English   中英

程序集中的类顺序

[英]Order of Classes within an Assembly

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

而且..有办法改变它吗?


附加信息:您可以自己通过反射检查排序,也可以使用ILDASM之类的工具,禁用字母排序,然后您也将获得顺序。

顺序似乎是由编译器以一种奇怪的方式确定的。

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

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


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

我要在这里说我的意思,这是一个实现细节 ,很可能由任何特定的编译器决定。

由于这是一个实现细节,因此您不必担心或不必担心。 当然,如果这真的很重要(看不明白为什么),则可以随时编写自己的IL。

我为您提供了Eric博客中的以下引文:

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

没有。

什么决定装配中的类顺序?

编译器。

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

直接编写自己的IL。


话虽如此,程序集内类型的顺序实际上并不重要。 您可以使用类型而不必考虑其顺序。

由于多年来我一直没有使用此工具,所以我将尽我最大的努力来回忆起这个问题,但是,通过阅读Serge Lindin的“ Expert .NET 2.0 Il Assembler”并编写自己的反汇编程序,我可以回想起其中的大部分内容。 所以FWIW:

在使用托管代码(例如Java或.NET)之前,由于使用了将代码和数据作为原始字节从存储权直接存储到内存的加载程序,因此代码和数据的布局更加严格。 随着托管环境的到来,增加了一个层,该层可以读取存储,然后通过带有元数据的数据图将其视为不映射到内存的数据。 这样,元数据可用于将代码和数据布局到内存中。 快速搜索本书中的答案,我唯一能发现的要点是在“ ILAsm中的清单声明顺序”页下。 112.“ ILAsm中的通用规则(不仅是ILAsm中的通用规则是“先声明,然后引用”。)”因此,某些元数据具有有关排序的规则,但是由于元数据保留了对实际代码和存储数据的引用,只有元数据具有特定顺序,而我们习惯于具有特定顺序的代码和数据现在可以无顺序。 再次FWIW。 如果您几年前问过我,我可能可以为您写整篇论文。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM