是否有可能确定事先将.NET程序集用于哪种语言?

时间:2009-02-23 22:22:14

标签: .net clr c++-cli managed managed-c++

这开始是一种查找C ++ / CLI和托管C ++程序集的方法,以便可以测试它们内部的所有类,以确保重新实现所有继承的方法。我想将此添加为构建过程步骤,以确保它永远不会再发生。

考虑这个问题也让我有点好奇,因为能够确定使用的任何.NET语言会很有趣。因此,我进一步比较了所有.NET语言的程序集。到目前为止,这是我通过我编写的一个小程序找到的,它通过反射来比较来自任何.NET程序集的类型和属性数据:

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

按此顺序解析可能是合理的:

  1. 如果它具有FSharpInterfaceDataVersionAttribute
  2. ,则为F#
  3. 它是C ++,如果它有我发现的大量额外类型中的任何一种。
  4. 如果它具有“我的*”类型,则为VB。
  5. 如果它具有AssemblyConfigurationAttribute或GuidAttribute
  6. ,则为C#
  7. 可能是C ++ / clr:安全
  8. 然而,由于这是一个可怕的黑客攻击,我想在这里办理登机手续,以确保没有其他选择。

2 个答案:

答案 0 :(得分:3)

检查VB或F#类库之类的引用似乎是最不稳定的方法,但正如其他人所提到的,它是一种启发式方法 - 就像没有明确的方法来判断哪种语言是本地二进制文件在(但你可以通过启发式几乎100%确定)

答案 1 :(得分:2)

编译.NET语言时,你得到的就是IL。我不知道确定哪种特定语言创建程序集的标准方法。您可以将现有的组件和ildasm(反汇编)转换为IL,然后将它组装(组装)成一个几乎相同的组件。

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