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

Ric*_*ich 10 .net clr managed-c++ c++-cli managed

这开始是一种查找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,则为F#
  2. 它是C++,如果它有我发现的大量额外类型中的任何一种.
  3. 它是VB,如果它有"我的*"类型.
  4. 它是C#,如果它有AssemblyConfigurationAttribute或GuidAttribute
  5. 它可能是C++/clr:安全

然而,由于这是一个可怕的黑客,我想在这里检查,以确保没有其他选项可用.

m-s*_*arp 2

当.NET语言被编译时,你得到的只是IL。我不知道确定哪种特定语言创建程序集的标准方法。您可以采用现有程序集并将其 ildasm(反汇编)到 IL 中,然后将其 ilasm(组装)回几乎相同的程序集。

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