Можно ли определить, на каком языке была написана ассамблея .NET ex post facto?

Это началось как способ найти сборки C'/CLI и управляемых C', чтобы все классы внутреннего для них могли быть протестированы, чтобы гарантировать, что все унаследованные методы были вновь реализованы. Я хотел бы добавить это в качестве шага процесса сборки, чтобы гарантировать, что это никогда не повторится.

Думая об этой проблеме также сделал меня немного любопытно, как было бы интересно иметь возможность определить любой язык .NET используется. Из-за этого я пошел немного дальше и сравнил сборки со всех языков .NET. До сих пор вот что я нашел через небольшую программу, которую я написал, который сравнивает тип и атрибут данных из любого набора собраний .NET через отражение:

  • C - Имеет СборкаСопрофияОстрицияАтрат, Имеет GuidAttribute
  • VB - имеет много дополнительных "Мой" тип (на данный что MyApplication, MySettings), Имеет GuidAttibute
  • F - имеет FSharpInterfaceDataAttribute, который также определяет версию используемого компилятора.
  • C - (все, кроме /clr: safe) - имеет кучу дополнительных типов (FrameInfo, type_info)
  • C q /clr: безопасный - Кажется, не имеют уникальных функций отражения.

Это может быть разумным, чтобы разобрать в этом порядке:

  1. Это F, если он имеет FSharpInterfaceDataAttribute
  2. Это C, если он имеет какой-либо в огромный набор дополнительных типов я нашел.
  3. Это VB, если он имеет "Мои" Типы.
  4. Это C, если он имеет AssemblyConfigurationAttribute или GuidAttribute
  5. Это, вероятно, будет C q /clr:Safe

Однако, как это ужасно рубить, я хотел бы проверить здесь, чтобы убедиться, что не было другого варианта.

Ответ на: "Можно ли определить, на каком языке была написана ассамблея .NET ex post facto?"

Количество ответов:2

Когда язык .NET составлен, все, что вы получаете, это IL. Я не знаю стандартного способа определения того, какой конкретный язык создал сборку. Вы можете взять существующую сборку и ildasm (разобрать) его в IL и их ilasm (сборка) его обратно в практически идентичные сборки.

Эвристика, которую вы используете, является разумным и умным способом определения языка, используемого для создания сборки. Однако имейте в виду, что эти детали могут измениться между компиляторных версий языков.

Проверка ссылок на такие вещи, как VB или F'класс библиотек, как представляется, наименее шаткий способ сделать это, но, как другие упоминают, это эвристический - так же, как нет окончательного способа сказать, какой язык родной двоичный написано в (но вы можете быть почти на 100% уверены в эвристики)