10

这最初是作为一种查找 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. 如果它具有“My*”类型,则它是 VB。
  4. 如果它具有 AssemblyConfigurationAttribute 或 GuidAttribute,则为 C#
  5. 很可能是 C++ /clr:Safe

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

4

2 回答 2

3

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

于 2009-02-24T06:53:52.773 回答
2

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

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

于 2009-02-24T06:27:54.240 回答