是否可以确定.NET程序集是事后用哪种语言编写的? 这是一种寻找C++和CLI和托管C++程序集的方法,以便测试所有的类,以确保所有继承的方法都被重新实现。我想将此添加为构建过程步骤,以确保它不再发生

是否可以确定.NET程序集是事后用哪种语言编写的? 这是一种寻找C++和CLI和托管C++程序集的方法,以便测试所有的类,以确保所有继承的方法都被重新实现。我想将此添加为构建过程步骤,以确保它不再发生,.net,clr,c++-cli,managed,managed-c++,.net,Clr,C++ Cli,Managed,Managed C++,思考这个问题也让我有点好奇,因为能够确定使用的任何.NET语言都会很有趣。因此,我进一步比较了所有.NET语言的程序集。到目前为止,我通过我编写的一个小程序发现了这一点,该程序通过反射比较来自任何一组.NET程序集的类型和属性数据: C#-具有AssemblyConfigurationAttribute,具有GuidAttribute VB-有许多额外的“我的”类型(例如MyApplication、MySettings),有GuidAttibute F#-有一个FSharpInterfaceD

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

  • C#-具有AssemblyConfigurationAttribute,具有GuidAttribute
  • VB-有许多额外的“我的”类型(例如MyApplication、MySettings),有GuidAttibute
  • F#-有一个FSharpInterfaceDataVersionAttribute,它还指定了所用编译器的版本
  • C++(除了/clr:safe以外的所有类型)-有一堆额外的类型(FrameInfo,type_info)
  • C++/clr:safe-似乎没有独特的反射特性
按以下顺序进行分析可能是合理的:

  • 如果它有FSharpInterfaceDataVersionAttribute,那么它就是F
  • < LI>如果C++中有大量的额外类型,则为C++。
  • 如果它有“My*”类型,那么它就是VB
  • 如果它具有AssemblyConfigurationAttribute或GuidAttribute,则为C
  • <> LI>很可能是C++ +CLR:Sudio
    然而,由于这是一个可怕的黑客攻击,我想在这里签入以确保没有其他可用选项。

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


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

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

    有趣的问题,但为什么要使用拉丁语?回顾性地说会更容易理解。这里不是每个人都是以英语为母语的人。@danio:因为拉丁语很棒?