2009-02-23 37 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%肯定)

相關問題