【问题标题】:Order of Classes within an Assembly程序集中的类顺序
【发布时间】:2012-06-26 18:28:58
【问题描述】:

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

还有..有办法改变吗?


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

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

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

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


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

【问题讨论】:

  • 您是否正在尝试解决或解决某些问题,或者这只是出于好奇。即有什么关系?
  • 巧合的是,我相信@EricLippert 刚刚写了a blog post that's related to this
  • 你为什么要这样做?
  • 顺序根本不重要,因为不能保证顺序。如果订单很重要,那么您的第三方代码已损坏。

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


【解决方案1】:

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

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

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

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

没有。

【讨论】:

  • 谢谢,Eric 的博客条目很有趣。不过,它并没有解释太多。另外,如果您查看评论,我会说大约四分之一的人至少有一次遇到同样的问题。 :) 有些人实际上必须使用特定的编译器/语言来满足该要求(不,不是我!)。哦,而且.. 我真的不认为编译是不确定的。我的意思是.. 可能会涉及随机部分的优化算法,但是.. 嗯.. 我宁愿怀疑情况是否如此。他还只是认为输出不同主要是因为生成的 GUID 等。
  • 编译器可以是非确定性的。例如在一个类型依赖解析逻辑循环之后,编译器可以使用多个线程来编译程序集中的类型(或类)。当线程完成编译类型时,编译器可以在元数据中添加该类型的条目。由于线程调度是不确定的,因此元数据条目的顺序以及程序集中类的顺序变得不确定。我并不是说这就是事情的实际工作方式,但很容易看出编译器很容易是不确定的。
【解决方案2】:

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

编译器。

还有..有办法改变吗?

直接编写自己的 IL。


话虽如此,程序集中类型的顺序并不重要。您可以使用这些类型而不考虑它们的顺序。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-08-23
    • 1970-01-01
    • 1970-01-01
    • 2013-01-07
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多