2009-02-23 31 views
10

这开始是为了找到C++/CLI和托管C++程序集,以便可以测试它们内部的所有类以确保所有继承的方法都被重新实现。我想将此添加为构建流程步骤,以确保它不再发生。是否有可能确定.NET程序集事后写入哪种语言?

关于这个问题的思考也让我有点好奇,因为能够确定使用的任何.NET语言会很有趣。正因为如此,我进一步了解了所有.NET语言的程序集。到目前为止,这里是我通过一个小程序,我写了比较类型和通过反射属性从任何一组.NET程序集的数据发现:

  • C# - 有AssemblyConfigurationAttribute,拥有GuidAttribute
  • VB - 有许多额外的“我的”类型(例如MyApplication,MySettings),有GuidAttibute
  • F# - 有一个FSharpInterfaceDataVersionAttribute,它也指定了所用编译器的版本。
  • C++(all but/clr:safe) - 有一堆额外的类型(FrameInfo,type_info)
  • C++/clr:safe - 似乎没有独特的反射功能。

它可能是合理的顺序来解析:

  1. 这是F#它是否具有FSharpInterfaceDataVersionAttribute
  2. 这是C++,如果有任何的庞大集合额外的类型,我发现的。
  3. 这是VB如果它有“我的*”类型。
  4. 这是C#如果它有AssemblyConfigurationAttribute或GuidAttribute
  5. 这很可能是C++/CLR:安全

然而,由于这是一个可怕的黑客,我想在这里检查,以确保有WASN另一个选项可用。

+0

有趣的问题,但为什么使用拉丁?回顾性会更容易理解。并不是每个人都是以英语为母语的人。 – danio 2009-02-25 09:16:19

回答

2

编译.NET语言时,所得到的只是IL。我不知道确定哪种特定语言创建程序集的标准方法。你可以把现有的装配和ildasm(拆卸)成IL,然后把它们组装成几乎完全相同的装配。

您使用的启发式是识别用于创建程序集的语言的合理而巧妙的方式。但是,请记住,这些细节可能会在这些语言的编译器版本之间发生变化。

3

检查VB或F#类库等参考文献似乎是最不稳定的方法,但正如其他人提到的那样,这是一种启发式 - 就像没有确切的方法来告诉哪种语言本地二进制文件是写在(但你可以通过启发式几乎100%肯定)

相关问题